|
|
1.1 root 1: /******************************Module*Header*******************************\
2: * Module Name: bitblt.c
3: *
4: * XGA bitblit accelerations
5: *
6: * Copyright (c) 1992 Microsoft Corporation
7: *
8: \**************************************************************************/
9:
10: #include "driver.h"
11:
12:
13: BOOL bSpecialBlits(
14: SURFOBJ *psoTrg,
15: SURFOBJ *psoSrc,
16: SURFOBJ *psoMask,
17: CLIPOBJ *pco,
18: XLATEOBJ *pxlo,
19: RECTL *prclTrg,
20: POINTL *pptlSrc,
21: POINTL *pptlMask,
22: BRUSHOBJ *pbo,
23: POINTL *pptlBrush,
24: ROP4 rop4
25: );
26:
27: BOOL bScrnToScrnCpy(
28: SURFOBJ *psoTrg,
29: SURFOBJ *psoSrc,
30: SURFOBJ *psoMask,
31: CLIPOBJ *pco,
32: XLATEOBJ *pxlo,
33: RECTL *prclTrg,
34: POINTL *pptlSrc,
35: POINTL *pptlMask,
36: BRUSHOBJ *pbo,
37: POINTL *pptlBrush,
38: ROP4 rop4
39: );
40:
41:
42: BOOL bSolidPattern(
43: SURFOBJ *psoTrg,
44: SURFOBJ *psoSrc,
45: SURFOBJ *psoMask,
46: CLIPOBJ *pco,
47: XLATEOBJ *pxlo,
48: RECTL *prclTrg,
49: POINTL *pptlSrc,
50: POINTL *pptlMask,
51: BRUSHOBJ *pbo,
52: POINTL *pptlBrush,
53: ROP4 rop4
54: );
55:
56:
57:
58: /******************************Public*Data*********************************\
59: * ROP translation table
60: *
61: * Translates the usual ternary rop into A-vector notation. Each bit in
62: * this new notation corresponds to a term in a polynomial translation of
63: * the rop.
64: *
65: * Rop(D,S,P) = a + a D + a S + a P + a DS + a DP + a SP + a DSP
66: * 0 d s p ds dp sp dsp
67: *
68: \**************************************************************************/
69:
70: BYTE gajRop[] =
71: {
72: 0x00, 0xff, 0xb2, 0x4d, 0xd4, 0x2b, 0x66, 0x99,
73: 0x90, 0x6f, 0x22, 0xdd, 0x44, 0xbb, 0xf6, 0x09,
74: 0xe8, 0x17, 0x5a, 0xa5, 0x3c, 0xc3, 0x8e, 0x71,
75: 0x78, 0x87, 0xca, 0x35, 0xac, 0x53, 0x1e, 0xe1,
76: 0xa0, 0x5f, 0x12, 0xed, 0x74, 0x8b, 0xc6, 0x39,
77: 0x30, 0xcf, 0x82, 0x7d, 0xe4, 0x1b, 0x56, 0xa9,
78: 0x48, 0xb7, 0xfa, 0x05, 0x9c, 0x63, 0x2e, 0xd1,
79: 0xd8, 0x27, 0x6a, 0x95, 0x0c, 0xf3, 0xbe, 0x41,
80: 0xc0, 0x3f, 0x72, 0x8d, 0x14, 0xeb, 0xa6, 0x59,
81: 0x50, 0xaf, 0xe2, 0x1d, 0x84, 0x7b, 0x36, 0xc9,
82: 0x28, 0xd7, 0x9a, 0x65, 0xfc, 0x03, 0x4e, 0xb1,
83: 0xb8, 0x47, 0x0a, 0xf5, 0x6c, 0x93, 0xde, 0x21,
84: 0x60, 0x9f, 0xd2, 0x2d, 0xb4, 0x4b, 0x06, 0xf9,
85: 0xf0, 0x0f, 0x42, 0xbd, 0x24, 0xdb, 0x96, 0x69,
86: 0x88, 0x77, 0x3a, 0xc5, 0x5c, 0xa3, 0xee, 0x11,
87: 0x18, 0xe7, 0xaa, 0x55, 0xcc, 0x33, 0x7e, 0x81,
88: 0x80, 0x7f, 0x32, 0xcd, 0x54, 0xab, 0xe6, 0x19,
89: 0x10, 0xef, 0xa2, 0x5d, 0xc4, 0x3b, 0x76, 0x89,
90: 0x68, 0x97, 0xda, 0x25, 0xbc, 0x43, 0x0e, 0xf1,
91: 0xf8, 0x07, 0x4a, 0xb5, 0x2c, 0xd3, 0x9e, 0x61,
92: 0x20, 0xdf, 0x92, 0x6d, 0xf4, 0x0b, 0x46, 0xb9,
93: 0xb0, 0x4f, 0x02, 0xfd, 0x64, 0x9b, 0xd6, 0x29,
94: 0xc8, 0x37, 0x7a, 0x85, 0x1c, 0xe3, 0xae, 0x51,
95: 0x58, 0xa7, 0xea, 0x15, 0x8c, 0x73, 0x3e, 0xc1,
96: 0x40, 0xbf, 0xf2, 0x0d, 0x94, 0x6b, 0x26, 0xd9,
97: 0xd0, 0x2f, 0x62, 0x9d, 0x04, 0xfb, 0xb6, 0x49,
98: 0xa8, 0x57, 0x1a, 0xe5, 0x7c, 0x83, 0xce, 0x31,
99: 0x38, 0xc7, 0x8a, 0x75, 0xec, 0x13, 0x5e, 0xa1,
100: 0xe0, 0x1f, 0x52, 0xad, 0x34, 0xcb, 0x86, 0x79,
101: 0x70, 0x8f, 0xc2, 0x3d, 0xa4, 0x5b, 0x16, 0xe9,
102: 0x08, 0xf7, 0xba, 0x45, 0xdc, 0x23, 0x6e, 0x91,
103: 0x98, 0x67, 0x2a, 0xd5, 0x4c, 0xb3, 0xfe, 0x01
104: };
105:
106:
107: /*****************************************************************************
108: * XGA DrvBitBlt
109: ****************************************************************************/
110: BOOL DrvBitBlt(
111: SURFOBJ *psoTrg,
112: SURFOBJ *psoSrc,
113: SURFOBJ *psoMask,
114: CLIPOBJ *pco,
115: XLATEOBJ *pxlo,
116: RECTL *prclTrg,
117: POINTL *pptlSrc,
118: POINTL *pptlMask,
119: BRUSHOBJ *pbo,
120: POINTL *pptlBrush,
121: ROP4 rop4)
122:
123: {
124: BOOL b;
125:
126:
127: b = bSpecialBlits(psoTrg, psoSrc, psoMask,
128: pco, pxlo,
129: prclTrg, pptlSrc, pptlMask,
130: pbo, pptlBrush,
131: rop4);
132: if (b == TRUE)
133: {
134: return (TRUE);
135: }
136:
137: if ((psoTrg) && (psoTrg->iType == STYPE_DEVICE))
138: psoTrg = ((PPDEV)(psoTrg->dhpdev))->pSurfObj;
139:
140: if ((psoSrc) && (psoSrc->iType == STYPE_DEVICE))
141: psoSrc = ((PPDEV)(psoSrc->dhpdev))->pSurfObj;
142:
143: EngBitBlt(psoTrg,
144: psoSrc,
145: psoMask,
146: pco,
147: pxlo,
148: prclTrg,
149: pptlSrc,
150: pptlMask,
151: pbo,
152: pptlBrush,
153: rop4);
154:
155:
156: }
157:
158:
159: /*****************************************************************************
160: * XGA Special case Blit handler
161: *
162: * Returns TRUE if the blit was handled.
163: ****************************************************************************/
164: BOOL bSpecialBlits(
165: SURFOBJ *psoTrg,
166: SURFOBJ *psoSrc,
167: SURFOBJ *psoMask,
168: CLIPOBJ *pco,
169: XLATEOBJ *pxlo,
170: RECTL *prclTrg,
171: POINTL *pptlSrc,
172: POINTL *pptlMask,
173: BRUSHOBJ *pbo,
174: POINTL *pptlBrush,
175: ROP4 rop4)
176: {
177: BOOL b;
178: HSURF hsurfSrc, hsurfTrg;
179:
180: b = FALSE;
181:
182: DISPDBG((3, "XGA.DLL!bSpecialBlits - rop4: %8.8X\n", rop4));
183: DISPDBG((3, "XGA.DLL!bSpecialBlits - pbo : %8.8X\n", pbo));
184:
185: // Wait for the coprocessor.
186:
187: vWaitForCoProcessor((PPDEV)psoTrg->dhpdev, 100);
188:
189: // NOTE: If the ForeRop and BackRop are the same implicitly
190: // there is no mask.
191:
192: // First test for a screen to screen copy.
193:
194: if (rop4 == 0x0000CCCC)
195: {
196:
197: if (psoTrg != NULL)
198: hsurfTrg = psoTrg->hsurf;
199:
200: if (psoSrc != NULL)
201: hsurfSrc = psoSrc->hsurf;
202:
203: if (hsurfTrg == hsurfSrc)
204: {
205:
206: if (((PPDEV)psoTrg->dhpdev)->ulfBlitAccelerations_debug & SCRN_TO_SCRN_CPY)
207: {
208: b = bScrnToScrnCpy(psoTrg, psoSrc, psoMask,
209: pco, pxlo,
210: prclTrg, pptlSrc, pptlMask,
211: pbo, pptlBrush,
212: rop4);
213: }
214: else
215: {
216: b = FALSE;
217: }
218:
219: }
220:
221: }
222:
223: // Check for a Solid Brush.
224:
225: if (rop4 == 0x0000F0F0)
226: {
227: if (pbo->iSolidColor != -1)
228: {
229: if (((PPDEV)psoTrg->dhpdev)->ulfBlitAccelerations_debug & SOLID_PATTERN)
230: {
231: b = bSolidPattern(psoTrg, psoSrc, psoMask,
232: pco, pxlo,
233: prclTrg, pptlSrc, pptlMask,
234: pbo, pptlBrush,
235: rop4);
236: }
237: else
238: {
239: b = FALSE;
240: }
241:
242: }
243:
244: }
245:
246: return (b);
247:
248: }
249:
250:
251: /*****************************************************************************
252: * XGA Screen to Screen Copy
253: *
254: * Returns TRUE if the blit was handled.
255: ****************************************************************************/
256: BOOL bScrnToScrnCpy(
257: SURFOBJ *psoTrg,
258: SURFOBJ *psoSrc,
259: SURFOBJ *psoMask,
260: CLIPOBJ *pco,
261: XLATEOBJ *pxlo,
262: RECTL *prclTrg,
263: POINTL *pptlSrc,
264: POINTL *pptlMask,
265: BRUSHOBJ *pbo,
266: POINTL *pptlBrush,
267: ROP4 rop4)
268: {
269: BOOL b;
270: INT width,
271: height,
272: xTrg,
273: yTrg,
274: xSrc,
275: ySrc;
276:
277: ULONG ulDirCode,
278: XGAPixelOp,
279: ulXgaMask;
280:
281: PXGACPREGS pXgaCpRegs = ((PPDEV)psoTrg->dhpdev)->pXgaCpRegs;
282:
283:
284: // Important Note: When we get time we should test the Coprocessor
285: // for being busy. If its not then we should execute the code here.
286: // If it is busy we should queue the request. This implies an
287: // interrupt driven XGA.
288:
289: b = bSetXgaClipping((PPDEV)psoTrg->dhpdev, pco, &ulXgaMask);
290: if (b == FALSE)
291: return (b);
292:
293: // Setup the BitBlt parameters.
294:
295: width = (prclTrg->right - prclTrg->left) - 1;
296: height = (prclTrg->bottom - prclTrg->top) - 1;
297:
298: // We need to determine the direction of the blit.
299:
300: ulDirCode = 0;
301: xTrg = prclTrg->left;
302: yTrg = prclTrg->top;
303: xSrc = pptlSrc->x;
304: ySrc = pptlSrc->y;
305:
306: // The horizontal copy direction.
307:
308: if (prclTrg->left > pptlSrc->x)
309: {
310: // R to L
311:
312: xTrg = prclTrg->right - 1;
313: xSrc = pptlSrc->x + width;
314: ulDirCode |= OCT_DX;
315: }
316:
317: // The vertical copy direction.
318:
319: if (prclTrg->top > pptlSrc->y)
320: {
321: // B to T
322:
323: yTrg = prclTrg->bottom - 1;
324: ySrc = pptlSrc->y + height;
325: ulDirCode |= OCT_DY;
326: }
327:
328: pXgaCpRegs->XGAOpDim1 = width;
329: pXgaCpRegs->XGAOpDim2 = height;
330:
331: pXgaCpRegs->XGASourceMapX = xSrc;
332: pXgaCpRegs->XGASourceMapY = ySrc;
333:
334: pXgaCpRegs->XGADestMapX = xTrg;
335: pXgaCpRegs->XGADestMapY = yTrg;
336:
337: pXgaCpRegs->XGAForeGrMix = XGA_S;
338: pXgaCpRegs->XGABackGrMix = XGA_S;
339:
340:
341: // Now build the Pel Operation Register Op Code;
342:
343: XGAPixelOp = BS_SRC_PEL_MAP | FS_SRC_PEL_MAP |
344: STEP_PX_BLT |
345: SRC_PEL_MAP_A | DST_PEL_MAP_A |
346: PATT_FOREGROUND;
347:
348: XGAPixelOp |= ulDirCode;
349: XGAPixelOp |= ulXgaMask;
350:
351: pXgaCpRegs->XGAPixelOp = XGAPixelOp;
352:
353:
354: return (TRUE);
355:
356:
357: }
358:
359: /*****************************************************************************
360: * XGA Solid Pattern
361: *
362: * Returns TRUE if the blit was handled.
363: ****************************************************************************/
364: BOOL bSolidPattern(
365: SURFOBJ *psoTrg,
366: SURFOBJ *psoSrc,
367: SURFOBJ *psoMask,
368: CLIPOBJ *pco,
369: XLATEOBJ *pxlo,
370: RECTL *prclTrg,
371: POINTL *pptlSrc,
372: POINTL *pptlMask,
373: BRUSHOBJ *pbo,
374: POINTL *pptlBrush,
375: ROP4 rop4)
376: {
377: BOOL b;
378: INT width,
379: height;
380:
381: ULONG XGAPixelOp,
382: ulXgaMask;
383:
384: PXGACPREGS pXgaCpRegs = ((PPDEV)psoTrg->dhpdev)->pXgaCpRegs;
385:
386:
387: DISPDBG((2, "XGA.DLL!bSolidPattern - Entry\n"));
388:
389: b = bSetXgaClipping((PPDEV)psoTrg->dhpdev,pco, &ulXgaMask);
390: if (b == FALSE)
391: return (b);
392:
393: // Setup the BitBlt parameters.
394:
395: width = (prclTrg->right - prclTrg->left) - 1;
396: height = (prclTrg->bottom - prclTrg->top) - 1;
397:
398: pXgaCpRegs->XGAOpDim1 = width;
399: pXgaCpRegs->XGAOpDim2 = height;
400:
401: pXgaCpRegs->XGADestMapX = (USHORT) prclTrg->left;
402: pXgaCpRegs->XGADestMapY = (USHORT) prclTrg->top;
403:
404: pXgaCpRegs->XGAForeGrMix = XGA_S;
405: pXgaCpRegs->XGABackGrMix = XGA_S;
406:
407: pXgaCpRegs->XGAForeGrColorReg = pbo->iSolidColor;
408: pXgaCpRegs->XGABackGrColorReg = pbo->iSolidColor;
409:
410: // Now build the Pel Operation Register Op Code;
411:
412: XGAPixelOp = BS_BACK_COLOR | FS_FORE_COLOR |
413: STEP_PX_BLT |
414: SRC_PEL_MAP_A | DST_PEL_MAP_A |
415: PATT_FOREGROUND;
416:
417: XGAPixelOp |= ulXgaMask;
418:
419: pXgaCpRegs->XGAPixelOp = XGAPixelOp;
420:
421: return (TRUE);
422:
423: }
424:
425: /*****************************************************************************
426: * XGA DrvCopyBits
427: ****************************************************************************/
428: BOOL DrvCopyBits(
429: SURFOBJ *psoDest,
430: SURFOBJ *psoSrc,
431: CLIPOBJ *pco,
432: XLATEOBJ *pxlo,
433: RECTL *prclDest,
434: POINTL *pptlSrc)
435: {
436: BOOL b;
437:
438: CLIPOBJ coLocal;
439: SURFOBJ *pso;
440:
441: DISPDBG((2, "XGA.DLL: DrvCopyBits - Entry\n"));
442:
443: // Need to determine which surface is the display.
444: // So we can pickup the address of the XGA coprocessor regs.
445:
446: if ((psoDest) && (psoDest->iType == STYPE_DEVICE))
447: pso = psoDest;
448:
449: else if ((psoSrc) && (psoSrc->iType == STYPE_DEVICE))
450: pso = psoSrc;
451:
452: else
453: {
454: RIP ("XGA.DLL!DrvCopyBits - neither surface is a device surface\n");
455: return (TRUE);
456: }
457:
458: // Wait for the coprocessor.
459:
460: vWaitForCoProcessor((PPDEV)pso->dhpdev, 100);
461:
462: // Protect this routine from a potentially NULL clip object
463:
464: if (pco == NULL)
465: {
466: coLocal.iDComplexity = DC_RECT;
467:
468: coLocal.rclBounds.left = 0;
469: coLocal.rclBounds.top = 0;
470: coLocal.rclBounds.right = ((PPDEV)pso->dhpdev)->cxScreen;
471: coLocal.rclBounds.bottom = ((PPDEV)pso->dhpdev)->cyScreen;
472:
473: pco = &coLocal;
474:
475: }
476:
477: // Check for a Screen to Screen or a Host to Screen blit.
478:
479: b = FALSE;
480:
481: if ((psoDest->iType == STYPE_DEVICE) &&
482: (psoSrc->iType == STYPE_DEVICE) &&
483: (((PPDEV)psoDest->dhpdev)->ulfBlitAccelerations_debug & SCRN_TO_SCRN_CPY))
484: {
485: b = bScrnToScrnCpy(psoDest,
486: psoSrc,
487: NULL,
488: pco,
489: pxlo,
490: prclDest,
491: pptlSrc,
492: NULL,
493: NULL,
494: NULL,
495: 0xcccc);
496: }
497:
498: if (b == FALSE)
499: {
500: if ((psoDest) && (psoDest->iType == STYPE_DEVICE))
501: psoDest = ((PPDEV)(psoDest->dhpdev))->pSurfObj;
502:
503: if ((psoSrc) && (psoSrc->iType == STYPE_DEVICE))
504: psoSrc = ((PPDEV)(psoSrc->dhpdev))->pSurfObj;
505:
506: EngCopyBits(psoDest,
507: psoSrc,
508: pco,
509: pxlo,
510: prclDest,
511: pptlSrc);
512:
513: }
514:
515: return (TRUE);
516:
517: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.