Annotation of ntddk/src/print/pscript/brush.c, revision 1.1.1.1

1.1       root        1: //--------------------------------------------------------------------------
                      2: //
                      3: // Module Name:  BRUSH.C
                      4: //
                      5: // Brief Description:  This module contains the PSCRIPT driver's brush
                      6: // realization routines.
                      7: //
                      8: // Author:  Kent Settle (kentse)
                      9: // Created: 13-Dec-1990
                     10: //
                     11: // Copyright (c) 1990 - 1992 Microsoft Corporation
                     12: //
                     13: //--------------------------------------------------------------------------
                     14: 
                     15: #include "pscript.h"
                     16: #include "enable.h"
                     17: 
                     18: #ifdef INDEX_PAL
                     19: #define RGBMASK     0x00FFFFFF
                     20: #endif
                     21: 
                     22: //--------------------------------------------------------------------------
                     23: //
                     24: // BOOL DrvRealizeBrush(pbo, psoTarget, psoPattern, psoMask, pxlo)
                     25: // BRUSHOBJ    *pbo;
                     26: // SURFOBJ     *psoTarget;
                     27: // SURFOBJ     *psoPattern;
                     28: // SURFOBJ     *psoMask;
                     29: // XLATEOBJ    *pxlo;
                     30: //
                     31: // Requests the driver to realize a pattern defined by psoPattern for
                     32: // the surface defined by psoTarget.  A realized brush contains the
                     33: // information and accelerators the driver needs to fill an area with
                     34: // a pattern.  This information is defined by the driver and used only
                     35: // by the driver.  The driver's realization of the brush should be
                     36: // written into the buffer allocated by calling BRUSHOBJ_pvAllocRBrush.
                     37: //
                     38: // This function is required for a driver that does any drawing to any
                     39: // surface.
                     40: //
                     41: // Parameters:
                     42: //   pbo:
                     43: //     Points to the BRUSHOBJ which is being realized.  All the other
                     44: //     parameters, except for psoTarget, can actually be queried from
                     45: //     this object.  We provide them as an optimization.  pbo is best used
                     46: //     only as a parameter for BRUSHOBJ_pvAllocRBrush, which allocates
                     47: //     the memory for the realized brush.
                     48: //
                     49: //   psoTarget:
                     50: //     The object for the surface the brush is to be realized for.  This
                     51: //     surface will either be the physical surface for the device, or a
                     52: //     device format bitmap.
                     53: //
                     54: //   psoPattern:
                     55: //     The surface describing the pattern for the brush.  For a raster
                     56: //     device this will always represent a bitmap.  For a vector device
                     57: //     this will always be one of the pattern surfaces returned by
                     58: //     DrvEnablePDEV.
                     59: //
                     60: //   psoMask:
                     61: //     If this argument is not NULL, it provides a transparency mask for
                     62: //     the brush.  This is a one bit per pel bitmap having the same
                     63: //     extent as the pattern.  A mask bit of zero means that the pel is
                     64: //     considered a background pel for the brush (In transparent
                     65: //     background mode, the background pels would be left unaffected in a
                     66: //     fill.)
                     67: //
                     68: //     Plotters can ignore this argument as they are never expected to draw
                     69: //     background information.
                     70: //
                     71: //   pxlo:
                     72: //     An XLATEOBJ which tells how to interpret the colors in the pattern.
                     73: //     An XLATEOBJ service routine can be called to translate the colors to
                     74: //     device color indices.  Vector devices should translate color 0
                     75: //     through the XLATEOBJ to get the foreground color for the brush.
                     76: //
                     77: // Returns:
                     78: //     TRUE if the brush was successfully realized.  Otherwise, FALSE
                     79: //     and an error code is logged.
                     80: //
                     81: // History:
                     82: //   13-Dec-1990     -by-     Kent Settle     (kentse)
                     83: //  Wrote it.
                     84: //
                     85: //  16-Feb-1993 Tue 12:28:06 updated  -by-  Daniel Chou (danielc)
                     86: //      Re-write so it takc iHatch rather go through the suface handle to
                     87: //      check what type of pattern.
                     88: //--------------------------------------------------------------------------
                     89: 
                     90: BOOL DrvRealizeBrush(pbo, psoTarget, psoPattern, psoMask, pxlo, iHatch)
                     91: BRUSHOBJ    *pbo;
                     92: SURFOBJ     *psoTarget;
                     93: SURFOBJ     *psoPattern;
                     94: SURFOBJ     *psoMask;
                     95: XLATEOBJ    *pxlo;
                     96: ULONG       iHatch;
                     97: {
                     98:     ULONG           cbTotal, cbBits, cbColorTable;
                     99:     PBYTE           pbSrc, pbTarg;
                    100:     DEVBRUSH       *pBrush;
                    101:     PDEVDATA        pdev;
                    102: #ifdef INDEX_PAL
                    103:     BOOL            bDitherColor;
                    104: #endif
                    105: 
                    106:     UNREFERENCED_PARAMETER(psoMask);
                    107: 
                    108:     // get the pointer to our DEVDATA structure and make sure it is ours.
                    109: 
                    110:     pdev = (PDEVDATA) psoTarget->dhpdev;
                    111: 
                    112:     if (bValidatePDEV(pdev) == FALSE)
                    113:     {
                    114:        RIP("PSCRIPT!DrvRealizeBrush: invalid pdev.\n");
                    115:        SetLastError(ERROR_INVALID_PARAMETER);
                    116:        return(FALSE);
                    117:     }
                    118: 
                    119: #ifdef INDEX_PAL
                    120:     // see if this is just a solid color to realize.
                    121: 
                    122:     bDitherColor = FALSE;
                    123: 
                    124:     if (iHatch & RB_DITHERCOLOR)
                    125:     {
                    126:         bDitherColor = TRUE;
                    127:         cbBits = 0;
                    128:     }
                    129:     else if (iHatch >= HS_DDI_MAX)
                    130: #else
                    131:     if (iHatch >= HS_DDI_MAX)
                    132: #endif
                    133:     {
                    134:         // we have a bitmap for the pattern.
                    135:         // determine the size of the bitmap, remembering that the
                    136:         // bitmaps are DWORD (32 bit) bounded.
                    137: 
                    138:         // how many pels per scanline?
                    139: 
                    140:         cbBits = psoPattern->sizlBitmap.cx;
                    141: 
                    142:         // times how many bits per pel.
                    143: 
                    144:         switch (psoPattern->iBitmapFormat)
                    145:         {
                    146:             case BMF_1BPP:
                    147:                 break;
                    148: 
                    149:             case BMF_4BPP:
                    150:                 cbBits *= 4;
                    151:                 break;
                    152: 
                    153:             case BMF_8BPP:
                    154:                 cbBits *= 8;
                    155:                 break;
                    156: 
                    157:             case BMF_16BPP:
                    158:                 cbBits *= 16;
                    159:                 break;
                    160: 
                    161:             case BMF_24BPP:
                    162:                 cbBits *= 24;
                    163:                 break;
                    164: 
                    165:             case BMF_32BPP:
                    166:                 cbBits *= 32;
                    167:                 break;
                    168:         }
                    169: 
                    170:         // cbBits now equals the number of bits per scanline.
                    171:         // convert it to the number of bytes per scanline, taking into
                    172:         // account that scanlines are padded out to 32 bit boundaries.
                    173: 
                    174:         cbBits = (((cbBits + 31) / 32) * 4);
                    175: 
                    176:         // now that we have the number of bytes per scanline, get the
                    177:         // total number of bytes.
                    178: 
                    179:         cbBits *= psoPattern->sizlBitmap.cy;
                    180:     }
                    181:     else
                    182:     {
                    183:         // we have one of the predefined patterns.
                    184: 
                    185:         cbBits = 0;
                    186:     }
                    187: 
                    188:     // leave room for the color table.
                    189: 
                    190: #ifdef INDEX_PAL
                    191:     if (bDitherColor)
                    192:         cbColorTable = 0;
                    193:     else
                    194: #endif
                    195:        cbColorTable = (pxlo->cEntries * sizeof(ULONG));
                    196: 
                    197:     // allocate new brush.
                    198: 
                    199:     cbTotal = sizeof(DEVBRUSH) + cbBits + cbColorTable;
                    200:     pBrush = BRUSHOBJ_pvAllocRbrush(pbo, cbTotal);
                    201: 
                    202:     if (!pBrush)
                    203:     {
                    204:        RIP("PSCRIPT!DrvRealizeBrush: brush allocation failed.\n");
                    205:         return(FALSE);
                    206:     }
                    207: 
                    208:     // fill in the DEVBRUSH information.
                    209: 
                    210: #ifdef INDEX_PAL
                    211:     if (bDitherColor)
                    212:         pBrush->iSolidColor = (iHatch & RGBMASK);
                    213:     else
                    214:     {
                    215:         pBrush->iSolidColor = NOT_SOLID_COLOR;
                    216:         pBrush->iPatIndex   = iHatch;
                    217:         pBrush->cXlate      = pxlo->cEntries;
                    218:         pBrush->offsetXlate = sizeof(DEVBRUSH) + cbBits;
                    219: 
                    220:         pbTarg = (PBYTE)((DEVBRUSH *)pBrush) + pBrush->offsetXlate;
                    221: 
                    222:         CopyMemory(pbTarg, (PBYTE)pxlo->pulXlate, cbColorTable);
                    223: 
                    224:         if (iHatch >= HS_DDI_MAX)
                    225:         {
                    226:             // we have a bitmap for the pattern.  fill in the appropriate
                    227:             // information in the DEVBRUSH, including the bitmap itself.
                    228: 
                    229:             pBrush->sizlBitmap = psoPattern->sizlBitmap;
                    230:             pBrush->iFormat = (ULONG)psoPattern->iBitmapFormat;
                    231:             pBrush->flBitmap = (FLONG)psoPattern->fjBitmap;
                    232: 
                    233:             // get a pointer to the pattern bits.
                    234: 
                    235:             pbSrc = (PBYTE) psoPattern->pvBits;
                    236: 
                    237:             // get a pointer to the destination in the brush.
                    238: 
                    239:             pbTarg = (PBYTE)((DEVBRUSH *)pBrush)->ajBits;
                    240: 
                    241:             // copy the bits from the pattern surface to the brush.
                    242: 
                    243:             memcpy(pbTarg, pbSrc, cbBits);
                    244:         }
                    245:     }
                    246: #else
                    247:     pBrush->iPatIndex   = iHatch;
                    248:     pBrush->cXlate      = pxlo->cEntries;
                    249:     pBrush->offsetXlate = sizeof(DEVBRUSH) + cbBits;
                    250: 
                    251:     pbTarg = (PBYTE)((DEVBRUSH *)pBrush) + pBrush->offsetXlate;
                    252: 
                    253:     CopyMemory(pbTarg, (PBYTE)pxlo->pulXlate, cbColorTable);
                    254: 
                    255:     if (iHatch >= HS_DDI_MAX)
                    256:     {
                    257:         // we have a bitmap for the pattern.  fill in the appropriate
                    258:         // information in the DEVBRUSH, including the bitmap itself.
                    259: 
                    260:         pBrush->sizlBitmap = psoPattern->sizlBitmap;
                    261:         pBrush->iFormat = (ULONG)psoPattern->iBitmapFormat;
                    262:         pBrush->flBitmap = (FLONG)psoPattern->fjBitmap;
                    263: 
                    264:         // get a pointer to the pattern bits.
                    265: 
                    266:         pbSrc = (PBYTE) psoPattern->pvBits;
                    267: 
                    268:         // get a pointer to the destination in the brush.
                    269: 
                    270:         pbTarg = (PBYTE)((DEVBRUSH *)pBrush)->ajBits;
                    271: 
                    272:         // copy the bits from the pattern surface to the brush.
                    273: 
                    274:         memcpy(pbTarg, pbSrc, cbBits);
                    275:     }
                    276: #endif
                    277:     // set the pointer to our brush in the BRUSHOBJ.  REMEMBER,
                    278:     // the engine will take care of discarding this memory, so
                    279:     // we don't have to.
                    280: 
                    281:     pbo->pvRbrush = (PVOID)pBrush;
                    282: 
                    283:     return(TRUE);
                    284: }
                    285: 
                    286: #ifdef INDEX_PAL
                    287: //--------------------------------------------------------------------------
                    288: // ULONG DrvDitherColor(dhpdev, iMode, rgb, pul)
                    289: // DHPDEV dhpdev;
                    290: // ULONG  iMode;
                    291: // ULONG  rgb;
                    292: // ULONG *pul;
                    293: //
                    294: // Returns:
                    295: //     DCR_HALFTONE - tells the engine to halftone a brush for me.
                    296: //
                    297: // History:
                    298: //   31-May-1993     -by-     Kent Settle     (kentse)
                    299: //  Wrote it.
                    300: //--------------------------------------------------------------------------
                    301: 
                    302: ULONG DrvDitherColor(dhpdev, iMode, rgb, pul)
                    303: DHPDEV dhpdev;
                    304: ULONG  iMode;
                    305: ULONG  rgb;
                    306: ULONG *pul;
                    307: {
                    308:     return(DCR_HALFTONE);
                    309: }
                    310: #endif

unix.superglobalmegacorp.com

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