|
|
1.1 root 1: /******************************Module*Header*******************************\
2: * Module Name: paint.c
3: *
4: * DrvPaint
5: *
6: * Copyright (c) 1992 Microsoft Corporation
7: \**************************************************************************/
8: #include "driver.h"
9: #include "bitblt.h"
10:
11: static DDAOBJ *gpdda = (DDAOBJ *) NULL;
12:
13: /******************************Public*Data*********************************\
14: * MIX translation table
15: *
16: * Translates a mix 1-16, into an old style Rop 0-255.
17: *
18: \**************************************************************************/
19:
20: BYTE gaMix[] =
21: {
22: 0xFF, // R2_WHITE - Allow rop = gaMix[mix & 0x0F]
23: 0x00, // R2_BLACK
24: 0x05, // R2_NOTMERGEPEN
25: 0x0A, // R2_MASKNOTPEN
26: 0x0F, // R2_NOTCOPYPEN
27: 0x50, // R2_MASKPENNOT
28: 0x55, // R2_NOT
29: 0x5A, // R2_XORPEN
30: 0x5F, // R2_NOTMASKPEN
31: 0xA0, // R2_MASKPEN
32: 0xA5, // R2_NOTXORPEN
33: 0xAA, // R2_NOP
34: 0xAF, // R2_MERGENOTPEN
35: 0xF0, // R2_COPYPEN
36: 0xF5, // R2_MERGEPENNOT
37: 0xFA, // R2_MERGEPEN
38: 0xFF // R2_WHITE
39: };
40:
41: /******************************Public*Routine******************************\
42: * vTrgTrap(pdsurf, ptrap, mix, iColor)
43: *
44: * Blit to a trapezoid.
45: *
46: \**************************************************************************/
47:
48: VOID vTrgTrap
49: (
50: PDEVSURF pdsurf,
51: TRAPEZOID *ptrap,
52: MIX mix,
53: ULONG iColor,
54: BRUSHINST *pbri,
55: POINTL *pptlBrush
56: )
57: {
58: DDAENUM ddae;
59: RECTL rcl[MAX_DDA_RECTS], *prcl;
60: ULONG culrcl;
61: LONG *px;
62: LONG yRow;
63: VOID (*pfnPatBlt)(PDEVSURF,ULONG,PRECTL,MIX, BRUSHINST *,PPOINTL);
64:
65: if (!DDAOBJ_bEnum(gpdda, (PVOID) ptrap, sizeof(ddae), (DDALIST *) &ddae,
66: JD_ENUM_TRAPEZOID))
67: return;
68:
69: if (pbri != (BRUSHINST *)NULL) {
70: if (pbri->usStyle != BRI_MONO_PATTERN)
71: pfnPatBlt = vClrPatBlt;
72: else
73: pfnPatBlt = vMonoPatBlt;
74: }
75:
76: do {
77: culrcl = 0;
78: prcl = rcl;
79: px = &ddae.axPairs[0];
80:
81: // Accumulate the rectangles for this trapezoid enumeration burst,
82: // then send them to the solid filler as a group
83: for (yRow = ddae.yTop; yRow < ddae.yBottom; yRow++) {
84: if (*px < *(px+1)) {
85: prcl->top = yRow;
86: prcl->left = *px;
87: prcl->bottom = yRow + 1;
88: prcl++->right = *(px+1);
89: culrcl++;
90: }
91:
92: px += 2;
93:
94: }
95:
96: // Draw the rectangles, if there are any
97: if (culrcl > 0) {
98: if (pbri == (BRUSHINST *)NULL)
99: vTrgBlt(pdsurf, culrcl, rcl, mix, iColor);
100: else
101: (*pfnPatBlt)(pdsurf, culrcl, rcl, mix, pbri, pptlBrush);
102: }
103:
104: } while (DDAOBJ_bEnum(gpdda, (PVOID) NULL, sizeof(ddae), (DDALIST *) &ddae,
105: JD_ENUM_TRAPEZOID));
106: }
107:
108: /******************************Public*Routine******************************\
109: * bPaintRgn
110: *
111: * Paint the clipping region with the specified color and mode
112: *
113: \**************************************************************************/
114:
115: BOOL bPaintRgn
116: (
117: SURFOBJ *pso,
118: CLIPOBJ *pco,
119: ULONG iColor,
120: MIX mix,
121: BRUSHINST *pbri,
122: POINTL *pptlBrush
123: )
124: {
125: RECT_ENUM bben;
126: BBENUMTRAP bbent;
127: PDEVSURF pdsurf;
128: ULONG iRT;
129: BOOL bMore;
130: VOID (*pfnPatBlt)(PDEVSURF,ULONG,PRECTL,MIX, BRUSHINST *,PPOINTL);
131:
132: if (pbri != (BRUSHINST *)NULL) {
133: if (pbri->usStyle != BRI_MONO_PATTERN)
134: pfnPatBlt = vClrPatBlt;
135: else
136: pfnPatBlt = vMonoPatBlt;
137: }
138:
139: // Get the target surface information.
140: pdsurf = (PDEVSURF) pso->dhsurf;
141:
142: switch(pco->iMode) {
143:
144: case TC_RECTANGLES:
145:
146: // Rectangular clipping can be handled without enumeration.
147: // Note that trivial clipping is not possible, since the clipping
148: // region defines the area to fill
149: if (pco->iDComplexity == DC_RECT) {
150: if (pbri == (BRUSHINST *)NULL)
151: vTrgBlt(pdsurf, 1, &pco->rclBounds, mix, iColor);
152: else
153: (*pfnPatBlt)(pdsurf, 1, &pco->rclBounds, mix, pbri,pptlBrush);
154:
155: } else {
156:
157: // Enumerate all the rectangles and draw them
158:
159: CLIPOBJ_cEnumStart(pco,TRUE,CT_RECTANGLES,CD_ANY,ENUM_RECT_LIMIT);
160:
161: do {
162: bMore = CLIPOBJ_bEnum(pco, sizeof(bben), (PVOID) &bben);
163:
164: if (pbri == (BRUSHINST *)NULL)
165: vTrgBlt(pdsurf, bben.c, &bben.arcl[0], mix, iColor);
166: else
167: (*pfnPatBlt)(pdsurf, bben.c, &bben.arcl[0], mix, pbri,
168: pptlBrush);
169:
170: } while (bMore);
171: }
172:
173: return(TRUE);
174:
175: case TC_TRAPEZOIDS:
176:
177: // !!! HACK - Get a DDA for trapezoid enumeration
178:
179: if ((gpdda = EngCreateDDA()) == NULL) {
180: return(FALSE);
181: }
182:
183: // Enumerate all the trapezoids and draw them
184:
185: CLIPOBJ_cEnumStart(pco,TRUE,CT_TRAPEZOIDS,CD_ANY,ENUM_RECT_LIMIT);
186:
187: do {
188: bMore = CLIPOBJ_bEnum(pco, sizeof(bbent), (PVOID) &bbent);
189:
190: for (iRT = 0; iRT < bbent.c; iRT++)
191: vTrgTrap(pdsurf, &bbent.atrap[iRT], mix, iColor, pbri,
192: pptlBrush);
193:
194: } while (bMore);
195:
196: EngDeleteDDA(gpdda); // !!! Rest of above hack!
197:
198: return(TRUE);
199:
200: default:
201: RIP("bPaintRgn: unhandled TC_xxx\n");
202: return(FALSE);
203: }
204: }
205:
206:
207: /******************************Public*Routine******************************\
208: * DrvPaint
209: *
210: * Paint the clipping region with the specified brush
211: *
212: \**************************************************************************/
213:
214: BOOL DrvPaint
215: (
216: SURFOBJ *pso,
217: CLIPOBJ *pco,
218: BRUSHOBJ *pbo,
219: POINTL *pptlBrush,
220: MIX mix
221: )
222: {
223: ROP4 rop4;
224: ULONG iSolidColor; // Solid color for solid brushes
225: BRUSHINST *pbri; // Pointer to a brush instance
226:
227: pbri = (BRUSHINST *)NULL;
228: iSolidColor = 0;
229:
230: // If the foreground and background mixes are the same,
231: // (LATER or if there's no brush mask)
232: // then see if we can use the solid brush accelerators
233:
234: if ((mix & 0xFF) == ((mix >> 8) & 0xFF)) {
235:
236: switch (mix & 0xFF) {
237: case 0:
238: break;
239:
240: // vTrgBlt can only handle solid color fills where if the
241: // destination is inverted, no other action is also required
242: case R2_MASKNOTPEN:
243: case R2_NOTCOPYPEN:
244: case R2_XORPEN:
245: case R2_MASKPEN:
246: case R2_NOTXORPEN:
247: case R2_MERGENOTPEN:
248: case R2_COPYPEN:
249: case R2_MERGEPEN:
250: case R2_NOTMERGEPEN:
251: case R2_MASKPENNOT:
252: case R2_NOTMASKPEN:
253: case R2_MERGEPENNOT:
254:
255: // vTrgBlt can only handle solid color fills
256:
257: if (pbo->iSolidColor != 0xffffffff)
258: iSolidColor = pbo->iSolidColor;
259:
260: else
261: {
262: // TrgBlt can only handle solid brushes, but let's
263: // see if we can use our special case pattern code.
264: //
265: if (pbo->pvRbrush == (PVOID)NULL)
266: {
267: pbri = (BRUSHINST *)BRUSHOBJ_pvGetRbrush(pbo);
268:
269: if (pbri == (BRUSHINST *)NULL)
270: break;
271: }
272: else
273: {
274: pbri = (BRUSHINST *)pbo->pvRbrush;
275: }
276:
277: // We only support non-8 wide brushes with R2_COPYPEN
278:
279: if (((mix & 0xFF) != R2_COPYPEN) && (pbri->RealWidth != 8))
280: break;
281:
282: }
283:
284: // Rops that are implicit solid colors
285:
286: case R2_NOT:
287: case R2_WHITE:
288: case R2_BLACK:
289:
290: // Brush color parameter doesn't matter for these rops
291:
292: return(bPaintRgn(pso, pco, iSolidColor, mix, pbri, pptlBrush));
293:
294: case R2_NOP:
295: return(TRUE);
296:
297: default:
298: break;
299: }
300: }
301:
302: rop4 = (gaMix[(mix >> 8) & 0x0F]) << 8;
303: rop4 |= ((ULONG) gaMix[mix & 0x0F]);
304:
305: return(DrvBitBlt(
306: pso,
307: (SURFOBJ *) NULL,
308: (SURFOBJ *) NULL,
309: pco,
310: (XLATEOBJ *) NULL,
311: &pco->rclBounds,
312: (POINTL *) NULL,
313: (POINTL *) NULL,
314: pbo,
315: pptlBrush,
316: rop4));
317: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.