Annotation of ntddk/src/video/displays/vga256/bankmgr.c, revision 1.1

1.1     ! root        1: /*****************************************************************************\
        !             2: * Smart 256 Colour Bank Manager
        !             3: *
        !             4: * Copyright (c) 1992 Microsoft Corporation
        !             5: \*****************************************************************************/
        !             6: 
        !             7: #include "driver.h"
        !             8: 
        !             9: /*****************************************************************************\
        !            10: * pcoBankStart - Start the bank enumeration using the clip object.
        !            11: *
        !            12: * Used when the destination is the screen and we can't do the clipping
        !            13: * ourselves (as we can for blt's).
        !            14: \*****************************************************************************/
        !            15: 
        !            16: CLIPOBJ* pcoBankStart(
        !            17:     PPDEV       ppdev,
        !            18:     RECTL*      prclScans,
        !            19:     SURFOBJ*    pso,
        !            20:     CLIPOBJ*    pco)
        !            21: {
        !            22:     LONG iTopScan = max(0, prclScans->top);
        !            23: 
        !            24:     // Adjust for those weird cases where we're asked to start enumerating
        !            25:     // below the bottom of the screen:
        !            26: 
        !            27:     iTopScan = min(iTopScan, (LONG) ppdev->cyScreen - 1);
        !            28: 
        !            29:     // Map in the bank:
        !            30: 
        !            31:     if (iTopScan <  ppdev->rcl1WindowClip.top ||
        !            32:         iTopScan >= ppdev->rcl1WindowClip.bottom)
        !            33:     {
        !            34:         ppdev->pfnBankControl(ppdev, iTopScan, JustifyTop);
        !            35:     }
        !            36: 
        !            37:     // Remember what the last scan is that we're going to, and
        !            38:     // make sure we only try to go as far as we need to.  It could
        !            39:     // happen that when get a prclScans bigger than the screen:
        !            40: 
        !            41:     ppdev->iLastScan = min(prclScans->bottom, (LONG) ppdev->cyScreen);
        !            42: 
        !            43:     pso->pvScan0 = ppdev->pvBitmapStart;
        !            44: 
        !            45:     if (pco == NULL)
        !            46:     {
        !            47:         // The call may have come down to us as having no clipping, but
        !            48:         // we have to clip to the banks, so use our own clip object:
        !            49: 
        !            50:         pco            = ppdev->pcoNull;
        !            51:         pco->rclBounds = ppdev->rcl1WindowClip;
        !            52:     }
        !            53:     else
        !            54:     {
        !            55:         // Save the engine's clip object data that we'll be tromping on:
        !            56: 
        !            57:         ppdev->rclSaveBounds    = pco->rclBounds;
        !            58:         ppdev->iSaveDComplexity = pco->iDComplexity;
        !            59:         ppdev->fjSaveOptions    = pco->fjOptions;
        !            60: 
        !            61:         // Let engine know it has to pay attention to the rclBounds of the
        !            62:         // clip object:
        !            63: 
        !            64:         pco->fjOptions |= OC_BANK_CLIP;
        !            65: 
        !            66:         if (pco->iDComplexity == DC_TRIVIAL)
        !            67:             pco->iDComplexity = DC_RECT;
        !            68: 
        !            69:         // Use the bank bounds if they are tighter than the existing
        !            70:         // bounds.  We don't have to check the left case here because we
        !            71:         // know that ppdev->rcl1WindowClip.left == 0.
        !            72: 
        !            73:         if (pco->rclBounds.top <= ppdev->rcl1WindowClip.top)
        !            74:             pco->rclBounds.top = ppdev->rcl1WindowClip.top;
        !            75: 
        !            76:         if (pco->rclBounds.right >= ppdev->rcl1WindowClip.right)
        !            77:             pco->rclBounds.right = ppdev->rcl1WindowClip.right;
        !            78: 
        !            79:         if (pco->rclBounds.bottom >= ppdev->rcl1WindowClip.bottom)
        !            80:             pco->rclBounds.bottom = ppdev->rcl1WindowClip.bottom;
        !            81:     }
        !            82: 
        !            83:     return(pco);
        !            84: }
        !            85: 
        !            86: /*****************************************************************************\
        !            87: * bBankEnum - Continue the bank enumeration.
        !            88: \*****************************************************************************/
        !            89: 
        !            90: BOOL bBankEnum(PPDEV ppdev, SURFOBJ* pso, CLIPOBJ* pco)
        !            91: {
        !            92:     // If we're on the first portion of a broken raster, get the next:
        !            93: 
        !            94:     LONG yNewTop = ppdev->rcl1WindowClip.bottom;
        !            95: 
        !            96:     if (ppdev->flBank & BANK_BROKEN_RASTER1)
        !            97:         ppdev->pfnBankNext(ppdev);
        !            98: 
        !            99:     else if (ppdev->rcl1WindowClip.bottom < ppdev->iLastScan)
        !           100:         ppdev->pfnBankControl(ppdev, yNewTop, JustifyTop);
        !           101: 
        !           102:     else
        !           103:     {
        !           104:         // Okay, that was the last bank, so restore our structures:
        !           105: 
        !           106:         if (pco != ppdev->pcoNull)
        !           107:         {
        !           108:             pco->rclBounds    = ppdev->rclSaveBounds;
        !           109:             pco->iDComplexity = ppdev->iSaveDComplexity;
        !           110:             pco->fjOptions    = ppdev->fjSaveOptions;
        !           111:         }
        !           112: 
        !           113:         return(FALSE);
        !           114:     }
        !           115: 
        !           116:     // Adjust the pvScan0 because we've moved the window to view
        !           117:     // a different area:
        !           118: 
        !           119:     pso->pvScan0 = ppdev->pvBitmapStart;
        !           120: 
        !           121:     if (pco == ppdev->pcoNull)
        !           122:     {
        !           123:         // If were given a NULL clip object originally, we don't have
        !           124:         // to worry about clipping to ppdev->rclSaveBounds:
        !           125: 
        !           126:         pco->rclBounds.top    = yNewTop;
        !           127:         pco->rclBounds.left   = ppdev->rcl1WindowClip.left;
        !           128:         pco->rclBounds.bottom = ppdev->rcl1WindowClip.bottom;
        !           129:         pco->rclBounds.right  = ppdev->rcl1WindowClip.right;
        !           130:     }
        !           131:     else
        !           132:     {
        !           133:         // Use the bank bounds if they are tighter than the bounds
        !           134:         // we were originally given:
        !           135: 
        !           136:         pco->rclBounds = ppdev->rclSaveBounds;
        !           137: 
        !           138:         if (pco->rclBounds.top <= yNewTop)
        !           139:             pco->rclBounds.top = yNewTop;
        !           140: 
        !           141:         if (pco->rclBounds.left <= ppdev->rcl1WindowClip.left)
        !           142:             pco->rclBounds.left = ppdev->rcl1WindowClip.left;
        !           143: 
        !           144:         if (pco->rclBounds.right >= ppdev->rcl1WindowClip.right)
        !           145:             pco->rclBounds.right = ppdev->rcl1WindowClip.right;
        !           146: 
        !           147:         if (pco->rclBounds.bottom >= ppdev->rcl1WindowClip.bottom)
        !           148:             pco->rclBounds.bottom = ppdev->rcl1WindowClip.bottom;
        !           149:     }
        !           150: 
        !           151:     return(TRUE);
        !           152: }
        !           153: 
        !           154: /***************************************************************************\
        !           155: * vBankStartBltSrc - Start the bank enumeration for when the screen is
        !           156: *                   the source.
        !           157: \***************************************************************************/
        !           158: 
        !           159: VOID vBankStartBltSrc(
        !           160:     PPDEV       ppdev,
        !           161:     SURFOBJ*    pso,
        !           162:     POINTL*     pptlSrc,
        !           163:     RECTL*      prclDest,
        !           164:     POINTL*     pptlNewSrc,
        !           165:     RECTL*      prclNewDest)
        !           166: {
        !           167:     LONG xRightSrc;
        !           168:     LONG yBottomSrc;
        !           169:     LONG iTopScan = max(0, pptlSrc->y);
        !           170: 
        !           171:     if (iTopScan >= (LONG) ppdev->cyScreen)
        !           172:     {
        !           173:     // In some instances we may be asked to start on a scan below the screen.
        !           174:     // Since we obviously won't be drawing anything, don't bother mapping in
        !           175:     // a bank:
        !           176: 
        !           177:         return;
        !           178:     }
        !           179: 
        !           180:     // Map in the bank:
        !           181: 
        !           182:     if (iTopScan <  ppdev->rcl1WindowClip.top ||
        !           183:         iTopScan >= ppdev->rcl1WindowClip.bottom)
        !           184:     {
        !           185:         ppdev->pfnBankControl(ppdev, iTopScan, JustifyTop);
        !           186:     }
        !           187: 
        !           188:     if (ppdev->rcl1WindowClip.right <= pptlSrc->x)
        !           189:     {
        !           190:     // We have to watch out for those rare cases where we're starting
        !           191:     // on a broken raster and we won't be drawing on the first part:
        !           192: 
        !           193:         ASSERTVGA(ppdev->flBank & BANK_BROKEN_RASTER1, "Weird start bounds");
        !           194: 
        !           195:         ppdev->pfnBankNext(ppdev);
        !           196:     }
        !           197: 
        !           198:     pso->pvScan0 = ppdev->pvBitmapStart;
        !           199: 
        !           200:     // Adjust the source:
        !           201: 
        !           202:     pptlNewSrc->x = pptlSrc->x;
        !           203:     pptlNewSrc->y = pptlSrc->y;
        !           204: 
        !           205:     // Adjust the destination:
        !           206: 
        !           207:     prclNewDest->left = prclDest->left;
        !           208:     prclNewDest->top  = prclDest->top;
        !           209: 
        !           210:     yBottomSrc = pptlSrc->y + prclDest->bottom - prclDest->top;
        !           211:     prclNewDest->bottom = min(ppdev->rcl1WindowClip.bottom, yBottomSrc);
        !           212:     prclNewDest->bottom += prclDest->top - pptlSrc->y;
        !           213: 
        !           214:     xRightSrc = pptlSrc->x + prclDest->right - prclDest->left;
        !           215:     prclNewDest->right = min(ppdev->rcl1WindowClip.right, xRightSrc);
        !           216:     prclNewDest->right += prclDest->left - pptlSrc->x;
        !           217: }
        !           218: 
        !           219: /***************************************************************************\
        !           220: * bBankEnumBltSrc - Continue the bank enumeration for when the screen is
        !           221: *                   the source.
        !           222: \***************************************************************************/
        !           223: 
        !           224: BOOL bBankEnumBltSrc(
        !           225:     PPDEV       ppdev,
        !           226:     SURFOBJ*    pso,
        !           227:     POINTL*     pptlSrc,
        !           228:     RECTL*      prclDest,
        !           229:     POINTL*     pptlNewSrc,
        !           230:     RECTL*      prclNewDest)
        !           231: {
        !           232:     LONG xLeftSrc;
        !           233:     LONG xRightSrc;
        !           234:     LONG yBottomSrc;
        !           235: 
        !           236:     LONG cx = prclDest->right  - prclDest->left;
        !           237:     LONG cy = prclDest->bottom - prclDest->top;
        !           238: 
        !           239:     LONG dx;
        !           240:     LONG dy;
        !           241: 
        !           242:     LONG yBottom = min(pptlSrc->y + cy, (LONG) ppdev->cyScreen);
        !           243:     LONG yNewTop = ppdev->rcl1WindowClip.bottom;
        !           244: 
        !           245:     if (ppdev->flBank & BANK_BROKEN_RASTER1)
        !           246:     {
        !           247:         ppdev->pfnBankNext(ppdev);
        !           248:         if (ppdev->rcl1WindowClip.left >= pptlSrc->x + cx)
        !           249:         {
        !           250:             if (ppdev->rcl1WindowClip.bottom < yBottom)
        !           251:                 ppdev->pfnBankNext(ppdev);
        !           252:             else
        !           253:             {
        !           254:                 // We're done:
        !           255: 
        !           256:                 return(FALSE);
        !           257:             }
        !           258:         }
        !           259:     }
        !           260:     else if (yNewTop < yBottom)
        !           261:     {
        !           262:         ppdev->pfnBankControl(ppdev, yNewTop, JustifyTop);
        !           263:         if (ppdev->rcl1WindowClip.right <= pptlSrc->x)
        !           264:         {
        !           265:             ASSERTVGA(ppdev->flBank & BANK_BROKEN_RASTER1, "Weird bounds");
        !           266:             ppdev->pfnBankNext(ppdev);
        !           267:         }
        !           268:     }
        !           269:     else
        !           270:     {
        !           271:         // We're done:
        !           272: 
        !           273:         return(FALSE);
        !           274:     }
        !           275: 
        !           276:     // Adjust the source:
        !           277: 
        !           278:     pso->pvScan0 = ppdev->pvBitmapStart;
        !           279: 
        !           280:     pptlNewSrc->x = max(ppdev->rcl1WindowClip.left, pptlSrc->x);
        !           281:     pptlNewSrc->y = yNewTop;
        !           282: 
        !           283:     // Adjust the destination:
        !           284: 
        !           285:     dy = prclDest->top - pptlSrc->y;        // y delta from source to dest
        !           286: 
        !           287:     prclNewDest->top = yNewTop + dy;
        !           288: 
        !           289:     yBottomSrc = pptlSrc->y + cy;
        !           290:     prclNewDest->bottom = min(ppdev->rcl1WindowClip.bottom, yBottomSrc) + dy;
        !           291: 
        !           292:     dx = prclDest->left - pptlSrc->x;       // x delta from source to dest
        !           293: 
        !           294:     xLeftSrc = pptlSrc->x;
        !           295:     prclNewDest->left = pptlNewSrc->x + dx;
        !           296: 
        !           297:     xRightSrc = pptlSrc->x + cx;
        !           298:     prclNewDest->right = min(ppdev->rcl1WindowClip.right, xRightSrc) + dx;
        !           299: 
        !           300:     return(TRUE);
        !           301: }
        !           302: 
        !           303: /***************************************************************************\
        !           304: * vBankStartBltDest - Start the bank enumeration for when the screen is
        !           305: *                     the destination.
        !           306: \***************************************************************************/
        !           307: 
        !           308: VOID vBankStartBltDest(
        !           309:     PPDEV       ppdev,
        !           310:     SURFOBJ*    pso,
        !           311:     POINTL*     pptlSrc,
        !           312:     RECTL*      prclDest,
        !           313:     POINTL*     pptlNewSrc,
        !           314:     RECTL*      prclNewDest)
        !           315: {
        !           316:     LONG iTopScan = max(0, prclDest->top);
        !           317: 
        !           318:     if (iTopScan >= (LONG) ppdev->cyScreen)
        !           319:     {
        !           320:     // In some instances we may be asked to start on a scan below the screen.
        !           321:     // Since we obviously won't be drawing anything, don't bother mapping in
        !           322:     // a bank:
        !           323: 
        !           324:         return;
        !           325:     }
        !           326: 
        !           327:     // Map in the bank:
        !           328: 
        !           329:     if (iTopScan <  ppdev->rcl1WindowClip.top ||
        !           330:         iTopScan >= ppdev->rcl1WindowClip.bottom)
        !           331:     {
        !           332:         ppdev->pfnBankControl(ppdev, iTopScan, JustifyTop);
        !           333:     }
        !           334: 
        !           335:     if (ppdev->rcl1WindowClip.right <= prclDest->left)
        !           336:     {
        !           337:     // We have to watch out for those rare cases where we're starting
        !           338:     // on a broken raster and we won't be drawing on the first part:
        !           339: 
        !           340:         ASSERTVGA(ppdev->flBank & BANK_BROKEN_RASTER1, "Weird start bounds");
        !           341:         ppdev->pfnBankNext(ppdev);
        !           342:     }
        !           343: 
        !           344:     pso->pvScan0 = ppdev->pvBitmapStart;
        !           345: 
        !           346:     // Adjust the destination:
        !           347: 
        !           348:     prclNewDest->left   = prclDest->left;
        !           349:     prclNewDest->top    = prclDest->top;
        !           350:     prclNewDest->bottom = min(ppdev->rcl1WindowClip.bottom, prclDest->bottom);
        !           351:     prclNewDest->right  = min(ppdev->rcl1WindowClip.right,  prclDest->right);
        !           352: 
        !           353:     // Adjust the source if there is one:
        !           354: 
        !           355:     if (pptlSrc != NULL)
        !           356:         *pptlNewSrc = *pptlSrc;
        !           357: }
        !           358: 
        !           359: /***************************************************************************\
        !           360: * bBankEnumBltDest - Continue the bank enumeration for when the screen is
        !           361: *                   the destination.
        !           362: \***************************************************************************/
        !           363: 
        !           364: BOOL bBankEnumBltDest(
        !           365:     PPDEV       ppdev,
        !           366:     SURFOBJ*    pso,
        !           367:     POINTL*     pptlSrc,
        !           368:     RECTL*      prclDest,
        !           369:     POINTL*     pptlNewSrc,
        !           370:     RECTL*      prclNewDest)
        !           371: {
        !           372:     LONG yBottom = min(prclDest->bottom, (LONG) ppdev->cyScreen);
        !           373:     LONG yNewTop = ppdev->rcl1WindowClip.bottom;
        !           374: 
        !           375:     if (ppdev->flBank & BANK_BROKEN_RASTER1)
        !           376:     {
        !           377:         ppdev->pfnBankNext(ppdev);
        !           378:         if (ppdev->rcl1WindowClip.left >= prclDest->right)
        !           379:         {
        !           380:             if (ppdev->rcl1WindowClip.bottom < yBottom)
        !           381:                 ppdev->pfnBankNext(ppdev);
        !           382:             else
        !           383:             {
        !           384:                 // We're done:
        !           385: 
        !           386:                 return(FALSE);
        !           387:             }
        !           388:         }
        !           389:     }
        !           390:     else if (yNewTop < yBottom)
        !           391:     {
        !           392:         ppdev->pfnBankControl(ppdev, yNewTop, JustifyTop);
        !           393:         if (ppdev->rcl1WindowClip.right <= prclDest->left)
        !           394:         {
        !           395:             ASSERTVGA(ppdev->flBank & BANK_BROKEN_RASTER1, "Weird bounds");
        !           396:             ppdev->pfnBankNext(ppdev);
        !           397:         }
        !           398:     }
        !           399:     else
        !           400:     {
        !           401:         // We're done:
        !           402: 
        !           403:         return(FALSE);
        !           404:     }
        !           405: 
        !           406:     pso->pvScan0 = ppdev->pvBitmapStart;
        !           407: 
        !           408:     // Adjust the destination:
        !           409: 
        !           410:     prclNewDest->top    = yNewTop;
        !           411:     prclNewDest->left   = max(ppdev->rcl1WindowClip.left,   prclDest->left);
        !           412:     prclNewDest->bottom = min(ppdev->rcl1WindowClip.bottom, prclDest->bottom);
        !           413:     prclNewDest->right  = min(ppdev->rcl1WindowClip.right,  prclDest->right);
        !           414: 
        !           415:     // Adjust the source if there is one:
        !           416: 
        !           417:     if (pptlSrc != NULL)
        !           418:     {
        !           419:         pptlNewSrc->x = pptlSrc->x + (prclNewDest->left - prclDest->left);
        !           420:         pptlNewSrc->y = pptlSrc->y + (prclNewDest->top  - prclDest->top);
        !           421:     }
        !           422: 
        !           423:     return(TRUE);
        !           424: }
        !           425: 
        !           426: 

unix.superglobalmegacorp.com

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