2 * PostScript brush handling
4 * Copyright 1998 Huw D M Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/debug.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
27 /***********************************************************************
28 * SelectBrush (WINEPS.@)
30 HBRUSH CDECL
PSDRV_SelectBrush( PHYSDEV dev
, HBRUSH hbrush
, const struct brush_pattern
*pattern
)
32 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
35 if (!GetObjectA( hbrush
, sizeof(logbrush
), &logbrush
)) return 0;
37 TRACE("hbrush = %p\n", hbrush
);
39 if (hbrush
== GetStockObject( DC_BRUSH
))
40 logbrush
.lbColor
= GetDCBrushColor( dev
->hdc
);
42 switch(logbrush
.lbStyle
) {
45 PSDRV_CreateColor(dev
, &physDev
->brush
.color
, logbrush
.lbColor
);
52 PSDRV_CreateColor(dev
, &physDev
->brush
.color
, logbrush
.lbColor
);
57 physDev
->brush
.pattern
= *pattern
;
61 FIXME("Unrecognized brush style %d\n", logbrush
.lbStyle
);
65 physDev
->brush
.set
= FALSE
;
70 /***********************************************************************
71 * SetDCBrushColor (WINEPS.@)
73 COLORREF CDECL
PSDRV_SetDCBrushColor( PHYSDEV dev
, COLORREF color
)
75 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
77 if (GetCurrentObject( dev
->hdc
, OBJ_BRUSH
) == GetStockObject( DC_BRUSH
))
79 PSDRV_CreateColor( dev
, &physDev
->brush
.color
, color
);
80 physDev
->brush
.set
= FALSE
;
86 /**********************************************************************
91 static BOOL
PSDRV_SetBrush( PHYSDEV dev
)
93 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
97 if (!GetObjectA( GetCurrentObject(dev
->hdc
,OBJ_BRUSH
), sizeof(logbrush
), &logbrush
))
99 ERR("Can't get BRUSHOBJ\n");
103 switch (logbrush
.lbStyle
) {
106 PSDRV_WriteSetColor(dev
, &physDev
->brush
.color
);
117 physDev
->brush
.set
= TRUE
;
122 /**********************************************************************
127 static BOOL
PSDRV_Fill(PHYSDEV dev
, BOOL EO
)
130 return PSDRV_WriteFill(dev
);
132 return PSDRV_WriteEOFill(dev
);
136 /**********************************************************************
141 static BOOL
PSDRV_Clip(PHYSDEV dev
, BOOL EO
)
144 return PSDRV_WriteClip(dev
);
146 return PSDRV_WriteEOClip(dev
);
149 /**********************************************************************
154 BOOL
PSDRV_Brush(PHYSDEV dev
, BOOL EO
)
156 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
160 if(physDev
->pathdepth
)
163 if (!GetObjectA( GetCurrentObject(dev
->hdc
,OBJ_BRUSH
), sizeof(logbrush
), &logbrush
))
165 ERR("Can't get BRUSHOBJ\n");
169 switch (logbrush
.lbStyle
) {
171 PSDRV_WriteGSave(dev
);
174 PSDRV_WriteGRestore(dev
);
178 PSDRV_WriteGSave(dev
);
181 switch(logbrush
.lbHatch
) {
184 PSDRV_WriteGSave(dev
);
186 PSDRV_WriteHatch(dev
);
187 PSDRV_WriteStroke(dev
);
188 PSDRV_WriteGRestore(dev
);
189 if(logbrush
.lbHatch
== HS_VERTICAL
)
191 /* else fallthrough for HS_CROSS */
194 PSDRV_WriteGSave(dev
);
196 PSDRV_WriteRotate(dev
, 90.0);
197 PSDRV_WriteHatch(dev
);
198 PSDRV_WriteStroke(dev
);
199 PSDRV_WriteGRestore(dev
);
204 PSDRV_WriteGSave(dev
);
206 PSDRV_WriteRotate(dev
, -45.0);
207 PSDRV_WriteHatch(dev
);
208 PSDRV_WriteStroke(dev
);
209 PSDRV_WriteGRestore(dev
);
210 if(logbrush
.lbHatch
== HS_FDIAGONAL
)
212 /* else fallthrough for HS_DIAGCROSS */
215 PSDRV_WriteGSave(dev
);
217 PSDRV_WriteRotate(dev
, 45.0);
218 PSDRV_WriteHatch(dev
);
219 PSDRV_WriteStroke(dev
);
220 PSDRV_WriteGRestore(dev
);
224 ERR("Unknown hatch style\n");
228 PSDRV_WriteGRestore(dev
);
236 if(physDev
->pi
->ppd
->LanguageLevel
> 1) {
237 PSDRV_WriteGSave(dev
);
238 ret
= PSDRV_WriteDIBPatternDict(dev
, physDev
->brush
.pattern
.info
,
239 physDev
->brush
.pattern
.bits
.ptr
, physDev
->brush
.pattern
.usage
);
241 PSDRV_WriteGRestore(dev
);
243 FIXME("Trying to set a pattern brush on a level 1 printer\n");