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