Browse Source

Additional freeing of device-dependent information for bug #419 and related bugs.

pre-master-46
Jim Monte 6 years ago
committed by Holger Vogt
parent
commit
a7946474fa
  1. 67
      src/frontend/hpgl.c
  2. 44
      src/frontend/plotting/plot5.c
  3. 12
      src/frontend/plotting/x11.c
  4. 63
      src/frontend/postsc.c
  5. 150
      src/frontend/wdisp/windisp.c
  6. 709
      src/frontend/wdisp/winprint.c

67
src/frontend/hpgl.c

@ -89,7 +89,8 @@ int GL_Init(void)
{ {
if (!cp_getvar("hcopyscale", CP_STRING, psscale, sizeof(psscale))) { if (!cp_getvar("hcopyscale", CP_STRING, psscale, sizeof(psscale))) {
scale = 1.0; scale = 1.0;
} else {
}
else {
sscanf(psscale, "%lf", &scale); sscanf(psscale, "%lf", &scale);
if ((scale <= 0) || (scale > 10)) if ((scale <= 0) || (scale > 10))
scale = 1.0; scale = 1.0;
@ -106,20 +107,21 @@ int GL_Init(void)
dispdev->minx = (int)(XOFF * 1.0); dispdev->minx = (int)(XOFF * 1.0);
dispdev->miny = (int)(YOFF * 1.0); dispdev->miny = (int)(YOFF * 1.0);
return (0);
return 0;
} }
/* devdep initially contains name of output file */ /* devdep initially contains name of output file */
int
GL_NewViewport(GRAPH *graph)
int GL_NewViewport(GRAPH *graph)
{ {
hcopygraphid = graph->graphid; hcopygraphid = graph->graphid;
if ((plotfile = fopen((char*) graph->devdep, "w")) == NULL) { if ((plotfile = fopen((char*) graph->devdep, "w")) == NULL) {
perror((char*) graph->devdep);
perror((char *) graph->devdep);
free(graph->devdep);
graph->devdep = NULL; graph->devdep = NULL;
return (1);
graph->n_byte_devdep = 0;
return 1;
} }
if (graph->absolute.width) { if (graph->absolute.width) {
@ -146,13 +148,18 @@ GL_NewViewport(GRAPH *graph)
/* start file off with a % */ /* start file off with a % */
fprintf(plotfile, "IN;DF;PA;"); fprintf(plotfile, "IN;DF;PA;");
fprintf(plotfile, "SI %f,%f;", tocm*jgmult*fontwidth*scale, tocm*jgmult*fontheight*scale);
fprintf(plotfile, "SI %f,%f;",
tocm * jgmult * fontwidth * scale,
tocm * jgmult * fontheight * scale);
#ifdef notdef #ifdef notdef
if (!screenflag) if (!screenflag)
#endif #endif
{
graph->devdep = TMALLOC(GLdevdep, 1); graph->devdep = TMALLOC(GLdevdep, 1);
graph->n_byte_devdep = sizeof(GLdevdep);
}
DEVDEP(graph).lastlinestyle = -1; DEVDEP(graph).lastlinestyle = -1;
DEVDEP(graph).lastx = -1; DEVDEP(graph).lastx = -1;
DEVDEP(graph).lasty = -1; DEVDEP(graph).lasty = -1;
@ -163,8 +170,7 @@ GL_NewViewport(GRAPH *graph)
} }
int
GL_Close(void)
int GL_Close(void)
{ {
/* in case GL_Close is called as part of an abort, /* in case GL_Close is called as part of an abort,
w/o having reached GL_NewViewport */ w/o having reached GL_NewViewport */
@ -187,8 +193,7 @@ GL_Close(void)
} }
int
GL_Clear(void)
int GL_Clear(void)
{ {
/* do nothing */ /* do nothing */
@ -196,21 +201,21 @@ GL_Clear(void)
} }
int
GL_DrawLine(int x1, int y1, int x2, int y2)
int GL_DrawLine(int x1, int y1, int x2, int y2)
{ {
/* note: this is not extendible to more than one graph /* note: this is not extendible to more than one graph
=> will have to give NewViewport a writeable graph XXX */ => will have to give NewViewport a writeable graph XXX */
if (DEVDEP(currentgraph).linecount == 0 if (DEVDEP(currentgraph).linecount == 0
|| x1 != DEVDEP(currentgraph).lastx
|| y1 != DEVDEP(currentgraph).lasty)
{
fprintf(plotfile, "PU;PA %d , %d ;", jgmult*(x1 + xoff), jgmult*(y1 + yoff));
|| x1 != DEVDEP(currentgraph).lastx
|| y1 != DEVDEP(currentgraph).lasty) {
fprintf(plotfile, "PU;PA %d , %d ;",
jgmult * (x1 + xoff), jgmult * (y1 + yoff));
} }
if (x1 != x2 || y1 != y2) { if (x1 != x2 || y1 != y2) {
fprintf(plotfile, "PD;PA %d , %d ;", jgmult*(x2 + xoff), jgmult*(y2 + yoff));
fprintf(plotfile, "PD;PA %d , %d ;",
jgmult * (x2 + xoff), jgmult * (y2 + yoff));
DEVDEP(currentgraph).linecount += 1; DEVDEP(currentgraph).linecount += 1;
} }
@ -223,8 +228,7 @@ GL_DrawLine(int x1, int y1, int x2, int y2)
/* ARGSUSED */ /* ARGSUSED */
int
GL_Arc(int x0, int y0, int r, double theta, double delta_theta)
int GL_Arc(int x0, int y0, int r, double theta, double delta_theta)
{ {
int x1, y1, angle; int x1, y1, angle;
@ -233,8 +237,10 @@ GL_Arc(int x0, int y0, int r, double theta, double delta_theta)
angle = (int)(RAD_TO_DEG * delta_theta); angle = (int)(RAD_TO_DEG * delta_theta);
fprintf(plotfile, "PU;PA %d , %d;", jgmult*(x1+xoff+XTADJ), jgmult*(y1+yoff+YTADJ));
fprintf(plotfile, "PD;AA %d , %d, %d;", jgmult*(x0+xoff+XTADJ), jgmult*(y0+yoff+YTADJ), angle);
fprintf(plotfile, "PU;PA %d , %d;",
jgmult * (x1 + xoff + XTADJ), jgmult * (y1 + yoff + YTADJ));
fprintf(plotfile, "PD;AA %d , %d, %d;",
jgmult * (x0 + xoff + XTADJ), jgmult*(y0 + yoff + YTADJ), angle);
DEVDEP(currentgraph).linecount = 0; DEVDEP(currentgraph).linecount = 0;
@ -242,13 +248,13 @@ GL_Arc(int x0, int y0, int r, double theta, double delta_theta)
} }
int
GL_Text(char *text, int x, int y, int angle)
int GL_Text(char *text, int x, int y, int angle)
{ {
/* move to (x, y) */ /* move to (x, y) */
NG_IGNORE(angle); NG_IGNORE(angle);
fprintf(plotfile, "PU;PA %d , %d;", jgmult*(x+xoff+XTADJ), jgmult*(y+yoff+YTADJ));
fprintf(plotfile, "PU;PA %d , %d;",
jgmult * (x + xoff + XTADJ), jgmult * (y + yoff + YTADJ));
fprintf(plotfile, "LB %s \x03", text); fprintf(plotfile, "LB %s \x03", text);
DEVDEP(currentgraph).lastx = -1; DEVDEP(currentgraph).lastx = -1;
@ -258,8 +264,7 @@ GL_Text(char *text, int x, int y, int angle)
} }
int
GL_SetLinestyle(int linestyleid)
int GL_SetLinestyle(int linestyleid)
{ {
/* special case /* special case
get it when GL_Text restores a -1 linestyle */ get it when GL_Text restores a -1 linestyle */
@ -283,8 +288,7 @@ GL_SetLinestyle(int linestyleid)
/* ARGSUSED */ /* ARGSUSED */
int
GL_SetColor(int colorid)
int GL_SetColor(int colorid)
{ {
fprintf(plotfile, "SP %d;", colorid); fprintf(plotfile, "SP %d;", colorid);
@ -292,8 +296,7 @@ GL_SetColor(int colorid)
} }
int
GL_Update(void)
int GL_Update(void)
{ {
fflush(plotfile); fflush(plotfile);

44
src/frontend/plotting/plot5.c

@ -28,8 +28,7 @@ static char *linestyle[] = {
static int currentlinestyle = SOLID; static int currentlinestyle = SOLID;
int
Plt5_Init(void)
int Plt5_Init(void)
{ {
dispdev->numlinestyles = 4; dispdev->numlinestyles = 4;
dispdev->numcolors = 2; dispdev->numcolors = 2;
@ -38,17 +37,18 @@ Plt5_Init(void)
dispdev->width = 1000; dispdev->width = 1000;
dispdev->height = 1000; dispdev->height = 1000;
return (0);
return 0;
} }
int
Plt5_NewViewport(GRAPH *graph)
int Plt5_NewViewport(GRAPH *graph)
{ {
if ((plotfile = fopen((char*) graph->devdep, "w")) == NULL) { if ((plotfile = fopen((char*) graph->devdep, "w")) == NULL) {
perror((char *) graph->devdep);
free(graph->devdep);
graph->devdep = NULL; graph->devdep = NULL;
perror((char*) graph->devdep);
return (1);
graph->n_byte_devdep = 0;
return 1;
} }
if (graph->absolute.width) { if (graph->absolute.width) {
@ -64,7 +64,8 @@ Plt5_NewViewport(GRAPH *graph)
/* re-scale linestyles */ /* re-scale linestyles */
gr_relinestyle(graph); gr_relinestyle(graph);
} else {
}
else {
/* scale space */ /* scale space */
putc('s', plotfile); putc('s', plotfile);
putsi(0); putsi(0);
@ -83,13 +84,13 @@ Plt5_NewViewport(GRAPH *graph)
/* set to NULL so graphdb doesn't incorrectly de-allocate it */ /* set to NULL so graphdb doesn't incorrectly de-allocate it */
graph->devdep = NULL; graph->devdep = NULL;
graph->n_byte_devdep = 0;
return (0);
return 0;
} }
int
Plt5_Close(void)
int Plt5_Close(void)
{ {
/* in case Plt5_Close is called as part of an abort, /* in case Plt5_Close is called as part of an abort,
w/o having reached Plt5_NewViewport */ w/o having reached Plt5_NewViewport */
@ -100,16 +101,14 @@ Plt5_Close(void)
} }
int
Plt5_Clear(void)
int Plt5_Clear(void)
{ {
/* do nothing */ /* do nothing */
return 0; return 0;
} }
int
Plt5_DrawLine(int x1, int y1, int x2, int y2)
int Plt5_DrawLine(int x1, int y1, int x2, int y2)
{ {
putc('l', plotfile); putc('l', plotfile);
putsi(x1); putsi(x1);
@ -121,8 +120,7 @@ Plt5_DrawLine(int x1, int y1, int x2, int y2)
} }
int
Plt5_Arc(int xc, int yc, int radius, double theta, double delta_theta)
int Plt5_Arc(int xc, int yc, int radius, double theta, double delta_theta)
{ {
int x0, y0, x1, y1; int x0, y0, x1, y1;
@ -169,8 +167,7 @@ Plt5_Arc(int xc, int yc, int radius, double theta, double delta_theta)
} }
int
Plt5_Text(char *text, int x, int y, int angle)
int Plt5_Text(char *text, int x, int y, int angle)
{ {
int savedlstyle; int savedlstyle;
NG_IGNORE(angle); NG_IGNORE(angle);
@ -195,8 +192,7 @@ Plt5_Text(char *text, int x, int y, int angle)
} }
int
Plt5_SetLinestyle(int linestyleid)
int Plt5_SetLinestyle(int linestyleid)
{ {
if (linestyleid < 0 || linestyleid > dispdev->numlinestyles) { if (linestyleid < 0 || linestyleid > dispdev->numlinestyles) {
internalerror("bad linestyleid"); internalerror("bad linestyleid");
@ -211,8 +207,7 @@ Plt5_SetLinestyle(int linestyleid)
/* ARGSUSED */ /* ARGSUSED */
int
Plt5_SetColor(int colorid)
int Plt5_SetColor(int colorid)
{ {
NG_IGNORE(colorid); NG_IGNORE(colorid);
@ -221,8 +216,7 @@ Plt5_SetColor(int colorid)
} }
int
Plt5_Update(void)
int Plt5_Update(void)
{ {
fflush(plotfile); fflush(plotfile);
return 0; return 0;

12
src/frontend/plotting/x11.c

@ -383,6 +383,7 @@ X11_NewViewport(GRAPH *graph)
int trys; int trys;
graph->devdep = TMALLOC(X11devdep, 1); graph->devdep = TMALLOC(X11devdep, 1);
graph->n_byte_devdep = sizeof(X11devdep);
/* set up new shell */ /* set up new shell */
DEVDEP(graph).shell = XtCreateApplicationShell DEVDEP(graph).shell = XtCreateApplicationShell
@ -855,7 +856,7 @@ hardcopy(Widget w, XtPointer client_data, XtPointer call_data)
NG_IGNORE(call_data); NG_IGNORE(call_data);
NG_IGNORE(w); NG_IGNORE(w);
/* com_hardcopy() -> gr_resize() -> setcolor() dirung postscript
/* com_hardcopy() -> gr_resize() -> setcolor() during postscript
printing will act on currentgraph with a DEVDEP inherited from PSdevdep. printing will act on currentgraph with a DEVDEP inherited from PSdevdep.
But currentgraph had not changed its devdep, which was derived from But currentgraph had not changed its devdep, which was derived from
incompatible X11devdep, thus overwriting some variables. Here you find a incompatible X11devdep, thus overwriting some variables. Here you find a
@ -893,16 +894,16 @@ killwin(Widget w, XtPointer client_data, XtPointer call_data)
} }
/* called from postcoms.c /* called from postcoms.c
In the command 'destroy ac2' Will remove window associated with In the command 'destroy ac2' Will remove window associated with
the plot (e.g. ac2) just before data of the plot are deleted.*/ the plot (e.g. ac2) just before data of the plot are deleted.*/
void
RemoveWindow(GRAPH *graph)
void RemoveWindow(GRAPH *graph)
{ {
if (graph->devdep) { if (graph->devdep) {
/* Iplots are done asynchronously */ /* Iplots are done asynchronously */
DEVDEP(graph).isopen = 0; DEVDEP(graph).isopen = 0;
/* MW. Not sure but DestroyGraph might free() to much - try Xt...() first */
/* MW. Not sure but DestroyGraph might free() too much - try Xt...() first */
XtUnmapWidget(DEVDEP(graph).shell); XtUnmapWidget(DEVDEP(graph).shell);
XtDestroyWidget(DEVDEP(graph).shell); XtDestroyWidget(DEVDEP(graph).shell);
XFreeFont(display, DEVDEP(graph).font); XFreeFont(display, DEVDEP(graph).font);
@ -913,7 +914,8 @@ RemoveWindow(GRAPH *graph)
currentgraph = NULL; currentgraph = NULL;
DestroyGraph(graph->graphid); DestroyGraph(graph->graphid);
}
} /* end of function RemoveWindow */
/* call higher gr_redraw routine */ /* call higher gr_redraw routine */

63
src/frontend/postsc.c

@ -79,8 +79,7 @@ void PS_Stroke(void);
/* Set scale, color and size of the plot */ /* Set scale, color and size of the plot */
int
PS_Init(void)
int PS_Init(void)
{ {
char pswidth[30], psheight[30]; char pswidth[30], psheight[30];
@ -108,7 +107,8 @@ PS_Init(void)
/* plot size */ /* plot size */
if (!cp_getvar("hcopywidth", CP_STRING, pswidth, sizeof( pswidth))) { if (!cp_getvar("hcopywidth", CP_STRING, pswidth, sizeof( pswidth))) {
dispdev->width = (int)(7.75 * 72.0 * scale); /* (8 1/2 - 3/4) * 72 */ dispdev->width = (int)(7.75 * 72.0 * scale); /* (8 1/2 - 3/4) * 72 */
} else {
}
else {
sscanf(pswidth, "%d", &(dispdev->width)); sscanf(pswidth, "%d", &(dispdev->width));
if (dispdev->width <= 100) if (dispdev->width <= 100)
dispdev->width = 100; dispdev->width = 100;
@ -117,7 +117,8 @@ PS_Init(void)
} }
if (!cp_getvar("hcopyheight", CP_STRING, psheight, sizeof(psheight))) { if (!cp_getvar("hcopyheight", CP_STRING, psheight, sizeof(psheight))) {
dispdev->height = dispdev->width; dispdev->height = dispdev->width;
} else {
}
else {
sscanf(psheight, "%d", &(dispdev->height)); sscanf(psheight, "%d", &(dispdev->height));
if (dispdev->height <= 100) if (dispdev->height <= 100)
dispdev->height = 100; dispdev->height = 100;
@ -135,15 +136,17 @@ PS_Init(void)
* viewport.height = absolute.height - 2 * viewportyoff * viewport.height = absolute.height - 2 * viewportyoff
*/ */
if (!cp_getvar("hcopyfont", CP_STRING, psfont, sizeof(psfont)))
if (!cp_getvar("hcopyfont", CP_STRING, psfont, sizeof(psfont))) {
strcpy(psfont, "Helvetica"); strcpy(psfont, "Helvetica");
}
if (!cp_getvar("hcopyfontsize", CP_STRING, psfontsize, sizeof(psfontsize))) { if (!cp_getvar("hcopyfontsize", CP_STRING, psfontsize, sizeof(psfontsize))) {
fontsize = 10; fontsize = 10;
fontwidth = 6; fontwidth = 6;
fontheight = 14; fontheight = 14;
xtadj = (int)(XTADJ * scale); xtadj = (int)(XTADJ * scale);
ytadj = (int)(YTADJ * scale); ytadj = (int)(YTADJ * scale);
} else {
}
else {
sscanf(psfontsize, "%d", &fontsize); sscanf(psfontsize, "%d", &fontsize);
if ((fontsize < 10) || (fontsize > 14)) if ((fontsize < 10) || (fontsize > 14))
fontsize = 10; fontsize = 10;
@ -157,21 +160,23 @@ PS_Init(void)
dispdev->minx = (int)(XOFF / scale); dispdev->minx = (int)(XOFF / scale);
dispdev->miny = (int)(YOFF / scale); dispdev->miny = (int)(YOFF / scale);
return (0);
}
return 0;
} /* end of function PS_Init */
/* Plot and fill bounding box */ /* Plot and fill bounding box */
int
PS_NewViewport(GRAPH *graph)
int PS_NewViewport(GRAPH *graph)
{ {
int x1, x2, y1, y2; int x1, x2, y1, y2;
hcopygraphid = graph->graphid; hcopygraphid = graph->graphid;
/* devdep initially contains name of output file */ /* devdep initially contains name of output file */
if ((plotfile = fopen((char*)graph->devdep, "w")) == NULL) { if ((plotfile = fopen((char*)graph->devdep, "w")) == NULL) {
perror((char*)graph->devdep);
perror((char *) graph->devdep);
free(graph->devdep);
graph->devdep = NULL; graph->devdep = NULL;
return (1);
graph->n_byte_devdep = 0;
return 1;
} }
if (graph->absolute.width) { if (graph->absolute.width) {
@ -233,6 +238,7 @@ PS_NewViewport(GRAPH *graph)
psfont, (int) (fontsize * scale)); psfont, (int) (fontsize * scale));
graph->devdep = TMALLOC(PSdevdep, 1); graph->devdep = TMALLOC(PSdevdep, 1);
graph->n_byte_devdep = sizeof(PSdevdep);
DEVDEP(graph).lastlinestyle = -1; DEVDEP(graph).lastlinestyle = -1;
DEVDEP(graph).lastcolor = -1; DEVDEP(graph).lastcolor = -1;
DEVDEP(graph).lastx = -1; DEVDEP(graph).lastx = -1;
@ -245,8 +251,7 @@ PS_NewViewport(GRAPH *graph)
} }
int
PS_Close(void)
int PS_Close(void)
{ {
/* in case PS_Close is called as part of an abort, /* in case PS_Close is called as part of an abort,
w/o having reached PS_NewViewport */ w/o having reached PS_NewViewport */
@ -267,16 +272,14 @@ PS_Close(void)
} }
int
PS_Clear(void)
int PS_Clear(void)
{ {
/* do nothing */ /* do nothing */
return 0; return 0;
} }
int
PS_DrawLine(int x1, int y1, int x2, int y2)
int PS_DrawLine(int x1, int y1, int x2, int y2)
{ {
/* note: this is not extendible to more than one graph /* note: this is not extendible to more than one graph
=> will have to give NewViewport a writeable graph XXX */ => will have to give NewViewport a writeable graph XXX */
@ -303,8 +306,7 @@ PS_DrawLine(int x1, int y1, int x2, int y2)
} }
int
PS_Arc(int x0, int y0, int r, double theta, double delta_theta)
int PS_Arc(int x0, int y0, int r, double theta, double delta_theta)
{ {
double x1, y1; double x1, y1;
double angle1, angle2; double angle1, angle2;
@ -325,8 +327,7 @@ PS_Arc(int x0, int y0, int r, double theta, double delta_theta)
} }
int
PS_Text(char *text, int x, int y, int angle)
int PS_Text(char *text, int x, int y, int angle)
{ {
int savedlstyle, savedcolor; int savedlstyle, savedcolor;
@ -368,8 +369,7 @@ PS_Text(char *text, int x, int y, int angle)
/* PS_DefineColor */ /* PS_DefineColor */
/* PS_DefineLinestyle */ /* PS_DefineLinestyle */
int
PS_SetLinestyle(int linestyleid)
int PS_SetLinestyle(int linestyleid)
{ {
/* special case /* special case
get it when PS_Text restores a -1 linestyle */ get it when PS_Text restores a -1 linestyle */
@ -387,16 +387,14 @@ PS_SetLinestyle(int linestyleid)
} }
int
PS_SetColor(int colorid)
int PS_SetColor(int colorid)
{ {
PS_LinestyleColor(currentgraph->linestyle, colorid); PS_LinestyleColor(currentgraph->linestyle, colorid);
return 0; return 0;
} }
int
PS_Update(void)
int PS_Update(void)
{ {
fflush(plotfile); fflush(plotfile);
return 0; return 0;
@ -405,8 +403,7 @@ PS_Update(void)
/**************** PRIVAT FUNCTIONS OF PS FRONTEND *****************************/ /**************** PRIVAT FUNCTIONS OF PS FRONTEND *****************************/
void
PS_SelectColor(int colorid) /* should be replaced by PS_DefineColor */
void PS_SelectColor(int colorid) /* should be replaced by PS_DefineColor */
{ {
char colorN[30] = "", colorstring[30] = ""; char colorN[30] = "", colorstring[30] = "";
char rgb[30], s_red[30] = "0x", s_green[30] = "0x", s_blue[30] = "0x"; char rgb[30], s_red[30] = "0x", s_green[30] = "0x", s_blue[30] = "0x";
@ -468,8 +465,7 @@ PS_SelectColor(int colorid) /* should be replaced by PS_DefineColor */
} }
void
PS_LinestyleColor(int linestyleid, int colorid)
void PS_LinestyleColor(int linestyleid, int colorid)
{ {
/* we have some different linestyles and colors: /* we have some different linestyles and colors:
- color and linestyle we got via function call - color and linestyle we got via function call
@ -519,8 +515,7 @@ PS_LinestyleColor(int linestyleid, int colorid)
} }
void
PS_Stroke(void)
void PS_Stroke(void)
{ {
/* strokes an open path */ /* strokes an open path */
if (DEVDEP(currentgraph).linecount > 0) { if (DEVDEP(currentgraph).linecount > 0) {

150
src/frontend/wdisp/windisp.c

@ -107,9 +107,7 @@ WIN_Init() returns 0, if no error ocurred.
WIN_Init() does not yet open a window, this happens only in WIN_NewViewport() WIN_Init() does not yet open a window, this happens only in WIN_NewViewport()
******************************************************************************/ ******************************************************************************/
int
WIN_Init(void)
int WIN_Init(void)
{ {
char colorstring[BSIZE_SP]; char colorstring[BSIZE_SP];
@ -126,10 +124,12 @@ WIN_Init(void)
isblack = !cieq(colorstring, "white"); isblack = !cieq(colorstring, "white");
/* get linewidth information from spinit */ /* get linewidth information from spinit */
if (!cp_getvar("xbrushwidth", CP_NUM, &linewidth, 0))
if (!cp_getvar("xbrushwidth", CP_NUM, &linewidth, 0)) {
linewidth = 0; linewidth = 0;
if (linewidth < 0)
}
if (linewidth < 0) {
linewidth = 0; linewidth = 0;
}
/* only for the first time: */ /* only for the first time: */
if (!IsRegistered) { if (!IsRegistered) {
@ -165,10 +165,12 @@ WIN_Init(void)
ColorTable[11] = RGB(255, 128, 128); /* pink */ ColorTable[11] = RGB(255, 128, 128); /* pink */
/* 2. color bank (with different line style */ /* 2. color bank (with different line style */
if (isblack)
if (isblack) {
ColorTable[12] = RGB(255, 255, 255); /* white */ ColorTable[12] = RGB(255, 255, 255); /* white */
else
}
else {
ColorTable[12] = RGB( 0, 0, 0); /* black */ ColorTable[12] = RGB( 0, 0, 0); /* black */
}
ColorTable[13] = RGB( 0, 255, 0); /* green */ ColorTable[13] = RGB( 0, 255, 0); /* green */
ColorTable[14] = RGB(255, 0, 0); /* red */ ColorTable[14] = RGB(255, 0, 0); /* red */
@ -192,17 +194,20 @@ WIN_Init(void)
TheWndClass.lpszMenuName = NULL; TheWndClass.lpszMenuName = NULL;
TheWndClass.hCursor = LoadCursor(NULL, IDC_ARROW); TheWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
if (isblack)
if (isblack) {
TheWndClass.hbrBackground = GetStockObject(BLACK_BRUSH); TheWndClass.hbrBackground = GetStockObject(BLACK_BRUSH);
else
}
else {
TheWndClass.hbrBackground = GetStockObject(WHITE_BRUSH); TheWndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
}
TheWndClass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(2)); TheWndClass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(2));
TheWndClass.cbClsExtra = 0; TheWndClass.cbClsExtra = 0;
TheWndClass.cbWndExtra = sizeof(GRAPH *); TheWndClass.cbWndExtra = sizeof(GRAPH *);
if (!RegisterClass(&TheWndClass))
if (!RegisterClass(&TheWndClass)) {
return 1; return 1;
}
} }
/* not first time */ /* not first time */
else if (isblackold != isblack) { else if (isblackold != isblack) {
@ -214,10 +219,12 @@ WIN_Init(void)
ColorTable[0] = RGB(255, 255, 255); /* white = background */ ColorTable[0] = RGB(255, 255, 255); /* white = background */
ColorTable[1] = RGB( 0, 0, 0); /* black = text and grid */ ColorTable[1] = RGB( 0, 0, 0); /* black = text and grid */
} }
if (isblack)
if (isblack) {
ColorTable[12] = RGB(255, 255, 255); /* white */ ColorTable[12] = RGB(255, 255, 255); /* white */
else
}
else {
ColorTable[12] = RGB( 0, 0, 0); /* black */ ColorTable[12] = RGB( 0, 0, 0); /* black */
}
isblackold = isblack; isblackold = isblack;
} }
@ -230,28 +237,27 @@ WIN_Init(void)
/* get pointer to graph */ /* get pointer to graph */
/* (attach to window) */ /* (attach to window) */
static GRAPH *
pGraph(HWND hwnd)
static GRAPH *pGraph(HWND hwnd)
{ {
return (GRAPH *) GetWindowLongPtr(hwnd, 0); return (GRAPH *) GetWindowLongPtr(hwnd, 0);
} }
/* return line style for plotting */ /* return line style for plotting */
static int
LType(int ColorIndex)
static int LType(int ColorIndex)
{ {
if (ColorIndex >= 12)
if (ColorIndex >= 12) {
return PS_DOT; return PS_DOT;
else
}
else {
return PS_SOLID; return PS_SOLID;
}
} }
/* postscript hardcopy from a plot window */ /* postscript hardcopy from a plot window */
/* called by SystemMenue / Postscript hardcopy */ /* called by SystemMenue / Postscript hardcopy */
static LRESULT
HcpyPlot(HWND hwnd)
static LRESULT HcpyPlot(HWND hwnd)
{ {
int colorval = isblack? 0 : 1; int colorval = isblack? 0 : 1;
NG_IGNORE(hwnd); NG_IGNORE(hwnd);
@ -261,13 +267,13 @@ HcpyPlot(HWND hwnd)
} }
static LRESULT
HcpyPlotBW(HWND hwnd)
static LRESULT HcpyPlotBW(HWND hwnd)
{ {
int bgcolor; int bgcolor;
NG_IGNORE(hwnd); NG_IGNORE(hwnd);
if (cp_getvar("hcopypscolor", CP_NUM, &bgcolor, 0))
if (cp_getvar("hcopypscolor", CP_NUM, &bgcolor, 0)) {
cp_remvar("hcopypscolor"); cp_remvar("hcopypscolor");
}
com_hardcopy(NULL); com_hardcopy(NULL);
return 0; return 0;
} }
@ -275,8 +281,7 @@ HcpyPlotBW(HWND hwnd)
/* print a plot window */ /* print a plot window */
/* called by SystemMenue / Print */ /* called by SystemMenue / Print */
static LRESULT
PrintPlot(HWND hwnd)
static LRESULT PrintPlot(HWND hwnd)
{ {
GRAPH *graph; GRAPH *graph;
GRAPH *temp; GRAPH *temp;
@ -288,20 +293,23 @@ PrintPlot(HWND hwnd)
/* switch to printer */ /* switch to printer */
/* (results in WPRINT_Init()) */ /* (results in WPRINT_Init()) */
if (DevSwitch("WinPrint"))
if (DevSwitch("WinPrint")) {
return 0; return 0;
}
/* Cursor = wait */ /* Cursor = wait */
SetCursor(LoadCursor(NULL, IDC_WAIT)); SetCursor(LoadCursor(NULL, IDC_WAIT));
/* copy graph */ /* copy graph */
temp = CopyGraph(graph); temp = CopyGraph(graph);
if (!temp)
if (!temp) {
goto PrintEND; goto PrintEND;
}
/* add to the copy the new printer data */ /* add to the copy the new printer data */
if (NewViewport(temp))
if (NewViewport(temp)) {
goto PrintEND2; goto PrintEND2;
}
/* make correction to placement of grid (copy from gr_init) */ /* make correction to placement of grid (copy from gr_init) */
temp->viewportxoff = temp->fontwidth * 8; temp->viewportxoff = temp->fontwidth * 8;
@ -326,8 +334,7 @@ PrintPlot(HWND hwnd)
/* initialze printer */ /* initialze printer */
static LRESULT
PrintInit(HWND hwnd)
static LRESULT PrintInit(HWND hwnd)
{ {
/* hand over to printer module */ /* hand over to printer module */
WPRINT_PrintInit(hwnd); WPRINT_PrintInit(hwnd);
@ -336,8 +343,8 @@ PrintInit(HWND hwnd)
/* window procedure */ /* window procedure */
LRESULT CALLBACK
PlotWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK PlotWindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{ {
static int x0, y0, xep, yep; static int x0, y0, xep, yep;
int xe, ye, prevmix; int xe, ye, prevmix;
@ -380,10 +387,12 @@ PlotWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* left mouse button: connect coordinate pair by dashed pair of x, y lines */ /* left mouse button: connect coordinate pair by dashed pair of x, y lines */
if (wParam & MK_LBUTTON) { if (wParam & MK_LBUTTON) {
hdc = GetDC(hwnd); hdc = GetDC(hwnd);
if (isblack)
if (isblack) {
prevmix = SetROP2(hdc, R2_XORPEN); prevmix = SetROP2(hdc, R2_XORPEN);
else
}
else {
prevmix = SetROP2(hdc, R2_NOTXORPEN); prevmix = SetROP2(hdc, R2_NOTXORPEN);
}
/* Create white dashed pen */ /* Create white dashed pen */
NewPen = CreatePen(LType(12), 0, ColorTable[1]); NewPen = CreatePen(LType(12), 0, ColorTable[1]);
OldPen = SelectObject(hdc, NewPen); OldPen = SelectObject(hdc, NewPen);
@ -466,7 +475,8 @@ PlotWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
hypot(fx0, fy0), hypot(fx0, fy0),
(angle > 0) ? angle : 360.0 + angle); (angle > 0) ? angle : 360.0 + angle);
} }
} else {
}
else {
/* need to print info about two points */ /* need to print info about two points */
fprintf(stdout, "\nx0 = %g, y0 = %g x1 = %g, y1 = %g\n", fprintf(stdout, "\nx0 = %g, y0 = %g x1 = %g, y1 = %g\n",
fx0, fy0, fxe, fye); fx0, fy0, fxe, fye);
@ -601,8 +611,7 @@ PlotWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
******************************************************************************/ ******************************************************************************/
int
WIN_NewViewport(GRAPH *graph)
int WIN_NewViewport(GRAPH *graph)
{ {
int i; int i;
HWND window; HWND window;
@ -612,8 +621,9 @@ WIN_NewViewport(GRAPH *graph)
HMENU sysmenu; HMENU sysmenu;
/* test the parameters */ /* test the parameters */
if (!graph)
if (!graph) {
return 1; return 1;
}
/* initialize if not yet done */ /* initialize if not yet done */
if (WIN_Init() != 0) { if (WIN_Init() != 0) {
@ -623,24 +633,30 @@ WIN_NewViewport(GRAPH *graph)
/* allocate device dependency info */ /* allocate device dependency info */
wd = calloc(1, sizeof(tWindowData)); wd = calloc(1, sizeof(tWindowData));
if (!wd)
if (!wd) {
return 1; return 1;
}
graph->devdep = wd; graph->devdep = wd;
graph->n_byte_devdep = sizeof(tWindowData);
/* Create the window */ /* Create the window */
i = GetSystemMetrics(SM_CYSCREEN) / 3; i = GetSystemMetrics(SM_CYSCREEN) / 3;
window = CreateWindow(WindowName, graph->plotname, WS_OVERLAPPEDWINDOW, window = CreateWindow(WindowName, graph->plotname, WS_OVERLAPPEDWINDOW,
0, 0, WinLineWidth, i * 2 - 22, NULL, NULL, hInst, NULL); 0, 0, WinLineWidth, i * 2 - 22, NULL, NULL, hInst, NULL);
if (!window)
if (!window) {
return 1; return 1;
}
/* change the background color of all windows (both new and already plotted) /* change the background color of all windows (both new and already plotted)
by assessing the registered window class */ by assessing the registered window class */
if (isblack)
if (isblack) {
SetClassLongPtr(window, GCLP_HBRBACKGROUND, (LONG_PTR)GetStockObject(BLACK_BRUSH)); SetClassLongPtr(window, GCLP_HBRBACKGROUND, (LONG_PTR)GetStockObject(BLACK_BRUSH));
else
}
else {
SetClassLongPtr(window, GCLP_HBRBACKGROUND, (LONG_PTR)GetStockObject(WHITE_BRUSH)); SetClassLongPtr(window, GCLP_HBRBACKGROUND, (LONG_PTR)GetStockObject(WHITE_BRUSH));
}
wd->wnd = window; wd->wnd = window;
@ -709,8 +725,7 @@ to the printer. Therefore WIN_Close is not allowed to do anything, cancelling
of the structures occurs at program termination. of the structures occurs at program termination.
******************************************************************************/ ******************************************************************************/
int
WIN_Close(void)
int WIN_Close(void)
{ {
return 0; return 0;
} }
@ -733,8 +748,7 @@ RealClose(void)
#endif #endif
int
WIN_Clear(void)
int WIN_Clear(void)
{ {
tpWindowData wd; tpWindowData wd;
@ -753,8 +767,7 @@ WIN_Clear(void)
} }
int
WIN_DrawLine(int x1, int y1, int x2, int y2)
int WIN_DrawLine(int x1, int y1, int x2, int y2)
{ {
tpWindowData wd; tpWindowData wd;
HPEN OldPen; HPEN OldPen;
@ -778,8 +791,7 @@ WIN_DrawLine(int x1, int y1, int x2, int y2)
} }
int
WIN_Arc(int x0, int y0, int radius, double theta, double delta_theta)
int WIN_Arc(int x0, int y0, int radius, double theta, double delta_theta)
/* /*
* Notes: * Notes:
* Draws an arc of <radius> and center at (x0,y0) beginning at * Draws an arc of <radius> and center at (x0,y0) beginning at
@ -859,8 +871,7 @@ WIN_Text_old(char *text, int x, int y, int degrees)
#endif #endif
int
WIN_Text(char *text, int x, int y, int angle)
int WIN_Text(char *text, int x, int y, int angle)
{ {
tpWindowData wd; tpWindowData wd;
HFONT hfont; HFONT hfont;
@ -906,8 +917,7 @@ WIN_Text(char *text, int x, int y, int angle)
} }
int
WIN_DefineColor(int colorid, double red, double green, double blue)
int WIN_DefineColor(int colorid, double red, double green, double blue)
{ {
NG_IGNORE(colorid); NG_IGNORE(colorid);
NG_IGNORE(red); NG_IGNORE(red);
@ -917,8 +927,7 @@ WIN_DefineColor(int colorid, double red, double green, double blue)
} }
int
WIN_DefineLinestyle(int num, int mask)
int WIN_DefineLinestyle(int num, int mask)
{ {
NG_IGNORE(num); NG_IGNORE(num);
NG_IGNORE(mask); NG_IGNORE(mask);
@ -926,16 +935,14 @@ WIN_DefineLinestyle(int num, int mask)
} }
int
WIN_SetLinestyle(int style)
int WIN_SetLinestyle(int style)
{ {
NG_IGNORE(style); NG_IGNORE(style);
return 0; return 0;
} }
int
WIN_SetColor(int color)
int WIN_SetColor(int color)
{ {
tpWindowData wd; tpWindowData wd;
@ -952,8 +959,7 @@ WIN_SetColor(int color)
} }
int
WIN_Update(void)
int WIN_Update(void)
{ {
tpWindowData wd; tpWindowData wd;
@ -973,16 +979,14 @@ WIN_Update(void)
#if 0 #if 0
int
WIN_DiagramReady(void)
int WIN_DiagramReady(void)
{ {
return 0; return 0;
} }
#endif #endif
void
RemoveWindow(GRAPH *dgraph)
void RemoveWindow(GRAPH *dgraph)
{ {
tpWindowData wd; tpWindowData wd;
@ -998,15 +1002,15 @@ static void WIN_ScreentoData(GRAPH *graph, int x, int y, double *fx, double *fy)
double lmin, lmax; double lmin, lmax;
if (graph->grid.gridtype == GRID_XLOG || if (graph->grid.gridtype == GRID_XLOG ||
graph->grid.gridtype == GRID_LOGLOG)
{
graph->grid.gridtype == GRID_LOGLOG) {
lmin = log10(graph->datawindow.xmin); lmin = log10(graph->datawindow.xmin);
lmax = log10(graph->datawindow.xmax); lmax = log10(graph->datawindow.xmax);
*fx = exp(((x - graph->viewportxoff) * *fx = exp(((x - graph->viewportxoff) *
(lmax - lmin) / graph->viewport.width + lmin) * M_LN10);
} else {
(lmax - lmin) / graph->viewport.width + lmin) * M_LN10);
}
else {
*fx = (x - graph->viewportxoff) * graph->aspectratiox + *fx = (x - graph->viewportxoff) * graph->aspectratiox +
graph->datawindow.xmin;
graph->datawindow.xmin;
} }
if (graph->grid.gridtype == GRID_YLOG || if (graph->grid.gridtype == GRID_YLOG ||
@ -1015,10 +1019,10 @@ static void WIN_ScreentoData(GRAPH *graph, int x, int y, double *fx, double *fy)
lmin = log10(graph->datawindow.ymin); lmin = log10(graph->datawindow.ymin);
lmax = log10(graph->datawindow.ymax); lmax = log10(graph->datawindow.ymax);
*fy = exp(((graph->absolute.height - y - graph->viewportyoff) * *fy = exp(((graph->absolute.height - y - graph->viewportyoff) *
(lmax - lmin) / graph->viewport.height + lmin) * M_LN10);
(lmax - lmin) / graph->viewport.height + lmin) * M_LN10);
} else { } else {
*fy = ((graph->absolute.height - y) - graph->viewportyoff) * *fy = ((graph->absolute.height - y) - graph->viewportyoff) *
graph->aspectratioy + graph->datawindow.ymin;
graph->aspectratioy + graph->datawindow.ymin;
} }
} }

709
src/frontend/wdisp/winprint.c

@ -34,26 +34,26 @@
#include "winprint.h" /* function prototypes */ #include "winprint.h" /* function prototypes */
/* Typen */ /* Typen */
typedef struct { /* Extra Printdaten */
int ColorIndex; /* Index auf die akt. Farbe */
int LineIndex; /* Index auf den akt. Linientyp */
typedef struct { /* Extra Printdaten */
int ColorIndex; /* Index auf die akt. Farbe */
int LineIndex; /* Index auf den akt. Linientyp */
} tPrintData; } tPrintData;
typedef tPrintData * tpPrintData; /* Zeiger darauf */
typedef tPrintData *tpPrintData; /* Zeiger darauf */
#define pPrintData(g) ((tpPrintData)(g->devdep)) #define pPrintData(g) ((tpPrintData)(g->devdep))
/* externals */ /* externals */
void WaitForIdle(void); /* Warte, bis keine Events da */
void WaitForIdle(void); /* Warte, bis keine Events da */
/* lokale Variablen */ /* lokale Variablen */
static HFONT PlotFont = NULL; /* Font-Merker */
static HFONT OldFont = NULL;
#define NumLines 7 /* Anzahl der LineStyles */
static int LineTable[NumLines]; /* Speicher fuer die LineStyles */
static HDC PrinterDC = NULL; /* Device Context */
#define NumPrintColors 2 /* vordef. Farben */
static COLORREF ColorTable[NumPrintColors];/* Speicher fuer die Farben */
static int PrinterWidth = 1000; /* Breite des Papiers */
static int PrinterHeight = 1000; /* Hoehe des Papiers */
static HFONT PlotFont = NULL; /* Font-Merker */
static HFONT OldFont = NULL;
#define NumLines 7 /* Anzahl der LineStyles */
static int LineTable[NumLines]; /* Speicher fuer die LineStyles */
static HDC PrinterDC = NULL; /* Device Context */
#define NumPrintColors 2 /* vordef. Farben */
static COLORREF ColorTable[NumPrintColors];/* Speicher fuer die Farben */
static int PrinterWidth = 1000; /* Breite des Papiers */
static int PrinterHeight = 1000; /* Hoehe des Papiers */
/****************************************************************************** /******************************************************************************
Drucker-Initialisierung Drucker-Initialisierung
@ -61,59 +61,63 @@ static int PrinterHeight = 1000; /* Hoehe des Papiers */
void WPRINT_PrintInit(HWND hwnd) void WPRINT_PrintInit(HWND hwnd)
{ {
/* Parameter-Block */
PRINTDLG pd;
/* Initialisieren */
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.hDC = NULL;
pd.Flags = PD_PRINTSETUP;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 0;
pd.nMaxPage = 0;
pd.nCopies = 1;
pd.hInstance = NULL;
pd.lCustData = 0;
pd.lpfnPrintHook = NULL;
pd.lpfnSetupHook = NULL;
pd.lpPrintTemplateName = NULL;
pd.lpSetupTemplateName = NULL;
pd.hPrintTemplate = NULL;
pd.hSetupTemplate = NULL;
/* Default-Drucker initialisieren */
(void) PrintDlg( &pd);
/* Speicher freigeben */
if( pd.hDevMode) GlobalFree( pd.hDevMode);
if( pd.hDevNames) GlobalFree( pd.hDevNames);
/* Parameter-Block */
PRINTDLG pd;
/* Initialisieren */
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.hDC = NULL;
pd.Flags = PD_PRINTSETUP;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 0;
pd.nMaxPage = 0;
pd.nCopies = 1;
pd.hInstance = NULL;
pd.lCustData = 0;
pd.lpfnPrintHook = NULL;
pd.lpfnSetupHook = NULL;
pd.lpPrintTemplateName = NULL;
pd.lpSetupTemplateName = NULL;
pd.hPrintTemplate = NULL;
pd.hSetupTemplate = NULL;
/* Default-Drucker initialisieren */
(void) PrintDlg(&pd);
/* Speicher freigeben */
if (pd.hDevMode) {
GlobalFree(pd.hDevMode);
}
if (pd.hDevNames) {
GlobalFree(pd.hDevNames);
}
} }
/* Abort-Procedur zum Drucken */ /* Abort-Procedur zum Drucken */
BOOL CALLBACK WPRINT_Abort( HDC hdc, int iError)
BOOL CALLBACK WPRINT_Abort(HDC hdc, int iError)
{ {
NG_IGNORE(hdc); NG_IGNORE(hdc);
NG_IGNORE(iError); NG_IGNORE(iError);
/* Multitasking */ /* Multitasking */
WaitForIdle();
WaitForIdle();
/* Warten */
return TRUE;
/* Warten */
return TRUE;
} }
/****************************************************************************** /******************************************************************************
WPRINT_Init() stellt die Verbindung zur Grafik her. Dazu gehoert die Feststellung WPRINT_Init() stellt die Verbindung zur Grafik her. Dazu gehoert die Feststellung
von von
dispdev->numlinestyles
dispdev->numcolors
dispdev->width
dispdev->height
dispdev->numlinestyles
dispdev->numcolors
dispdev->width
dispdev->height
WPRINT_Init() gibt 0 zurueck, falls kein Fehler auftrat. WPRINT_Init() gibt 0 zurueck, falls kein Fehler auftrat.
@ -121,102 +125,108 @@ WPRINT_Init() gibt 0 zurueck, falls kein Fehler auftrat.
int WPRINT_Init(void) int WPRINT_Init(void)
{ {
int pWidth;
int pHeight;
/* Printer-DC holen */
if (!PrinterDC) {
/* Parameter-Block */
PRINTDLG pd;
/* Initialisieren */
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = NULL;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.hDC = NULL;
pd.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 0;
pd.nMaxPage = 0;
pd.nCopies = 1;
pd.hInstance = NULL;
pd.lCustData = 0;
pd.lpfnPrintHook = NULL;
pd.lpfnSetupHook = NULL;
pd.lpPrintTemplateName = NULL;
pd.lpSetupTemplateName = NULL;
pd.hPrintTemplate = NULL;
pd.hSetupTemplate = NULL;
/* Default-Drucker initialisieren */
(void) PrintDlg( &pd);
/* Speicher freigeben */
if( pd.hDevMode) GlobalFree( pd.hDevMode);
if( pd.hDevNames) GlobalFree( pd.hDevNames);
/* DC holen */
PrinterDC = pd.hDC;
if (!PrinterDC) return 1;
/* Abmasze bestimmen */
PrinterWidth = GetDeviceCaps( PrinterDC, HORZRES);
PrinterHeight = GetDeviceCaps( PrinterDC, VERTRES);
pWidth = GetDeviceCaps( PrinterDC, HORZSIZE);
pHeight = GetDeviceCaps( PrinterDC, VERTSIZE);
/* Mapping Mode setzen (fuer Kreise) */
if ( pWidth > pHeight)
/* Querformat */
PrinterWidth = (PrinterHeight * pWidth) / pHeight;
else
/* Hochformat */
PrinterHeight = (PrinterWidth * pHeight) / pWidth;
SetMapMode( PrinterDC, MM_ISOTROPIC);
SetWindowExtEx( PrinterDC, PrinterWidth, PrinterHeight, NULL);
SetViewportExtEx( PrinterDC, PrinterWidth, PrinterHeight, NULL);
/* nicht hoeher als breit zeichnen */
if (pWidth < pHeight) {
/* Papier im Hochformat */
PrinterHeight = PrinterWidth;
}
/* Initialisierungen des Display-Descriptors */
dispdev->width = PrinterWidth;
dispdev->height = PrinterHeight;
dispdev->numlinestyles = NumLines;
dispdev->numcolors = NumPrintColors;
/* Farben initialisieren */
ColorTable[0] = RGB(255,255,255); /* Weisz */
ColorTable[1] = RGB( 0, 0, 0); /* Schwarz */
/* LineStyles initialisieren */
LineTable[0] = PS_SOLID;
LineTable[1] = PS_DOT; /* Gitter */
LineTable[2] = PS_SOLID; /* Erste Linie */
LineTable[3] = PS_DOT; /* Zweite Linie */
LineTable[4] = PS_DASH; /* usw */
LineTable[5] = PS_DASHDOT;
LineTable[6] = PS_DASHDOTDOT;
/* Font */
if (!PlotFont) {
PlotFont = CreateFont( 0,0,0,0, FW_DONTCARE, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, FIXED_PITCH, NULL);
}
/* Abort-Prozedur setzen */
SetAbortProc( PrinterDC, WPRINT_Abort);
}
/* fertig */
return (0);
int pWidth;
int pHeight;
/* Printer-DC holen */
if (!PrinterDC) {
/* Parameter-Block */
PRINTDLG pd;
/* Initialisieren */
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = NULL;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.hDC = NULL;
pd.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 0;
pd.nMaxPage = 0;
pd.nCopies = 1;
pd.hInstance = NULL;
pd.lCustData = 0;
pd.lpfnPrintHook = NULL;
pd.lpfnSetupHook = NULL;
pd.lpPrintTemplateName = NULL;
pd.lpSetupTemplateName = NULL;
pd.hPrintTemplate = NULL;
pd.hSetupTemplate = NULL;
/* Default-Drucker initialisieren */
(void) PrintDlg(&pd);
/* Speicher freigeben */
if (pd.hDevMode) {
GlobalFree(pd.hDevMode);
}
if (pd.hDevNames) {
GlobalFree(pd.hDevNames);
}
/* DC holen */
PrinterDC = pd.hDC;
if (!PrinterDC) return 1;
/* Abmasze bestimmen */
PrinterWidth = GetDeviceCaps(PrinterDC, HORZRES);
PrinterHeight = GetDeviceCaps(PrinterDC, VERTRES);
pWidth = GetDeviceCaps(PrinterDC, HORZSIZE);
pHeight = GetDeviceCaps(PrinterDC, VERTSIZE);
/* Mapping Mode setzen (fuer Kreise) */
if (pWidth > pHeight) {
/* Querformat */
PrinterWidth = (PrinterHeight * pWidth) / pHeight;
}
else {
/* Hochformat */
PrinterHeight = (PrinterWidth * pHeight) / pWidth;
}
SetMapMode(PrinterDC, MM_ISOTROPIC);
SetWindowExtEx(PrinterDC, PrinterWidth, PrinterHeight, NULL);
SetViewportExtEx(PrinterDC, PrinterWidth, PrinterHeight, NULL);
/* nicht hoeher als breit zeichnen */
if (pWidth < pHeight) {
/* Papier im Hochformat */
PrinterHeight = PrinterWidth;
}
/* Initialisierungen des Display-Descriptors */
dispdev->width = PrinterWidth;
dispdev->height = PrinterHeight;
dispdev->numlinestyles = NumLines;
dispdev->numcolors = NumPrintColors;
/* Farben initialisieren */
ColorTable[0] = RGB(255,255,255); /* Weisz */
ColorTable[1] = RGB(0, 0, 0); /* Schwarz */
/* LineStyles initialisieren */
LineTable[0] = PS_SOLID;
LineTable[1] = PS_DOT; /* Gitter */
LineTable[2] = PS_SOLID; /* Erste Linie */
LineTable[3] = PS_DOT; /* Zweite Linie */
LineTable[4] = PS_DASH; /* usw */
LineTable[5] = PS_DASHDOT;
LineTable[6] = PS_DASHDOTDOT;
/* Font */
if (!PlotFont) {
PlotFont = CreateFont(0,0,0,0, FW_DONTCARE, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, FIXED_PITCH, NULL);
}
/* Abort-Prozedur setzen */
SetAbortProc(PrinterDC, WPRINT_Abort);
}
/* fertig */
return 0;
} }
@ -227,250 +237,275 @@ int WPRINT_Init(void)
******************************************************************************/ ******************************************************************************/
int WPRINT_NewViewport( GRAPH * graph)
int WPRINT_NewViewport(GRAPH * graph)
{ {
TEXTMETRIC tm;
tpPrintData pd;
DOCINFO di;
/* Parameter testen */
if (!graph) return 1;
/* Initialisiere, falls noch nicht geschehen */
if (WPRINT_Init() != 0) {
externalerror("Can't initialize Printer.");
return(1);
}
/* Device dep. Info allocieren */
pd = calloc(1, sizeof(tPrintData));
if (!pd) return 1;
graph->devdep = pd;
/* Setze den Color-Index */
pd->ColorIndex = 0;
/* Font setzen */
OldFont = SelectObject( PrinterDC, PlotFont);
/* Font-Parameter abfragen */
if (GetTextMetrics( PrinterDC, &tm)) {
graph->fontheight = tm.tmHeight;
graph->fontwidth = tm.tmAveCharWidth;
}
/* Setze den Linien-Index */
pd->LineIndex = 0;
/* Viewport-Parameter setzen */
graph->viewport.height = PrinterHeight;
graph->viewport.width = PrinterWidth;
/* Absolut-Parameter setzen */
graph->absolute.xpos = 0;
graph->absolute.ypos = 0;
graph->absolute.width = PrinterWidth;
graph->absolute.height = PrinterHeight;
/* Druckauftrag anmelden */
di.cbSize = sizeof( DOCINFO);
di.lpszDocName = graph->plotname;
di.lpszOutput = NULL;
if (StartDoc( PrinterDC, &di) <= 0) return 1;
if (StartPage( PrinterDC) <= 0) return 1;
/* titel drucken */
if (graph->plotname) {
UINT align;
align = GetTextAlign( PrinterDC);
SetTextAlign( PrinterDC, TA_RIGHT | TA_TOP | TA_NOUPDATECP);
TextOut( PrinterDC, PrinterWidth-graph->fontwidth, 1, graph->plotname,
(int)strlen(graph->plotname));
SetTextAlign( PrinterDC, align);
}
/* fertig */
return(0);
TEXTMETRIC tm;
tpPrintData pd;
DOCINFO di;
/* Parameter testen */
if (!graph) {
return 1;
}
/* Initialisiere, falls noch nicht geschehen */
if (WPRINT_Init() != 0) {
externalerror("Can't initialize Printer.");
return(1);
}
/* Device dep. Info allocieren */
pd = calloc(1, sizeof(tPrintData));
if (!pd) return 1;
graph->devdep = pd;
graph->n_byte_devdep = sizeof(tPrintData);
/* Setze den Color-Index */
pd->ColorIndex = 0;
/* Font setzen */
OldFont = SelectObject(PrinterDC, PlotFont);
/* Font-Parameter abfragen */
if (GetTextMetrics(PrinterDC, &tm)) {
graph->fontheight = tm.tmHeight;
graph->fontwidth = tm.tmAveCharWidth;
}
/* Setze den Linien-Index */
pd->LineIndex = 0;
/* Viewport-Parameter setzen */
graph->viewport.height = PrinterHeight;
graph->viewport.width = PrinterWidth;
/* Absolut-Parameter setzen */
graph->absolute.xpos = 0;
graph->absolute.ypos = 0;
graph->absolute.width = PrinterWidth;
graph->absolute.height = PrinterHeight;
/* Druckauftrag anmelden */
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = graph->plotname;
di.lpszOutput = NULL;
if (StartDoc(PrinterDC, &di) <= 0) {
return 1;
}
if (StartPage(PrinterDC) <= 0) {
return 1;
}
/* titel drucken */
if (graph->plotname) {
UINT align;
align = GetTextAlign(PrinterDC);
SetTextAlign(PrinterDC, TA_RIGHT | TA_TOP | TA_NOUPDATECP);
TextOut(PrinterDC, PrinterWidth-graph->fontwidth, 1, graph->plotname,
(int) strlen(graph->plotname));
SetTextAlign(PrinterDC, align);
}
/* fertig */
return 0;
} }
int WPRINT_Close(void) int WPRINT_Close(void)
{ {
if (PrinterDC) {
EndPage( PrinterDC);
EndDoc( PrinterDC);
if (OldFont) {
SelectObject( PrinterDC, OldFont);
OldFont = NULL;
}
DeleteObject( PlotFont);
DeleteDC( PrinterDC);
PrinterDC = NULL;
}
return (0);
if (PrinterDC) {
EndPage(PrinterDC);
EndDoc(PrinterDC);
if (OldFont) {
SelectObject(PrinterDC, OldFont);
OldFont = NULL;
}
DeleteObject(PlotFont);
DeleteDC(PrinterDC);
PrinterDC = NULL;
}
return 0;
} }
int WPRINT_Clear(void) int WPRINT_Clear(void)
{ {
return 0;
return 0;
} }
int WPRINT_DrawLine(int x1, int y1, int x2, int y2) int WPRINT_DrawLine(int x1, int y1, int x2, int y2)
{ {
tpPrintData pd;
HPEN OldPen;
HPEN NewPen;
int ColIndex;
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
/* Farben/Dicke */
ColIndex = pd->ColorIndex;
if (ColIndex > 1)
ColIndex = 1;
MoveToEx(PrinterDC, x1, PrinterHeight - y1, NULL);
NewPen = CreatePen( LineTable[pd->LineIndex], 0, ColorTable[ColIndex] );
OldPen = SelectObject(PrinterDC, NewPen);
LineTo(PrinterDC, x2, PrinterHeight - y2);
OldPen = SelectObject(PrinterDC, OldPen);
DeleteObject( NewPen);
return (0);
tpPrintData pd;
HPEN OldPen;
HPEN NewPen;
int ColIndex;
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
/* Farben/Dicke */
ColIndex = pd->ColorIndex;
if (ColIndex > 1)
ColIndex = 1;
MoveToEx(PrinterDC, x1, PrinterHeight - y1, NULL);
NewPen = CreatePen(LineTable[pd->LineIndex], 0, ColorTable[ColIndex] );
OldPen = SelectObject(PrinterDC, NewPen);
LineTo(PrinterDC, x2, PrinterHeight - y2);
OldPen = SelectObject(PrinterDC, OldPen);
DeleteObject(NewPen);
return 0;
} }
int WPRINT_Arc(int x0, int y0, int radius, double theta, double delta_theta) int WPRINT_Arc(int x0, int y0, int radius, double theta, double delta_theta)
/*
* Notes:
* Draws an arc of <radius> and center at (x0,y0) beginning at
* angle theta (in rad) and ending at theta + delta_theta
*/
/*
* Notes:
* Draws an arc of <radius> and center at (x0,y0) beginning at
* angle theta (in rad) and ending at theta + delta_theta
*/
{ {
tpPrintData pd;
HPEN OldPen;
HPEN NewPen;
int left, right, top, bottom;
int xs, ys, xe, ye;
int yb;
int direction;
int ColIndex;
double r;
double dx0;
double dy0;
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
ColIndex = pd->ColorIndex;
if (ColIndex > 1)
ColIndex = 1;
direction = AD_COUNTERCLOCKWISE;
if (delta_theta < 0) {
theta = theta + delta_theta;
delta_theta = - delta_theta;
direction = AD_CLOCKWISE;
}
SetArcDirection( PrinterDC, direction);
/* Geometrische Vorueberlegungen */
yb = PrinterHeight;
left = x0 - radius;
right = x0 + radius;
top = y0 + radius;
bottom = y0 - radius;
r = radius;
dx0 = x0;
dy0 = y0;
xs = (int)(dx0 + (r * cos(theta)));
ys = (int)(dy0 + (r * sin(theta)));
xe = (int)(dx0 + (r * cos(theta + delta_theta)));
ye = (int)(dy0 + (r * sin(theta + delta_theta)));
/* Zeichnen */
NewPen = CreatePen( LineTable[pd->LineIndex], 0, ColorTable[ColIndex] );
OldPen = SelectObject(PrinterDC, NewPen);
Arc( PrinterDC, left, yb-top, right, yb-bottom, xs, yb-ys, xe, yb-ye);
OldPen = SelectObject(PrinterDC, OldPen);
DeleteObject( NewPen);
return 0;
tpPrintData pd;
HPEN OldPen;
HPEN NewPen;
int left, right, top, bottom;
int xs, ys, xe, ye;
int yb;
int direction;
int ColIndex;
double r;
double dx0;
double dy0;
if (!currentgraph) {
return 0;
}
pd = pPrintData(currentgraph);
if (!pd) {
return 0;
}
ColIndex = pd->ColorIndex;
if (ColIndex > 1) {
ColIndex = 1;
}
direction = AD_COUNTERCLOCKWISE;
if (delta_theta < 0) {
theta = theta + delta_theta;
delta_theta = - delta_theta;
direction = AD_CLOCKWISE;
}
SetArcDirection(PrinterDC, direction);
/* Geometrische Vorueberlegungen */
yb = PrinterHeight;
left = x0 - radius;
right = x0 + radius;
top = y0 + radius;
bottom = y0 - radius;
r = radius;
dx0 = x0;
dy0 = y0;
xs = (int) (dx0 + (r * cos(theta)));
ys = (int) (dy0 + (r * sin(theta)));
xe = (int) (dx0 + (r * cos(theta + delta_theta)));
ye = (int) (dy0 + (r * sin(theta + delta_theta)));
/* Zeichnen */
NewPen = CreatePen(LineTable[pd->LineIndex], 0, ColorTable[ColIndex] );
OldPen = SelectObject(PrinterDC, NewPen);
Arc(PrinterDC, left, yb-top, right, yb-bottom, xs, yb-ys, xe, yb-ye);
OldPen = SelectObject(PrinterDC, OldPen);
DeleteObject(NewPen);
return 0;
} }
int WPRINT_Text( char * text, int x, int y, int degrees)
int WPRINT_Text(char * text, int x, int y, int degrees)
{ {
tpPrintData pd;
int ColIndex;
tpPrintData pd;
int ColIndex;
NG_IGNORE(degrees); NG_IGNORE(degrees);
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
ColIndex = pd->ColorIndex;
if (ColIndex > 1) {
ColIndex = 1;
}
SetTextColor( PrinterDC, ColorTable[ColIndex]);
TextOut( PrinterDC, x, PrinterHeight - y - currentgraph->fontheight, text, (int) strlen(text));
return (0);
if (!currentgraph) {
return 0;
}
pd = pPrintData(currentgraph);
if (!pd) {
return 0;
}
ColIndex = pd->ColorIndex;
if (ColIndex > 1) {
ColIndex = 1;
}
SetTextColor(PrinterDC, ColorTable[ColIndex]);
TextOut(PrinterDC, x, PrinterHeight - y - currentgraph->fontheight,
text, (int) strlen(text));
return 0;
} }
int WPRINT_DefineColor(int colorid, double red, double green, double blue) int WPRINT_DefineColor(int colorid, double red, double green, double blue)
{ {
/* nix */
/* nix */
NG_IGNORE(colorid); NG_IGNORE(colorid);
NG_IGNORE(red); NG_IGNORE(red);
NG_IGNORE(green); NG_IGNORE(green);
NG_IGNORE(blue); NG_IGNORE(blue);
return (0);
return 0;
} }
int WPRINT_DefineLinestyle(int num, int mask) int WPRINT_DefineLinestyle(int num, int mask)
{ {
/* nix */
/* nix */
NG_IGNORE(num); NG_IGNORE(num);
NG_IGNORE(mask); NG_IGNORE(mask);
return (0);
return 0;
} }
int WPRINT_SetLinestyle(int style) int WPRINT_SetLinestyle(int style)
{ {
tpPrintData pd;
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
pd->LineIndex = style % NumLines;
return (0);
tpPrintData pd;
if (!currentgraph) {
return 0;
}
pd = pPrintData(currentgraph);
if (!pd) {
return 0;
}
pd->LineIndex = style % NumLines;
return 0;
} }
int WPRINT_SetColor( int color)
int WPRINT_SetColor(int color)
{ {
tpPrintData pd;
if (!currentgraph) return 0;
pd = pPrintData(currentgraph);
if (!pd) return 0;
pd->ColorIndex = color;
return (0);
tpPrintData pd;
if (!currentgraph) {
return 0;
}
pd = pPrintData(currentgraph);
if (!pd) {
return 0;
}
pd->ColorIndex = color;
return 0;
} }
int WPRINT_Update(void) int WPRINT_Update(void)
{ {
return (0);
return 0;
} }
int WPRINT_DiagramReady(void) int WPRINT_DiagramReady(void)
{ {
return 0;
return 0;
} }
#endif /* HAS_WINGUI */ #endif /* HAS_WINGUI */

Loading…
Cancel
Save