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

1.1     ! root        1: /******************************Module*Header*******************************\
        !             2: * Module Name: rleblt.c
        !             3: *
        !             4: * Blt from RLE format bitmap to VGA.
        !             5: *
        !             6: * Copyright (c) 1992 Microsoft Corporation
        !             7: \**************************************************************************/
        !             8: #include "driver.h"
        !             9: #include "bitblt.h"
        !            10: 
        !            11: typedef struct _RLEINFO
        !            12: {
        !            13:     PBYTE   pjTrg;
        !            14:     PBYTE   pjSrc;
        !            15:     PBYTE   pjSrcEnd;
        !            16:     PRECTL  prclClip;
        !            17:     PULONG  pulXlate;
        !            18:     LONG    xBegin;
        !            19:     SIZE_T  lNextScan;         // Offset to the next scan line - DDB Only.
        !            20:     SIZE_T  lNextPlane;        // Offset to the next plane     - DDB Only.
        !            21:     PRECTL  prclTrg;
        !            22:     DWORD   Format;
        !            23:     PDEVSURF pdsurfTrg;
        !            24: }RLEINFO, *PRLEINFO;
        !            25: 
        !            26: VOID vRle8ToVga(PRLEINFO);
        !            27: VOID vRle4ToVga(PRLEINFO);
        !            28: BOOL DrvIntersectRect(PRECTL, PRECTL, PRECTL);
        !            29: typedef VOID (*PFN_RleToVga)(PRLEINFO);
        !            30: 
        !            31: /******************************Public*Routine******************************\
        !            32: * BOOL bRleBlt(*psoTrg, *psoSrc, *pco, *pxlo, *prclTrg, *pptlSrc)
        !            33: *
        !            34: * Blt from RLE format bitmap to VGA.
        !            35: *
        !            36: \**************************************************************************/
        !            37: 
        !            38: BOOL bRleBlt
        !            39: (
        !            40:     SURFOBJ    *psoTrg,             // Target surface
        !            41:     SURFOBJ    *psoSrc,             // Source surface
        !            42:     CLIPOBJ    *pco,                // Clip through this
        !            43:     XLATEOBJ   *pxlo,               // Color translation
        !            44:     RECTL      *prclTrg,            // Target offset and extent
        !            45:     POINTL     *pptlSrc             // Source offset
        !            46: )
        !            47: {
        !            48:     BOOL        bMore;              // Clip continuation flag
        !            49:     ULONG       ircl;               // Clip enumeration rectangle index
        !            50:     RECT_ENUM   bben;               // Clip enumerator
        !            51:     PFN_RleToVga pfnRleToVga;       // Pointer to either Rle8ToVga or Rle4ToVga
        !            52: 
        !            53:     PDEVSURF    pdsurf;
        !            54:     RECTL       rclTrg;
        !            55:     PDEV        *ppdevTrg;
        !            56:     RLEINFO     rleInfo;
        !            57:     PRECTL      prcl;               // Pointer to the current cliprect
        !            58:     PRECTL      prclNext;           // Pointer to the next cliprect
        !            59: 
        !            60:     PBYTE       pjTrgTmp;           // For saving fields in rleInfo.
        !            61:     PBYTE       pjSrcTmp;
        !            62:     LONG        lTrgBottomTmp;
        !            63:     LONG        xBeginTmp;
        !            64:     LONG        yScanSrc;
        !            65: 
        !            66: // Get the target surface information.  This is guaranteed to be a device
        !            67: // surface or a device format bitmap.
        !            68: 
        !            69: //    ASSERT((psoTrg->dhsurf != (DHSURF)0),"bRleBlt: invalid dhsurf\n");
        !            70: 
        !            71:     pdsurf   = (PDEVSURF) psoTrg->dhsurf;
        !            72:     ppdevTrg = pdsurf->ppdev;
        !            73: 
        !            74: 
        !            75: // Get the source surface information.  Common to the screen and DFB's
        !            76: 
        !            77:     rleInfo.pjSrc = psoSrc->pvBits;
        !            78:     rleInfo.pjSrcEnd = (PBYTE)(psoSrc->pvBits) + (psoSrc->cjBits);
        !            79: 
        !            80: // Determine if color translation is required.  If so, then get the color
        !            81: // translation vector.
        !            82: 
        !            83: //    ASSERT(pxlo != NULL,"RleBlt with invalid pxlo\n");
        !            84:     rleInfo.pulXlate = pxlo->pulXlate;
        !            85: //    ASSERT(rleInfo.pulXlate != (PULONG)NULL,
        !            86: //           "RleBlt GetTranslateVecotr failed\n");
        !            87: 
        !            88: // Enlarge the destination rectangle to include area that would have to be
        !            89: // drawn if ptlSrc is (0, 0).
        !            90: 
        !            91:     rclTrg.left   = prclTrg->left - pptlSrc->x;
        !            92:     rclTrg.top    = prclTrg->top;
        !            93:     rclTrg.right  = prclTrg->right;
        !            94:     rclTrg.bottom = prclTrg->top + psoSrc->sizlBitmap.cy - pptlSrc->y;
        !            95: 
        !            96:     rleInfo.prclTrg = &rclTrg;
        !            97:     rleInfo.xBegin  = rclTrg.left;
        !            98: 
        !            99: // Calculate our starting address in the bitmap & get our blt function
        !           100: 
        !           101:     // First (bottom) dest scan, *exclusive*
        !           102:     // Offset within bitmap of first (bottom) dest scan, *inclusive*
        !           103:     rleInfo.pjTrg = (PBYTE) ((rclTrg.bottom - 1) * pdsurf->lNextScan);
        !           104:     rleInfo.pdsurfTrg = pdsurf;
        !           105:     if (psoSrc->iBitmapFormat == BMF_8RLE)
        !           106:         pfnRleToVga = vRle8ToVga;
        !           107:     else
        !           108:         pfnRleToVga = vRle4ToVga;
        !           109: 
        !           110: // Everything is ready.  Let's go draw on the VGA.  Shooby Doobie Doo.  Whee.
        !           111: 
        !           112:     switch(pco->iDComplexity)
        !           113:     {
        !           114:     case DC_TRIVIAL:
        !           115:         rleInfo.prclClip = prclTrg;
        !           116:         pfnRleToVga(&rleInfo);
        !           117:         break;
        !           118: 
        !           119:     case DC_RECT:
        !           120:         rleInfo.prclClip = &pco->rclBounds;
        !           121:         pfnRleToVga(&rleInfo);
        !           122:         break;
        !           123: 
        !           124:     case DC_COMPLEX:
        !           125:         CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_RIGHTUP, ENUM_RECT_LIMIT);
        !           126: 
        !           127:         do
        !           128:         {
        !           129:         // Fill n slots with (n - 1) rectangles.
        !           130: 
        !           131:             bMore = CLIPOBJ_bEnum(pco,(ULONG) (sizeof(bben) - sizeof(RECT)),
        !           132:                                   (PVOID) &bben);
        !           133: 
        !           134:         // Force save and restore rleInfo for the last rect.
        !           135: 
        !           136:             bben.arcl[bben.c].bottom = bben.arcl[bben.c - 1].bottom;
        !           137: 
        !           138:             for (ircl = 0; ircl < bben.c; ircl++)
        !           139:             {
        !           140:                 prcl = &bben.arcl[ircl];
        !           141: 
        !           142:             // If the clipping rect is above the target rect, don't
        !           143:             // enumerate any more clipprect.  Since the direction of
        !           144:             // enumeration is bottom up, nothing is visible in new cliprect.
        !           145: 
        !           146:                 if (prcl->bottom <= rleInfo.prclTrg->top)
        !           147:                 {
        !           148:                     break;
        !           149:                     bMore = FALSE;
        !           150:                 }
        !           151: 
        !           152:             // We check for NULL or inverted rectanges because we may get them.
        !           153: 
        !           154:                 if ((prcl->top < prcl->bottom) && (prcl->left < prcl->right))
        !           155:                 {
        !           156:                     rleInfo.prclClip = prcl;
        !           157:                     prclNext = &bben.arcl[ircl + 1];
        !           158: 
        !           159:                     // Pass the same rleInfo for next cliprect if the next
        !           160:                     // cliprect is on the same scan as the current cliprect
        !           161: 
        !           162:                     if (prcl->bottom == prclNext->bottom)
        !           163:                     {
        !           164:                     // save rleInfo.
        !           165: 
        !           166:                         pjTrgTmp = rleInfo.pjTrg;
        !           167:                         pjSrcTmp = rleInfo.pjSrc;
        !           168:                         lTrgBottomTmp = rleInfo.prclTrg->bottom;
        !           169:                         xBeginTmp = rleInfo.xBegin;
        !           170: 
        !           171: 
        !           172:                         pfnRleToVga(&rleInfo);
        !           173: 
        !           174:                     // restore rleinfo
        !           175: 
        !           176:                         rleInfo.pjTrg = pjTrgTmp;
        !           177:                         rleInfo.pjSrc = pjSrcTmp;
        !           178:                         rleInfo.prclTrg->bottom = lTrgBottomTmp;
        !           179:                         rleInfo.xBegin = xBeginTmp;
        !           180:                     }
        !           181:                     else
        !           182:                     {
        !           183:                         pfnRleToVga(&rleInfo);
        !           184:                     }
        !           185:                 }
        !           186:             }
        !           187:         } while(bMore);
        !           188: 
        !           189:         //DbgBreakPoint();
        !           190: 
        !           191:         break;
        !           192: 
        !           193:     default:
        !           194:         RIP("ERROR bRleBlt invalid clip complexity\n");
        !           195:         return(FALSE);
        !           196:     }
        !           197: 
        !           198:     return(TRUE);
        !           199: }
        !           200: 

unix.superglobalmegacorp.com

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