2 * PostScript driver graphics functions
4 * Copyright 1998 Huw D M Davies
10 #if defined(HAVE_FLOAT_H)
17 #include "debugtools.h"
20 DEFAULT_DEBUG_CHANNEL(psdrv)
22 /**********************************************************************
25 BOOL PSDRV_MoveToEx(DC *dc, INT x, INT y, LPPOINT pt)
27 TRACE("%d %d\n", x, y);
30 pt->x = dc->w.CursPosX;
31 pt->y = dc->w.CursPosY;
40 /***********************************************************************
43 BOOL PSDRV_LineTo(DC *dc, INT x, INT y)
45 TRACE("%d %d\n", x, y);
48 PSDRV_WriteMoveTo(dc, XLPTODP(dc, dc->w.CursPosX),
49 YLPTODP(dc, dc->w.CursPosY));
50 PSDRV_WriteLineTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
51 PSDRV_WriteStroke(dc);
59 /***********************************************************************
62 BOOL PSDRV_Rectangle( DC *dc, INT left, INT top, INT right,
65 INT width = XLSTODS(dc, right - left);
66 INT height = YLSTODS(dc, bottom - top);
69 TRACE("%d %d - %d %d\n", left, top, right, bottom);
71 PSDRV_WriteRectangle(dc, XLPTODP(dc, left), YLPTODP(dc, top),
76 PSDRV_WriteStroke(dc);
81 /***********************************************************************
84 BOOL PSDRV_RoundRect( DC *dc, INT left, INT top, INT right,
85 INT bottom, INT ell_width, INT ell_height )
87 left = XLPTODP( dc, left );
88 right = XLPTODP( dc, right );
89 top = YLPTODP( dc, top );
90 bottom = YLPTODP( dc, bottom );
91 ell_width = XLSTODS( dc, ell_width );
92 ell_height = YLSTODS( dc, ell_height );
94 if( left > right ) { INT tmp = left; left = right; right = tmp; }
95 if( top > bottom ) { INT tmp = top; top = bottom; bottom = tmp; }
97 if(ell_width > right - left) ell_width = right - left;
98 if(ell_height > bottom - top) ell_height = bottom - top;
100 PSDRV_WriteMoveTo( dc, left, top + ell_height/2 );
101 PSDRV_WriteArc( dc, left + ell_width/2, top + ell_height/2, ell_width,
102 ell_height, 90.0, 180.0);
103 PSDRV_WriteLineTo( dc, right - ell_width/2, top );
104 PSDRV_WriteArc( dc, right - ell_width/2, top + ell_height/2, ell_width,
105 ell_height, 0.0, 90.0);
106 PSDRV_WriteLineTo( dc, right, bottom - ell_height/2 );
107 PSDRV_WriteArc( dc, right - ell_width/2, bottom - ell_height/2, ell_width,
108 ell_height, -90.0, 0.0);
109 PSDRV_WriteLineTo( dc, right - ell_width/2, bottom);
110 PSDRV_WriteArc( dc, left + ell_width/2, bottom - ell_height/2, ell_width,
111 ell_height, 180.0, -90.0);
112 PSDRV_WriteClosePath( dc );
116 PSDRV_WriteStroke(dc);
120 /***********************************************************************
123 * Does the work of Arc, Chord and Pie. lines is 0, 1 or 2 respectively.
125 static BOOL PSDRV_DrawArc( DC *dc, INT left, INT top,
126 INT right, INT bottom,
127 INT xstart, INT ystart,
132 double start_angle, end_angle, ratio;
134 x = XLPTODP(dc, (left + right)/2);
135 y = YLPTODP(dc, (top + bottom)/2);
137 w = XLSTODS(dc, (right - left));
138 h = YLSTODS(dc, (bottom - top));
142 ratio = ((double)w)/h;
144 /* angle is the angle after the rectangle is transformed to a square and is
145 measured anticlockwise from the +ve x-axis */
147 start_angle = atan2((double)(y - ystart) * ratio, (double)(xstart - x));
148 end_angle = atan2((double)(y - yend) * ratio, (double)(xend - x));
150 start_angle *= 180.0 / PI;
151 end_angle *= 180.0 / PI;
153 if(lines == 2) /* pie */
154 PSDRV_WriteMoveTo(dc, x, y);
156 PSDRV_WriteNewPath( dc );
158 PSDRV_WriteArc(dc, x, y, w, h, start_angle, end_angle);
159 if(lines == 1 || lines == 2) { /* chord or pie */
160 PSDRV_WriteClosePath(dc);
164 PSDRV_WriteStroke(dc);
169 /***********************************************************************
172 BOOL PSDRV_Arc( DC *dc, INT left, INT top, INT right, INT bottom,
173 INT xstart, INT ystart, INT xend, INT yend )
175 return PSDRV_DrawArc( dc, left, top, right, bottom, xstart, ystart,
179 /***********************************************************************
182 BOOL PSDRV_Chord( DC *dc, INT left, INT top, INT right, INT bottom,
183 INT xstart, INT ystart, INT xend, INT yend )
185 return PSDRV_DrawArc( dc, left, top, right, bottom, xstart, ystart,
190 /***********************************************************************
193 BOOL PSDRV_Pie( DC *dc, INT left, INT top, INT right, INT bottom,
194 INT xstart, INT ystart, INT xend, INT yend )
196 return PSDRV_DrawArc( dc, left, top, right, bottom, xstart, ystart,
201 /***********************************************************************
204 BOOL PSDRV_Ellipse( DC *dc, INT left, INT top, INT right, INT bottom)
208 TRACE("%d %d - %d %d\n", left, top, right, bottom);
210 x = XLPTODP(dc, (left + right)/2);
211 y = YLPTODP(dc, (top + bottom)/2);
213 w = XLSTODS(dc, (right - left));
214 h = YLSTODS(dc, (bottom - top));
216 PSDRV_WriteArc(dc, x, y, w, h, 0.0, 360.0);
217 PSDRV_WriteClosePath(dc);
220 PSDRV_WriteStroke(dc);
225 /***********************************************************************
228 BOOL PSDRV_PolyPolyline( DC *dc, const POINT* pts, const DWORD* counts,
231 DWORD polyline, line;
236 for(polyline = 0; polyline < polylines; polyline++) {
237 PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
239 for(line = 1; line < counts[polyline]; line++) {
240 PSDRV_WriteLineTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
245 PSDRV_WriteStroke(dc);
250 /***********************************************************************
253 BOOL PSDRV_Polyline( DC *dc, const POINT* pt, INT count )
255 return PSDRV_PolyPolyline( dc, pt, (LPDWORD) &count, 1 );
259 /***********************************************************************
262 BOOL PSDRV_PolyPolygon( DC *dc, const POINT* pts, const INT* counts,
270 for(polygon = 0; polygon < polygons; polygon++) {
271 PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
273 for(line = 1; line < counts[polygon]; line++) {
274 PSDRV_WriteLineTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
277 PSDRV_WriteClosePath(dc);
280 if(dc->w.polyFillMode == ALTERNATE)
285 PSDRV_WriteStroke(dc);
290 /***********************************************************************
293 BOOL PSDRV_Polygon( DC *dc, const POINT* pt, INT count )
295 return PSDRV_PolyPolygon( dc, pt, &count, 1 );
299 /***********************************************************************
302 COLORREF PSDRV_SetPixel( DC *dc, INT x, INT y, COLORREF color )
304 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
310 PSDRV_WriteRectangle( dc, x, y, 0, 0 );
311 PSDRV_CreateColor( physDev, &pscolor, color );
312 PSDRV_WriteSetColor( dc, &pscolor );
313 PSDRV_WriteFill( dc );