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
)
23 /***********************************************************************
26 BOOL
PSDRV_LineTo(DC
*dc
, INT x
, INT y
)
28 TRACE("%d %d\n", x
, y
);
31 PSDRV_WriteMoveTo(dc
, XLPTODP(dc
, dc
->w
.CursPosX
),
32 YLPTODP(dc
, dc
->w
.CursPosY
));
33 PSDRV_WriteLineTo(dc
, XLPTODP(dc
, x
), YLPTODP(dc
, y
));
40 /***********************************************************************
43 BOOL
PSDRV_Rectangle( DC
*dc
, INT left
, INT top
, INT right
,
46 INT width
= XLSTODS(dc
, right
- left
);
47 INT height
= YLSTODS(dc
, bottom
- top
);
50 TRACE("%d %d - %d %d\n", left
, top
, right
, bottom
);
52 PSDRV_WriteRectangle(dc
, XLPTODP(dc
, left
), YLPTODP(dc
, top
),
62 /***********************************************************************
65 BOOL
PSDRV_RoundRect( DC
*dc
, INT left
, INT top
, INT right
,
66 INT bottom
, INT ell_width
, INT ell_height
)
68 left
= XLPTODP( dc
, left
);
69 right
= XLPTODP( dc
, right
);
70 top
= YLPTODP( dc
, top
);
71 bottom
= YLPTODP( dc
, bottom
);
72 ell_width
= XLSTODS( dc
, ell_width
);
73 ell_height
= YLSTODS( dc
, ell_height
);
75 if( left
> right
) { INT tmp
= left
; left
= right
; right
= tmp
; }
76 if( top
> bottom
) { INT tmp
= top
; top
= bottom
; bottom
= tmp
; }
78 if(ell_width
> right
- left
) ell_width
= right
- left
;
79 if(ell_height
> bottom
- top
) ell_height
= bottom
- top
;
81 PSDRV_WriteMoveTo( dc
, left
, top
+ ell_height
/2 );
82 PSDRV_WriteArc( dc
, left
+ ell_width
/2, top
+ ell_height
/2, ell_width
,
83 ell_height
, 90.0, 180.0);
84 PSDRV_WriteLineTo( dc
, right
- ell_width
/2, top
);
85 PSDRV_WriteArc( dc
, right
- ell_width
/2, top
+ ell_height
/2, ell_width
,
86 ell_height
, 0.0, 90.0);
87 PSDRV_WriteLineTo( dc
, right
, bottom
- ell_height
/2 );
88 PSDRV_WriteArc( dc
, right
- ell_width
/2, bottom
- ell_height
/2, ell_width
,
89 ell_height
, -90.0, 0.0);
90 PSDRV_WriteLineTo( dc
, right
- ell_width
/2, bottom
);
91 PSDRV_WriteArc( dc
, left
+ ell_width
/2, bottom
- ell_height
/2, ell_width
,
92 ell_height
, 180.0, -90.0);
93 PSDRV_WriteClosePath( dc
);
101 /***********************************************************************
104 * Does the work of Arc, Chord and Pie. lines is 0, 1 or 2 respectively.
106 static BOOL
PSDRV_DrawArc( DC
*dc
, INT left
, INT top
,
107 INT right
, INT bottom
,
108 INT xstart
, INT ystart
,
113 double start_angle
, end_angle
, ratio
;
115 x
= XLPTODP(dc
, (left
+ right
)/2);
116 y
= YLPTODP(dc
, (top
+ bottom
)/2);
118 w
= XLSTODS(dc
, (right
- left
));
119 h
= YLSTODS(dc
, (bottom
- top
));
123 ratio
= ((double)w
)/h
;
125 /* angle is the angle after the rectangle is transformed to a square and is
126 measured anticlockwise from the +ve x-axis */
128 start_angle
= atan2((double)(y
- ystart
) * ratio
, (double)(xstart
- x
));
129 end_angle
= atan2((double)(y
- yend
) * ratio
, (double)(xend
- x
));
131 start_angle
*= 180.0 / PI
;
132 end_angle
*= 180.0 / PI
;
134 if(lines
== 2) /* pie */
135 PSDRV_WriteMoveTo(dc
, x
, y
);
137 PSDRV_WriteNewPath( dc
);
139 PSDRV_WriteArc(dc
, x
, y
, w
, h
, start_angle
, end_angle
);
140 if(lines
== 1 || lines
== 2) { /* chord or pie */
141 PSDRV_WriteClosePath(dc
);
150 /***********************************************************************
153 BOOL
PSDRV_Arc( DC
*dc
, INT left
, INT top
, INT right
, INT bottom
,
154 INT xstart
, INT ystart
, INT xend
, INT yend
)
156 return PSDRV_DrawArc( dc
, left
, top
, right
, bottom
, xstart
, ystart
,
160 /***********************************************************************
163 BOOL
PSDRV_Chord( DC
*dc
, INT left
, INT top
, INT right
, INT bottom
,
164 INT xstart
, INT ystart
, INT xend
, INT yend
)
166 return PSDRV_DrawArc( dc
, left
, top
, right
, bottom
, xstart
, ystart
,
171 /***********************************************************************
174 BOOL
PSDRV_Pie( DC
*dc
, INT left
, INT top
, INT right
, INT bottom
,
175 INT xstart
, INT ystart
, INT xend
, INT yend
)
177 return PSDRV_DrawArc( dc
, left
, top
, right
, bottom
, xstart
, ystart
,
182 /***********************************************************************
185 BOOL
PSDRV_Ellipse( DC
*dc
, INT left
, INT top
, INT right
, INT bottom
)
189 TRACE("%d %d - %d %d\n", left
, top
, right
, bottom
);
191 x
= XLPTODP(dc
, (left
+ right
)/2);
192 y
= YLPTODP(dc
, (top
+ bottom
)/2);
194 w
= XLSTODS(dc
, (right
- left
));
195 h
= YLSTODS(dc
, (bottom
- top
));
197 PSDRV_WriteNewPath(dc
);
198 PSDRV_WriteArc(dc
, x
, y
, w
, h
, 0.0, 360.0);
199 PSDRV_WriteClosePath(dc
);
207 /***********************************************************************
210 BOOL
PSDRV_PolyPolyline( DC
*dc
, const POINT
* pts
, const DWORD
* counts
,
213 DWORD polyline
, line
;
218 for(polyline
= 0; polyline
< polylines
; polyline
++) {
219 PSDRV_WriteMoveTo(dc
, XLPTODP(dc
, pt
->x
), YLPTODP(dc
, pt
->y
));
221 for(line
= 1; line
< counts
[polyline
]; line
++) {
222 PSDRV_WriteLineTo(dc
, XLPTODP(dc
, pt
->x
), YLPTODP(dc
, pt
->y
));
232 /***********************************************************************
235 BOOL
PSDRV_Polyline( DC
*dc
, const POINT
* pt
, INT count
)
237 return PSDRV_PolyPolyline( dc
, pt
, (LPDWORD
) &count
, 1 );
241 /***********************************************************************
244 BOOL
PSDRV_PolyPolygon( DC
*dc
, const POINT
* pts
, const INT
* counts
,
252 for(polygon
= 0; polygon
< polygons
; polygon
++) {
253 PSDRV_WriteMoveTo(dc
, XLPTODP(dc
, pt
->x
), YLPTODP(dc
, pt
->y
));
255 for(line
= 1; line
< counts
[polygon
]; line
++) {
256 PSDRV_WriteLineTo(dc
, XLPTODP(dc
, pt
->x
), YLPTODP(dc
, pt
->y
));
259 PSDRV_WriteClosePath(dc
);
262 if(dc
->w
.polyFillMode
== ALTERNATE
)
272 /***********************************************************************
275 BOOL
PSDRV_Polygon( DC
*dc
, const POINT
* pt
, INT count
)
277 return PSDRV_PolyPolygon( dc
, pt
, &count
, 1 );
281 /***********************************************************************
284 COLORREF
PSDRV_SetPixel( DC
*dc
, INT x
, INT y
, COLORREF color
)
286 PSDRV_PDEVICE
*physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
292 PSDRV_WriteRectangle( dc
, x
, y
, 0, 0 );
293 PSDRV_CreateColor( physDev
, &pscolor
, color
);
294 PSDRV_WriteSetColor( dc
, &pscolor
);
295 PSDRV_WriteFill( dc
);
300 /***********************************************************************
303 VOID
PSDRV_DrawLine( DC
*dc
)
305 PSDRV_PDEVICE
*physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
307 if (physDev
->pen
.style
== PS_NULL
)
308 PSDRV_WriteNewPath(dc
);
310 PSDRV_WriteStroke(dc
);