Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
c39bb875
Commit
c39bb875
authored
22 years ago
by
Christophe Geuzaine
Browse files
Options
Downloads
Patches
Plain Diff
Many fixes due to rostamian@umbc.edu
parent
475d4a53
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Graphics/gl2ps.cpp
+34
-162
34 additions, 162 deletions
Graphics/gl2ps.cpp
Graphics/gl2ps.h
+6
-11
6 additions, 11 deletions
Graphics/gl2ps.h
with
40 additions
and
173 deletions
Graphics/gl2ps.cpp
+
34
−
162
View file @
c39bb875
...
...
@@ -2,7 +2,7 @@
* GL2PS, an OpenGL to PostScript Printing Library
* Copyright (C) 1999-2002 Christophe Geuzaine
*
* $Id: gl2ps.cpp,v 1.4
3
2002-0
5-25 19:17:45
geuzaine Exp $
* $Id: gl2ps.cpp,v 1.4
4
2002-0
6-04 21:52:26
geuzaine Exp $
*
* E-mail: geuz@geuz.org
* URL: http://www.geuz.org/gl2ps/
...
...
@@ -31,10 +31,10 @@
#include
<time.h>
#include
"gl2ps.h"
/* The
static
gl2ps context. gl2ps is not thread safe (we should
create a
local GL2PScontext during gl2psBeginPage). */
/* The gl2ps context. gl2ps is not thread safe (we should
create a
local GL2PScontext during gl2psBeginPage). */
static
GL2PScontext
*
gl2ps
=
NULL
;
GL2PScontext
*
gl2ps
=
NULL
;
/* Some 'system' utility routines */
...
...
@@ -266,7 +266,8 @@ GLvoid gl2psFreePrimitive(GLvoid *a, GLvoid *b){
q
=
*
(
GL2PSprimitive
**
)
a
;
gl2psFree
(
q
->
verts
);
if
(
q
->
type
==
GL2PS_TEXT
){
if
(
q
->
text
->
str
)
gl2psFree
(
q
->
text
->
str
);
gl2psFree
(
q
->
text
->
str
);
gl2psFree
(
q
->
text
->
fontname
);
gl2psFree
(
q
->
text
);
}
gl2psFree
(
q
);
...
...
@@ -611,141 +612,7 @@ GLvoid gl2psTraverseBspTree(GL2PSbsptree *tree, GL2PSxyz eye, GLfloat epsilon,
}
}
/* The 2D sorting routines (for occlusion culling). These routines do
_not_ work as expected at the moment... */
GLint
gl2psSplit2d
(
GL2PSxyz
a
,
GL2PSxyz
b
,
GL2PSxy
tc
,
GL2PSxy
td
){
GLfloat
line
[
3
],
n
,
d
[
2
];
/*
in back of == >0 == outside polygon
*/
line
[
0
]
=
td
[
1
]
-
tc
[
1
]
;
line
[
1
]
=
tc
[
0
]
-
td
[
0
]
;
n
=
sqrt
(
line
[
0
]
*
line
[
0
]
+
line
[
1
]
*
line
[
1
]);
line
[
0
]
/=
n
;
line
[
1
]
/=
n
;
line
[
2
]
=
-
line
[
0
]
*
tc
[
0
]
-
line
[
1
]
*
tc
[
1
]
;
d
[
0
]
=
line
[
0
]
*
a
[
0
]
+
line
[
1
]
*
a
[
1
]
+
line
[
2
]
;
if
(
b
==
NULL
){
if
(
d
[
0
]
>
GL2PS_EPSILON
)
return
GL2PS_IN_BACK_OF
;
else
if
(
d
[
0
]
<
-
GL2PS_EPSILON
)
return
GL2PS_IN_FRONT_OF
;
else
return
GL2PS_COINCIDENT
;
}
else
{
d
[
1
]
=
line
[
0
]
*
b
[
0
]
+
line
[
1
]
*
b
[
1
]
+
line
[
2
]
;
if
(
d
[
0
]
>
GL2PS_EPSILON
){
if
(
d
[
1
]
<
-
GL2PS_EPSILON
)
return
GL2PS_SPANNING
;
else
return
GL2PS_IN_BACK_OF
;
}
if
(
d
[
0
]
<
-
GL2PS_EPSILON
){
if
(
d
[
1
]
>
GL2PS_EPSILON
)
return
GL2PS_SPANNING
;
else
return
GL2PS_IN_FRONT_OF
;
}
else
{
if
(
d
[
1
]
>
GL2PS_EPSILON
)
return
GL2PS_IN_BACK_OF
;
else
if
(
d
[
1
]
<
-
GL2PS_EPSILON
)
return
GL2PS_IN_FRONT_OF
;
/* else return GL2PS_COINCIDENT; */
else
return
GL2PS_IN_FRONT_OF
;
}
}
}
GLvoid
gl2psSimplify2d
(
GL2PSbsptree2d
*
tree
){
if
(
!
tree
)
return
;
if
(
tree
->
back
){
if
(
tree
->
flag
==
0
)
gl2psSimplify2d
(
tree
->
back
);
}
if
(
tree
->
front
){
gl2psSimplify2d
(
tree
->
front
);
}
}
GLvoid
gl2psReset
(
GL2PSbsptree2d
*
tree
){
if
(
!
tree
)
return
;
tree
->
flag
=
0
;
if
(
tree
->
back
){
gl2psReset
(
tree
->
back
);
}
if
(
tree
->
front
){
gl2psReset
(
tree
->
front
);
}
}
static
GL2PSbsptree2d
*
image
=
NULL
;
GLvoid
gl2psAddInImageTree
(
GL2PSprimitive
*
prim
,
GL2PSxyz
a
,
GL2PSxyz
b
,
GL2PSbsptree2d
**
tree
){
GLint
res
;
if
(
*
tree
==
NULL
){
/* insert the edge, except for lines & points */
if
(
prim
->
numverts
>
2
){
prim
->
depth
=
-
1.
;
(
*
tree
)
=
(
GL2PSbsptree2d
*
)
gl2psMalloc
(
sizeof
(
GL2PSbsptree2d
));
(
*
tree
)
->
a
[
0
]
=
a
[
0
];
(
*
tree
)
->
a
[
1
]
=
a
[
1
];
(
*
tree
)
->
b
[
0
]
=
b
[
0
];
(
*
tree
)
->
b
[
1
]
=
b
[
1
];
(
*
tree
)
->
front
=
NULL
;
(
*
tree
)
->
back
=
NULL
;
(
*
tree
)
->
flag
=
1
;
}
}
else
{
res
=
gl2psSplit2d
(
a
,
b
,
(
*
tree
)
->
a
,
(
*
tree
)
->
b
);
switch
(
res
){
case
GL2PS_IN_BACK_OF
:
gl2psAddInImageTree
(
prim
,
a
,
b
,
&
(
*
tree
)
->
back
);
break
;
case
GL2PS_IN_FRONT_OF
:
if
((
*
tree
)
->
flag
)
gl2psAddInImageTree
(
prim
,
a
,
b
,
&
(
*
tree
)
->
front
);
break
;
case
GL2PS_SPANNING
:
gl2psAddInImageTree
(
prim
,
a
,
b
,
&
(
*
tree
)
->
back
);
if
((
*
tree
)
->
flag
)
gl2psAddInImageTree
(
prim
,
a
,
b
,
&
(
*
tree
)
->
front
);
break
;
case
GL2PS_COINCIDENT
:
(
*
tree
)
->
flag
=
1
;
break
;
}
}
}
static
int
count
=
0
;
GLvoid
gl2psAddInImage
(
void
*
a
,
void
*
b
){
GL2PSprimitive
*
prim
;
GLint
i
;
prim
=
*
(
GL2PSprimitive
**
)
a
;
/* if(prim->numverts == 1)
gl2psAddInImageTree(prim, prim->verts[i].xyz, NULL, &image); */
if
(
prim
->
numverts
<
3
)
return
;
else
{
for
(
i
=
0
;
i
<
prim
->
numverts
;
i
++
){
count
++
;
gl2psAddInImageTree
(
prim
,
prim
->
verts
[
i
].
xyz
,
prim
->
verts
[
gl2psGetIndex
(
i
,
prim
->
numverts
)].
xyz
,
&
image
);
}
}
/* simplify old/new */
gl2psReset
(
image
);
}
/* Boundary contruction */
#define GL2PS_BOUNDARY_OFFSET 0
...
...
@@ -851,8 +718,8 @@ GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts,
prim
->
verts
[
1
].
xyz
[
2
]
-=
1.
;
}
else
{
prim
->
verts
[
0
].
xyz
[
2
]
-=
0.05
;
prim
->
verts
[
1
].
xyz
[
2
]
-=
0.05
;
prim
->
verts
[
0
].
xyz
[
2
]
-=
GL2PS_SIMPLE_OFFSET
;
prim
->
verts
[
1
].
xyz
[
2
]
-=
GL2PS_SIMPLE_OFFSET
;
}
}
}
...
...
@@ -912,7 +779,7 @@ GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){
v
->
xyz
[
0
]
=
p
[
0
];
v
->
xyz
[
1
]
=
p
[
1
];
v
->
xyz
[
2
]
=
1000.
*
p
[
2
];
v
->
xyz
[
2
]
=
GL2PS_DEPTH_FACT
*
p
[
2
];
if
(
gl2ps
->
colormode
==
GL_COLOR_INDEX
&&
gl2ps
->
colorsize
>
0
){
i
=
(
GLint
)(
p
[
3
]
+
0.5
);
...
...
@@ -1186,23 +1053,20 @@ GLvoid gl2psPrintPostScriptHeader(GLvoid){
}
}
#define PRINTCOLOR \
if(rgba[0] != prim->verts[0].rgba[0] || \
rgba[1] != prim->verts[0].rgba[1] || \
rgba[2] != prim->verts[0].rgba[2]){ \
rgba[0] = prim->verts[0].rgba[0]; \
rgba[1] = prim->verts[0].rgba[1]; \
rgba[2] = prim->verts[0].rgba[2]; \
fprintf(gl2ps->stream, "%g %g %g C\n", rgba[0], rgba[1], rgba[2]); \
#define PRINTCOLOR \
if(gl2ps->lastrgba[0] != prim->verts[0].rgba[0] || \
gl2ps->lastrgba[1] != prim->verts[0].rgba[1] || \
gl2ps->lastrgba[2] != prim->verts[0].rgba[2]){ \
gl2ps->lastrgba[0] = prim->verts[0].rgba[0]; \
gl2ps->lastrgba[1] = prim->verts[0].rgba[1]; \
gl2ps->lastrgba[2] = prim->verts[0].rgba[2]; \
fprintf(gl2ps->stream, "%g %g %g C\n", gl2ps->lastrgba[0], \
gl2ps->lastrgba[1], gl2ps->lastrgba[2]); \
}
#define CLEARCOLOR rgba[0] = rgba[1] = rgba[2] = -1.
#define CLEARCOLOR gl2ps->lastrgba[0] = gl2ps->lastrgba[1] = gl2ps->lastrgba[2] = -1.
GLvoid
gl2psPrintPostScriptPrimitive
(
GLvoid
*
a
,
GLvoid
*
b
){
static
GL2PSrgba
rgba
=
{
-
1.
,
-
1.
,
-
1.
,
-
1.
};
static
float
linewidth
=-
1.
;
GL2PSprimitive
*
prim
;
prim
=
*
(
GL2PSprimitive
**
)
a
;
...
...
@@ -1222,9 +1086,9 @@ GLvoid gl2psPrintPostScriptPrimitive(GLvoid *a, GLvoid *b){
prim
->
verts
[
0
].
xyz
[
0
],
prim
->
verts
[
0
].
xyz
[
1
],
0.5
*
prim
->
width
);
break
;
case
GL2PS_LINE
:
if
(
linewidth
!=
prim
->
width
){
linewidth
=
prim
->
width
;
fprintf
(
gl2ps
->
stream
,
"%g W
\n
"
,
linewidth
);
if
(
gl2ps
->
last
linewidth
!=
prim
->
width
){
gl2ps
->
last
linewidth
=
prim
->
width
;
fprintf
(
gl2ps
->
stream
,
"%g W
\n
"
,
gl2ps
->
last
linewidth
);
}
if
(
prim
->
dash
)
fprintf
(
gl2ps
->
stream
,
"[%d] 0 setdash
\n
"
,
prim
->
dash
);
...
...
@@ -1357,6 +1221,11 @@ GL2PSDLL_API GLvoid gl2psBeginPage(char *title, char *producer,
gl2ps
->
colormode
=
colormode
;
gl2ps
->
buffersize
=
buffersize
>
0
?
buffersize
:
2048
*
2048
;
gl2ps
->
feedback
=
(
GLfloat
*
)
gl2psMalloc
(
gl2ps
->
buffersize
*
sizeof
(
GLfloat
));
gl2ps
->
lastrgba
[
0
]
=
-
1.
;
gl2ps
->
lastrgba
[
1
]
=
-
1.
;
gl2ps
->
lastrgba
[
2
]
=
-
1.
;
gl2ps
->
lastrgba
[
3
]
=
-
1.
;
gl2ps
->
lastlinewidth
=
-
1.
;
gl2ps
->
primitives
=
gl2psListCreate
(
500
,
500
,
sizeof
(
GL2PSprimitive
*
));
if
(
gl2ps
->
colormode
==
GL_RGBA
){
...
...
@@ -1440,10 +1309,12 @@ GL2PSDLL_API GLint gl2psEndPage(GLvoid){
root
=
(
GL2PSbsptree
*
)
gl2psMalloc
(
sizeof
(
GL2PSbsptree
));
gl2psBuildBspTree
(
root
,
gl2ps
->
primitives
);
if
(
gl2ps
->
boundary
)
gl2psBuildPolygonBoundary
(
root
);
/* Occlusion culling is not implemented yet...
if(gl2ps->options & GL2PS_OCCLUSION_CULL){
gl2psTraverseBspTree(root, eye, -(float)GL2PS_EPSILON, gl2psLess,
gl2psAddInImage);
}
*/
gl2psTraverseBspTree
(
root
,
eye
,
(
float
)
GL2PS_EPSILON
,
gl2psGreater
,
pprim
);
gl2psFreeBspTree
(
root
);
...
...
@@ -1470,7 +1341,7 @@ GL2PSDLL_API GLvoid gl2psText(char *str, char *fontname, GLint fontsize){
GL2PSprimitive
*
prim
;
GLboolean
valid
;
if
(
!
gl2ps
)
return
;
if
(
!
gl2ps
||
!
str
)
return
;
if
(
gl2ps
->
options
&
GL2PS_NO_TEXT
)
return
;
...
...
@@ -1487,14 +1358,15 @@ GL2PSDLL_API GLvoid gl2psText(char *str, char *fontname, GLint fontsize){
prim
->
verts
[
0
].
xyz
[
0
]
=
pos
[
0
];
prim
->
verts
[
0
].
xyz
[
1
]
=
pos
[
1
];
prim
->
verts
[
0
].
xyz
[
2
]
=
pos
[
2
];
prim
->
depth
=
pos
[
2
];
prim
->
depth
=
GL2PS_DEPTH_FACT
*
pos
[
2
];
prim
->
dash
=
0
;
prim
->
width
=
1
;
glGetFloatv
(
GL_CURRENT_RASTER_COLOR
,
prim
->
verts
[
0
].
rgba
);
prim
->
text
=
(
GL2PSstring
*
)
gl2psMalloc
(
sizeof
(
GL2PSstring
));
prim
->
text
->
str
=
(
char
*
)
gl2psMalloc
((
strlen
(
str
)
+
1
)
*
sizeof
(
char
));
strcpy
(
prim
->
text
->
str
,
str
);
prim
->
text
->
fontname
=
fontname
;
prim
->
text
->
fontname
=
(
char
*
)
gl2psMalloc
((
strlen
(
fontname
)
+
1
)
*
sizeof
(
char
));
strcpy
(
prim
->
text
->
fontname
,
fontname
);
prim
->
text
->
fontsize
=
fontsize
;
gl2psListAdd
(
gl2ps
->
primitives
,
&
prim
);
...
...
This diff is collapsed.
Click to expand it.
Graphics/gl2ps.h
+
6
−
11
View file @
c39bb875
...
...
@@ -2,7 +2,7 @@
* GL2PS, an OpenGL to PostScript Printing Library
* Copyright (C) 1999-2002 Christophe Geuzaine
*
* $Id: gl2ps.h,v 1.2
3
2002-0
5-25 19:17:45
geuzaine Exp $
* $Id: gl2ps.h,v 1.2
4
2002-0
6-04 21:52:27
geuzaine Exp $
*
* E-mail: geuz@geuz.org
* URL: http://www.geuz.org/gl2ps/
...
...
@@ -54,7 +54,7 @@
#endif
/* __APPLE__ */
#define GL2PS_VERSION 0.
53
#define GL2PS_VERSION 0.
6
#define GL2PS_NONE 0
/* Output file format */
...
...
@@ -87,6 +87,8 @@
/* Magic numbers */
#define GL2PS_EPSILON 5.e-3
#define GL2PS_DEPTH_FACT 1000.
#define GL2PS_SIMPLE_OFFSET 0.05
/* Message levels */
...
...
@@ -144,14 +146,6 @@ struct _GL2PSbsptree {
GL2PSbsptree
*
front
,
*
back
;
};
typedef
struct
_GL2PSbsptree2d
GL2PSbsptree2d
;
struct
_GL2PSbsptree2d
{
GLshort
flag
;
GL2PSxy
a
,
b
;
GL2PSbsptree2d
*
front
,
*
back
;
};
typedef
struct
{
GL2PSxyz
xyz
;
GL2PSrgba
rgba
;
...
...
@@ -174,7 +168,8 @@ typedef struct {
char
*
title
,
*
producer
,
*
filename
;
GLboolean
shade
,
boundary
;
GLfloat
*
feedback
,
offset
[
2
];
GL2PSrgba
*
colormap
;
GL2PSrgba
*
colormap
,
lastrgba
;
float
lastlinewidth
;
GL2PSlist
*
primitives
;
FILE
*
stream
;
}
GL2PScontext
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment