Annotation of ntddk/src/video/displays/s3/brush.c, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: Brush.c
                      3: *
                      4: * S3 Brush support
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: *
                      8: \**************************************************************************/
                      9: 
                     10: #include "driver.h"
                     11: 
                     12: 
                     13: /****************************************************************************
                     14:  *
                     15:  ***************************************************************************/
                     16: BOOL DrvRealizeBrush(
                     17:     BRUSHOBJ *pbo,
                     18:     SURFOBJ  *psoTarget,
                     19:     SURFOBJ  *psoPattern,
                     20:     SURFOBJ  *psoMask,
                     21:     XLATEOBJ *pxlo,
                     22:     ULONG    iHatch)
                     23: {
                     24:     S3BRUSH     s3Brush;
                     25:     PS3BRUSH    ps3Brush;
                     26:     INT         cjPattern;
                     27: 
                     28:     INT         i, j, cx, cy, lSrcDelta, lDestDelta;
                     29:     PBYTE       pbSrc, pbDest;
                     30:     FLONG       flXlate;
                     31:     PPDEV       ppdev;
                     32:     PULONG      pulXlate;
                     33: 
                     34: 
                     35:     DISPDBG((3, "S3.DLL!DrvRealizeBrush - Entry\n"));
                     36: 
                     37:     ppdev = (PPDEV)psoTarget->dhsurf;
                     38: 
                     39:     // Even if there is a mask accept the brush.
                     40:     // We will test the ROP when the brush is rendered and
                     41:     // and reject it at that time if we don't want to handle it.
                     42: 
                     43: #if DBG
                     44:     memset (&s3Brush, 0, sizeof(S3BRUSH));
                     45: #endif
                     46: 
                     47:     // Init the stack based s3 brush structure.
                     48: 
                     49:     s3Brush.nSize             = sizeof (S3BRUSH);
                     50:     s3Brush.iPatternID        = ++(ppdev->gBrushUnique);
                     51:     s3Brush.iBrushCacheID     = (ULONG) -1;
                     52:     s3Brush.iExpansionCacheID = (ULONG) -1;
                     53:     s3Brush.iType             = psoPattern->iType;
                     54:     s3Brush.iBitmapFormat     = psoPattern->iBitmapFormat;
                     55:     s3Brush.sizlPattern       = psoPattern->sizlBitmap;
                     56: 
                     57:     // Only handle standard bitmap format brushes.
                     58: 
                     59:     if (s3Brush.iType != STYPE_BITMAP)
                     60:         return (FALSE);
                     61: 
                     62:     // This selects the brush formats we support.
                     63:     // It's a switch statement so we can add more as improve the driver.
                     64: 
                     65:     switch (s3Brush.iBitmapFormat)
                     66:     {
                     67:         case BMF_1BPP:
                     68:         case BMF_8BPP:
                     69:             break;
                     70: 
                     71:         default:
                     72:             return(FALSE);
                     73: 
                     74:     }
                     75: 
                     76:     // For now, if this is not an 8 X 8 pattern then reject it. !!!
                     77:     // This will change to handle patterns up to the size of the !!!
                     78:     // source bitmap cache area. !!!
                     79: 
                     80:     if (s3Brush.sizlPattern.cx != 8 || s3Brush.sizlPattern.cy != 8)
                     81:         return (FALSE);
                     82: 
                     83:     // Note: In all cases the brush is just copied into some storage
                     84:     //       that we have allocated in GDI.  The expansion and/or
                     85:     //       color translation is done when the brush is put into the
                     86:     //       graphics memory cache.
                     87: 
                     88:     cjPattern      = psoPattern->cjBits;
                     89:     s3Brush.nSize += cjPattern;
                     90: 
                     91:     if (psoPattern->fjBitmap & BMF_TOPDOWN)
                     92:         s3Brush.lDeltaPattern = psoPattern->lDelta;
                     93:     else
                     94:         s3Brush.lDeltaPattern = -(psoPattern->lDelta);
                     95: 
                     96:     // If its a mono brush record the foreground and background colors.
                     97: 
                     98:     if (s3Brush.iBitmapFormat == BMF_1BPP)
                     99:     {
                    100:         if (pxlo->flXlate & XO_TABLE)
                    101:         {
                    102:             pulXlate = pxlo->pulXlate;
                    103:         }
                    104:         else
                    105:         {
                    106:             pulXlate = XLATEOBJ_piVector(pxlo);
                    107:         }
                    108: 
                    109:         s3Brush.ulForeColor = pulXlate[1];
                    110:         s3Brush.ulBackColor = pulXlate[0];
                    111:     }
                    112: 
                    113:     // Allocate some GDI storage for the Brush. !!!
                    114:     // Note: This should be moved up and the stack stuff should be !!!
                    115:     //       removed since we can now simply calculate the size of !!!
                    116:     //       the brush. !!!
                    117: 
                    118:     ps3Brush = (PS3BRUSH) BRUSHOBJ_pvAllocRbrush(pbo, s3Brush.nSize);
                    119: 
                    120:     // Assign all the static info we built on the stack. !!!
                    121:     // This should be removed. !!!
                    122: 
                    123:     *ps3Brush = s3Brush;
                    124: 
                    125:     // If there is an XlatObj, we may have to translate the
                    126:     // indicies.
                    127: 
                    128:     flXlate = 0;
                    129:     if (pxlo != NULL)
                    130:     {
                    131:         flXlate = pxlo->flXlate;
                    132: 
                    133:         if (flXlate & XO_TABLE)
                    134:         {
                    135:             pulXlate = pxlo->pulXlate;
                    136:         }
                    137:         else
                    138:         {
                    139:             pulXlate = XLATEOBJ_piVector(pxlo);
                    140:         }
                    141:     }
                    142: 
                    143:     // Note: We should be able to remove this if, since this is not !!!
                    144:     //       a time critcal spot in the code. !!!
                    145: 
                    146:     // We may have to invert the Y if it's not in a top-down format.
                    147:     // We have already adjusted the BrushDelta if this inversion is necessary.
                    148: 
                    149:     if (psoPattern->fjBitmap & BMF_TOPDOWN)
                    150:     {
                    151:         pbSrc  = psoPattern->pvBits;
                    152:         pbDest = ps3Brush->ajPattern;
                    153: 
                    154:         if ((flXlate & XO_TABLE) &&
                    155:             (psoPattern->iBitmapFormat == BMF_8BPP))
                    156:         {
                    157:             for (j = 0; j < cjPattern; j++)
                    158:             {
                    159:                 pbDest[j] = (BYTE) pulXlate[pbSrc[j]];
                    160:             }
                    161:         }
                    162:         else
                    163:         {
                    164:             memcpy(ps3Brush->ajPattern, psoPattern->pvBits, cjPattern);
                    165:         }
                    166:     }
                    167:     else
                    168:     {
                    169: 
                    170:         cx = s3Brush.sizlPattern.cx;
                    171:         cy = s3Brush.sizlPattern.cy;
                    172: 
                    173:         pbSrc      = psoPattern->pvScan0;
                    174:         pbDest     = ps3Brush->ajPattern;
                    175:         lSrcDelta  = psoPattern->lDelta;
                    176:         lDestDelta = -lSrcDelta;
                    177: 
                    178:         for (i = 0; i < cy; i++)
                    179:         {
                    180:             // We may have to translate the indices.
                    181: 
                    182:             if ((flXlate & XO_TABLE) &&
                    183:                 (psoPattern->iBitmapFormat == BMF_8BPP))
                    184:             {
                    185:                 for (j = 0; j < cx; j++)
                    186:                 {
                    187:                     pbDest[j] = (BYTE) pulXlate[pbSrc[j]];
                    188:                 }
                    189:             }
                    190:             else
                    191:             {
                    192:                 memcpy(pbDest, pbSrc, cx);
                    193:             }
                    194: 
                    195:             pbSrc  += lSrcDelta;
                    196:             pbDest += lDestDelta;
                    197: 
                    198:         }
                    199:     }
                    200: 
                    201:     return (TRUE);
                    202: 
                    203: }

unix.superglobalmegacorp.com

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