Annotation of ntddk/src/video/displays/vga/brush.c, revision 1.1

1.1     ! root        1: /******************************Module*Header*******************************\
        !             2: * Module Name: brush.c
        !             3: *
        !             4: * Contains the brush realization and dithering code.
        !             5: *
        !             6: * Copyright (c) 1992 Microsoft Corporation
        !             7: \**************************************************************************/
        !             8: #include "driver.h"
        !             9: 
        !            10: #define OBR_REALIZED 1
        !            11: #define OBR_4BPP     2
        !            12: 
        !            13: // aulDefBitMapping is used to translate packed pel into Planar
        !            14: 
        !            15: extern  ULONG aulDefBitMapping[8];
        !            16: extern  ULONG gRealizedBrushHeight[HS_DDI_MAX*2];
        !            17: extern  BYTE  gaajRealizedPat[HS_DDI_MAX][32];
        !            18: 
        !            19: // Asm routines
        !            20: 
        !            21: ULONG CountColors(VOID *, ULONG, WORD *, DWORD);
        !            22: BOOL bQuickPattern(BYTE *, ULONG);
        !            23: BOOL bShrinkPattern(BYTE *, ULONG);
        !            24: 
        !            25: VOID vMono16Wide(DWORD *, DWORD *, DWORD);
        !            26: VOID vMono8Wide(DWORD *, DWORD *, DWORD);
        !            27: VOID vMono4Wide(DWORD *, DWORD *, DWORD);
        !            28: VOID vMono2Wide(DWORD *, DWORD *, DWORD);
        !            29: VOID vBrush2ColorToMono(BYTE *, BYTE *, DWORD, DWORD, BYTE);
        !            30: VOID vConvert4BppToPlanar(BYTE *, BYTE *, DWORD, DWORD *);
        !            31: VOID vConvert8BppToPlanar(BYTE *, BYTE *, DWORD, DWORD *);
        !            32: VOID vCopyOrgBrush(BYTE   *pDest, BYTE   *pSrc, LONG   lScan, XLATEOBJ *pxlo);
        !            33: VOID vCreatePlaneMasks(BYTE *, BYTE *);
        !            34: SURFOBJ *DrvConvertBrush(SURFOBJ *psoPattern, HBITMAP *phbmTmp, XLATEOBJ *pxlo,
        !            35:     ULONG cx, ULONG cy);
        !            36: 
        !            37: typedef VOID (*PFNV)();
        !            38: 
        !            39: /******************************Public*Routine******************************\
        !            40: * DrvRealizeBrush
        !            41: *
        !            42: *
        !            43: \**************************************************************************/
        !            44: 
        !            45: BOOL DrvRealizeBrush(
        !            46: BRUSHOBJ *pbo,
        !            47: SURFOBJ  *psoTarget,
        !            48: SURFOBJ  *psoPattern,
        !            49: SURFOBJ  *psoMask,
        !            50: XLATEOBJ *pxlo,
        !            51: ULONG    iHatch)
        !            52: {
        !            53:     ULONG           cx;                 // Height of pattern surface
        !            54:     ULONG           cy;                 // Width  of pattern surface
        !            55:     LONG            cbScan;             // Width in bytes of one scan
        !            56:     PVOID           pvBits;             // Source bits
        !            57:     ULONG          *pulXlate;           // Color translation
        !            58:     HBITMAP         hbmTmp;             // Temp bmp handle for brush conversion
        !            59:     BRUSHINST      *pbri;               // pointer to where realization goes
        !            60:     BYTE            jBkColor, jFgColor; // local copies of mono attributes
        !            61:     PFNV            pfnConvert;         // function pointer to mono conversion
        !            62:     BYTE            jColors[2];         // place holder for special color->mono
        !            63:                                         // conversion.
        !            64:     BOOL            bConversion = FALSE; // True if we converted to 4bpp
        !            65: 
        !            66:     cx = psoPattern->sizlBitmap.cx;
        !            67:     cy = psoPattern->sizlBitmap.cy;
        !            68: 
        !            69:     if ((cy != 8) || (cx > 16))
        !            70:     {
        !            71:         return(FALSE);
        !            72:     }
        !            73: 
        !            74:     pbri = BRUSHOBJ_pvAllocRbrush(pbo,sizeof(BRUSHINST));
        !            75:     if (pbri == (BRUSHINST *)NULL)
        !            76:         return(FALSE);
        !            77: 
        !            78:     pbri->RealWidth = (BYTE)cx;
        !            79: 
        !            80:     switch (psoPattern->iBitmapFormat)
        !            81:     {
        !            82:     case BMF_1BPP:
        !            83:     case BMF_4BPP:
        !            84:     case BMF_8BPP:
        !            85:         break;
        !            86: 
        !            87:     default:
        !            88:         if ((cx != 8) && (cx != 16))
        !            89:             return(FALSE);
        !            90: 
        !            91:         // Convert to 4bpp
        !            92: 
        !            93:         psoPattern = DrvConvertBrush(psoPattern, &hbmTmp, pxlo, cx, cy);
        !            94:         if (psoPattern == (SURFOBJ *)NULL)
        !            95:             return(FALSE);
        !            96: 
        !            97:         bConversion = TRUE;
        !            98:         break;
        !            99:     }
        !           100: 
        !           101:     //
        !           102:     // Setup the pointer to the bits, and the scan-to-scan advance direction.
        !           103:     //
        !           104:     cbScan = psoPattern->lDelta;
        !           105:     pvBits = psoPattern->pvScan0;
        !           106: 
        !           107:     //
        !           108:     // If this is a hatch brush, we already have it in realized form.
        !           109:     //
        !           110:     if ((iHatch < HS_DDI_MAX) && (psoPattern->iBitmapFormat == BMF_1BPP))
        !           111:     {
        !           112:         pbri->usStyle = BRI_MONO_PATTERN;
        !           113:         pbri->fjAccel = 0;
        !           114:         pbri->Width = 16;
        !           115:         pbri->Height = gRealizedBrushHeight[iHatch*2];
        !           116:         pbri->YShiftValue = (BYTE)gRealizedBrushHeight[(iHatch*2)+1];
        !           117:         pbri->pPattern = (BYTE *)&(gaajRealizedPat[iHatch]);
        !           118:         pbri->jBkColor =  (BYTE)pxlo->pulXlate[0];
        !           119:         pbri->jFgColor =  (BYTE)pxlo->pulXlate[1];
        !           120:         pbri->jOldBrushRealized = 0;
        !           121: 
        !           122:         return(TRUE);
        !           123:     }
        !           124: 
        !           125:     if (psoPattern->iBitmapFormat == BMF_1BPP)
        !           126:     {
        !           127:         switch (cx) {
        !           128:             case 16:
        !           129:                 if ((bShrinkPattern)((BYTE *)pvBits, cbScan))
        !           130:                 {
        !           131:                     cx = 8;
        !           132:                     pbri->RealWidth = (BYTE)cx;
        !           133:                 } else {
        !           134:                     pfnConvert = vMono16Wide;
        !           135:                     break;
        !           136:                 }
        !           137:             case 8:
        !           138:                 pfnConvert = vMono8Wide;
        !           139:                 break;
        !           140: 
        !           141:             case 2:
        !           142:                 pfnConvert = vMono2Wide;
        !           143:                 break;
        !           144: 
        !           145:             case 4:
        !           146:                 pfnConvert = vMono4Wide;
        !           147:                 break;
        !           148: 
        !           149:             default:
        !           150:                 return(FALSE);
        !           151:         }
        !           152: 
        !           153:         pbri->usStyle = BRI_MONO_PATTERN;
        !           154:         pbri->fjAccel = 0;
        !           155:         pbri->jBkColor =  (BYTE)pxlo->pulXlate[0];
        !           156:         pbri->jFgColor =  (BYTE)pxlo->pulXlate[1];
        !           157:         pbri->Width = 16;
        !           158:         pbri->pPattern = (BYTE *)&(pbri->ajPattern[0]);
        !           159:         pbri->jOldBrushRealized = 0;
        !           160: 
        !           161:         (*pfnConvert)(pbri->pPattern, pvBits, cbScan);
        !           162: 
        !           163:         if (bQuickPattern(pbri->pPattern, 8))
        !           164:         {
        !           165:             pbri->Height = 2;
        !           166:             pbri->YShiftValue = 1;
        !           167:         }
        !           168:         else
        !           169:         {
        !           170:             pbri->Height = 8;
        !           171:             pbri->YShiftValue = 3;
        !           172:         }
        !           173: 
        !           174:         return(TRUE);
        !           175:     }
        !           176: 
        !           177:     if ((cx != 8) && (cx != 16))
        !           178:         return(FALSE);
        !           179: 
        !           180:     if (pxlo->flXlate & XO_TABLE)
        !           181:         pulXlate = pxlo->pulXlate;
        !           182:     else
        !           183:         pulXlate = (PULONG)NULL;
        !           184: 
        !           185:     if ((psoPattern->iBitmapFormat == BMF_4BPP) &&
        !           186:             (CountColors(pvBits, cx, (WORD *)&jColors, cbScan) == 2)) {
        !           187: 
        !           188:         if ((cx == 16) && (bShrinkPattern)((BYTE *)pvBits, cbScan))
        !           189:         {
        !           190:             cx = 8;
        !           191:             pbri->RealWidth = (BYTE)cx;
        !           192:         }
        !           193: 
        !           194:         pbri->usStyle = BRI_MONO_PATTERN;
        !           195:         pbri->Height = 8;
        !           196:         pbri->YShiftValue = 3;
        !           197:         pbri->Width = 16;
        !           198:         pbri->fjAccel = 1;
        !           199:         pbri->pPattern = (BYTE *)&(pbri->ajPattern[0]);
        !           200:         pbri->jOldBrushRealized = OBR_4BPP;
        !           201: 
        !           202:         if (pulXlate != (PULONG)NULL) {
        !           203: 
        !           204:             jBkColor = (BYTE)pulXlate[jColors[0]];
        !           205:             jFgColor = (BYTE)pulXlate[jColors[1]];
        !           206:         } else {
        !           207: 
        !           208:             jBkColor = jColors[0];
        !           209:             jFgColor = jColors[1];
        !           210:         }
        !           211: 
        !           212:         if (jBkColor > jFgColor) {
        !           213:             pbri->jBkColor = jBkColor;
        !           214:             pbri->jFgColor = jFgColor;
        !           215:         } else {
        !           216:             pbri->jBkColor = jFgColor;
        !           217:             pbri->jFgColor = jBkColor;
        !           218:         }
        !           219: 
        !           220: 
        !           221:         vBrush2ColorToMono(pbri->pPattern, (BYTE *)pvBits, cbScan,
        !           222:                 cx, pbri->jBkColor);
        !           223: 
        !           224:         if (bQuickPattern(pbri->pPattern, 8))
        !           225:         {
        !           226:             pbri->Height = 2;
        !           227:             pbri->YShiftValue = 1;
        !           228:         }
        !           229: 
        !           230:         vCopyOrgBrush(&(pbri->ajC0[0]),pvBits, cbScan, pxlo);
        !           231: 
        !           232:         if (bConversion) {
        !           233:             EngUnlockSurface(psoPattern);
        !           234:             EngDeleteSurface((HSURF)hbmTmp);
        !           235:         }
        !           236: 
        !           237:         return(TRUE);
        !           238:     }
        !           239:     else if (cx != 8)
        !           240:         return(FALSE);
        !           241: 
        !           242:     pbri->pPattern = (BYTE *)&(pbri->ajC0[0]);
        !           243: 
        !           244:     // At this point we know we have an 8x8 color pattern in either a
        !           245:     // 4bpp or 8bpp format.
        !           246: 
        !           247:     if (psoPattern->iBitmapFormat == BMF_4BPP)
        !           248:         vConvert4BppToPlanar(pbri->pPattern, (BYTE *)pvBits, cbScan, pulXlate);
        !           249: 
        !           250:     else // 8bpp
        !           251:         vConvert8BppToPlanar(pbri->pPattern, (BYTE *)pvBits, cbScan, pulXlate);
        !           252: #ifdef FAST_PLANE
        !           253:     vCreatePlaneMasks(&(pbri->ajPlaneMasks),pbri->pPattern);
        !           254: #endif
        !           255:     // Set proper accelerators in the brush for the output code.
        !           256: 
        !           257:     pbri->usStyle = BRI_COLOR_PATTERN;  // Brush style is arbitrary pattern
        !           258:     pbri->fjAccel = 0;                  // Accelerator flags - no special casing
        !           259:     pbri->Height = 8;
        !           260:     pbri->YShiftValue = 3;
        !           261:     pbri->Width = 8;
        !           262:     pbri->fjAccel = 1;
        !           263:     pbri->jOldBrushRealized = OBR_REALIZED|OBR_4BPP;
        !           264: 
        !           265:     if (bConversion) {
        !           266:         EngUnlockSurface(psoPattern);
        !           267:         EngDeleteSurface((HSURF)hbmTmp);
        !           268:     }
        !           269: 
        !           270:     return(TRUE);
        !           271: }
        !           272: 
        !           273: /****************************************************************************\
        !           274: * DrvvConvertBrush()
        !           275: *
        !           276: * Converts a brush to a 4bpp bmp
        !           277: *
        !           278: \****************************************************************************/
        !           279: 
        !           280: SURFOBJ *DrvConvertBrush(
        !           281:     SURFOBJ  *psoPattern,
        !           282:     HBITMAP  *phbmTmp,
        !           283:     XLATEOBJ *pxlo,
        !           284:     ULONG    cx,
        !           285:     ULONG    cy)
        !           286: {
        !           287:     SURFOBJ *psoTmp;
        !           288:     RECTL    rclTmp;
        !           289:     SIZEL    sizlTmp;
        !           290:     POINTL   ptl;
        !           291: 
        !           292:     ptl.x       = 0;
        !           293:     ptl.y       = 0;
        !           294:     rclTmp.top  = 0;
        !           295:     rclTmp.left = 0;
        !           296:     rclTmp.right  = cx;
        !           297:     sizlTmp.cx = cx;
        !           298:     rclTmp.bottom = cy;
        !           299:     sizlTmp.cy = cy;
        !           300: 
        !           301:     // Create bitmap in our compatible format.
        !           302: 
        !           303:     *phbmTmp = EngCreateBitmap(sizlTmp, cx / 2, BMF_4BPP, 0, NULL);
        !           304: 
        !           305:     if ((*phbmTmp) && ((psoTmp = EngLockSurface((HSURF)*phbmTmp)) != NULL))
        !           306:     {
        !           307:         if (EngCopyBits(psoTmp, psoPattern, NULL, pxlo, &rclTmp, &ptl))
        !           308:             return(psoTmp);
        !           309: 
        !           310:         EngUnlockSurface(psoTmp);
        !           311:         EngDeleteSurface((HSURF)*phbmTmp);
        !           312:     }
        !           313: 
        !           314:     return((SURFOBJ *)NULL);
        !           315: }
        !           316: 
        !           317: 
        !           318: /****************************************************************************\
        !           319: * vCopyOrgBrush
        !           320: *
        !           321: * When we realize a mono or 2 color brush, we copy the original 4bpp brush
        !           322: * to the ajC0 area of the realized brush. If we are called to do a
        !           323: * rop that we don't directly support, vConvertBrush will be called to
        !           324: * convert the orginal 4bpp brush to a planar brush that the blt compiler can
        !           325: * use. Since this is a rare event, we do this on request instead of at
        !           326: * realization time.
        !           327: *
        !           328: \****************************************************************************/
        !           329: 
        !           330: VOID vCopyOrgBrush(
        !           331:     BYTE   *pDest,
        !           332:     BYTE   *pSrc,
        !           333:     LONG   lScan,
        !           334:     XLATEOBJ *pxlo)
        !           335: {
        !           336:     ULONG *pulXlate, *pulDest;
        !           337:     BYTE jByte, jColor;
        !           338:     int i;
        !           339: 
        !           340:     if (pxlo->flXlate & XO_TABLE) {
        !           341:         pulXlate = pxlo->pulXlate;
        !           342: 
        !           343:         for (i=0;i<32;i++) {
        !           344: 
        !           345:             jColor = *pSrc;         // Get Next byte
        !           346:             jByte = jColor;
        !           347: 
        !           348:             jByte = pulXlate[jByte & 0xf];
        !           349:             jByte = pulXlate[(jColor >> 4) & 0xf] << 4;
        !           350:             *pDest = jByte;
        !           351: 
        !           352:             pSrc += lScan;
        !           353:             pDest++;
        !           354:         }
        !           355:     } else {
        !           356:         pulDest = (ULONG *)pDest;
        !           357: 
        !           358:         for (i=0;i<8;i++) {
        !           359:             *pulDest = *(ULONG *)pSrc;
        !           360: 
        !           361:             pSrc += lScan;
        !           362:             pulDest++;
        !           363:         }
        !           364: 
        !           365:     }
        !           366: }
        !           367: 
        !           368: 
        !           369: /****************************************************************************\
        !           370: * vConvertBrush()
        !           371: *
        !           372: * This called when we are going to do a rop3 with a non-solid brush. We have
        !           373: * to convert our brush back to the old blt compiler format in order for this
        !           374: * blt to work properly.
        !           375: *
        !           376: \****************************************************************************/
        !           377: 
        !           378: BOOL bConvertBrush(
        !           379:     BRUSHINST   *pbri)
        !           380: {
        !           381:     BYTE jPattern[32];
        !           382:     if (pbri->jOldBrushRealized & OBR_REALIZED)
        !           383:         return(TRUE);
        !           384: 
        !           385:     //
        !           386:     // The blt compiler only handles 8x8
        !           387:     //
        !           388:     if (pbri->RealWidth != 8)
        !           389:         return(FALSE);
        !           390: 
        !           391:     if (pbri->jOldBrushRealized & OBR_4BPP) {
        !           392:         memcpy(&(jPattern[0]), &(pbri->ajC0[0]), 32);
        !           393:         vConvert4BppToPlanar(&(pbri->ajC0[0]), &(jPattern[0]), 4, NULL);
        !           394:         pbri->jOldBrushRealized |= OBR_REALIZED;
        !           395: 
        !           396:         return(TRUE);
        !           397:     }
        !           398: 
        !           399:     return(FALSE);
        !           400: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.