From 08fac986379d1b129205ab2f0302a2ee3085b6f0 Mon Sep 17 00:00:00 2001 From: elasota Date: Sat, 28 Dec 2019 19:50:29 -0500 Subject: [PATCH] Fix mirrors, poly draw (WIP), and game over screen. Temp disable high scores. --- GpApp/Banner.cpp | 2 +- GpApp/ColorUtils.cpp | 6 +- GpApp/DynamicMaps.cpp | 18 +- GpApp/Dynamics.cpp | 40 ++-- GpApp/Externs.h | 7 +- GpApp/GameOver.cpp | 12 +- GpApp/Grease.cpp | 6 +- GpApp/HighScores.cpp | 4 + GpApp/HouseLegal.cpp | 3 +- GpApp/Input.cpp | 2 +- GpApp/InterfaceInit.cpp | 4 +- GpApp/MainWindow.cpp | 20 +- GpApp/Map.cpp | 2 +- GpApp/Marquee.cpp | 2 +- GpApp/ObjectDraw.cpp | 187 ++++++++------- GpApp/ObjectDraw2.cpp | 56 ++--- GpApp/ObjectEdit.cpp | 2 +- GpApp/Play.cpp | 16 +- GpApp/Render.cpp | 96 ++++---- GpApp/Room.cpp | 6 +- GpApp/RoomGraphics.cpp | 18 +- GpApp/RoomInfo.cpp | 4 +- GpApp/Scoreboard.cpp | 26 +-- GpApp/Tools.cpp | 2 +- GpApp/Transitions.cpp | 10 +- GpCommon/IGpInputDriver.h | 5 + PortabilityLayer/PLCore.cpp | 8 +- PortabilityLayer/PLCore.h | 2 +- PortabilityLayer/PLHacks.cpp | 8 + PortabilityLayer/PLHacks.h | 1 + PortabilityLayer/PLQDraw.cpp | 219 +++++++++++++++--- PortabilityLayer/PLQDraw.h | 12 +- PortabilityLayer/PortabilityLayer.vcxproj | 3 + .../PortabilityLayer.vcxproj.filters | 9 + PortabilityLayer/QDState.cpp | 38 +++ PortabilityLayer/QDState.h | 6 + PortabilityLayer/ScanlineMask.cpp | 32 ++- PortabilityLayer/ScanlineMask.h | 24 +- PortabilityLayer/ScanlineMaskConverter.cpp | 11 +- PortabilityLayer/ScanlineMaskDataStorage.h | 11 + PortabilityLayer/ScanlineMaskIterator.cpp | 40 ++++ PortabilityLayer/ScanlineMaskIterator.h | 19 ++ 42 files changed, 666 insertions(+), 333 deletions(-) create mode 100644 GpCommon/IGpInputDriver.h create mode 100644 PortabilityLayer/ScanlineMaskDataStorage.h create mode 100644 PortabilityLayer/ScanlineMaskIterator.cpp create mode 100644 PortabilityLayer/ScanlineMaskIterator.h diff --git a/GpApp/Banner.cpp b/GpApp/Banner.cpp index b2db7cd..09d0427 100644 --- a/GpApp/Banner.cpp +++ b/GpApp/Banner.cpp @@ -184,7 +184,7 @@ void BringUpBanner (void) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &wholePage, &wholePage, srcCopy, nil); + &wholePage, &wholePage, srcCopy); if (demoGoing) diff --git a/GpApp/ColorUtils.cpp b/GpApp/ColorUtils.cpp index f7f45b6..2d83e2d 100644 --- a/GpApp/ColorUtils.cpp +++ b/GpApp/ColorUtils.cpp @@ -66,14 +66,14 @@ void ColorOval (Rect *theRect, long color) // Given a region and color index, this function draws a solidÉ // region in that color. Current port, pen mode, etc. assumed. -void ColorRegion (RgnHandle theRgn, long color) +void ColorRegion (PortabilityLayer::ScanlineMask *scanlineMask, long colorIndex) { RGBColor theRGBColor, wasColor; GetForeColor(&wasColor); - Index2Color(color, &theRGBColor); + Index2Color(colorIndex, &theRGBColor); RGBForeColor(&theRGBColor); - PaintRgn(theRgn); + FillScanlineMask(scanlineMask); RGBForeColor(&wasColor); } diff --git a/GpApp/DynamicMaps.cpp b/GpApp/DynamicMaps.cpp index 33ccde6..6efa74f 100644 --- a/GpApp/DynamicMaps.cpp +++ b/GpApp/DynamicMaps.cpp @@ -83,7 +83,7 @@ short BackUpToSavedMap (Rect *theRect, short where, short who) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[numSavedMaps].map), - theRect, &mapRect, srcCopy, nil); + theRect, &mapRect, srcCopy); savedMaps[numSavedMaps].where = where; savedMaps[numSavedMaps].who = who; @@ -114,7 +114,7 @@ short ReBackUpSavedMap (Rect *theRect, short where, short who) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[foundIndex].map), - theRect, &mapRect, srcCopy, nil); + theRect, &mapRect, srcCopy); return (foundIndex); } @@ -143,10 +143,10 @@ void RestoreFromSavedMap (short where, short who, Boolean doSparkle) CopyBits(GetPortBitMapForCopyBits(savedMaps[i].map), (BitMap *)*GetGWorldPixMap(backSrcMap), - &mapRect, &savedMaps[i].dest, srcCopy, nil); + &mapRect, &savedMaps[i].dest, srcCopy); CopyBits(GetPortBitMapForCopyBits(savedMaps[i].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &mapRect, &savedMaps[i].dest, srcCopy, nil); + &mapRect, &savedMaps[i].dest, srcCopy); AddRectToWorkRects(&savedMaps[i].dest); @@ -271,7 +271,7 @@ void BackUpFlames (Rect *src, short index) // Copy background to map. CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); // Copy flame to map. CopyMask((BitMap *)*GetGWorldPixMap(blowerSrcMap), @@ -357,7 +357,7 @@ void BackUpTikiFlames (Rect *src, short index) // copy background to map CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); // copy flame to map CopyMask((BitMap *)*GetGWorldPixMap(blowerSrcMap), @@ -443,7 +443,7 @@ void BackUpBBQCoals (Rect *src, short index) // copy background to map CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); // copy flame to map CopyMask((BitMap *)*GetGWorldPixMap(blowerSrcMap), @@ -528,7 +528,7 @@ void BackUpPendulum (Rect *src, short index) { CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); CopyMask((BitMap *)*GetGWorldPixMap(bonusSrcMap), (BitMap *)*GetGWorldPixMap(bonusMaskMap), @@ -619,7 +619,7 @@ void BackUpStar (Rect *src, short index) { CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), GetPortBitMapForCopyBits(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); // copy flame to map CopyMask((BitMap *)*GetGWorldPixMap(bonusSrcMap), diff --git a/GpApp/Dynamics.cpp b/GpApp/Dynamics.cpp index ded3fa1..ffa3c3b 100644 --- a/GpApp/Dynamics.cpp +++ b/GpApp/Dynamics.cpp @@ -278,7 +278,7 @@ void RenderFish (short who) { CopyBits((BitMap *)*GetGWorldPixMap(fishSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); AddRectToBackRects(&dest); dest = dinahs[who].whole; QOffsetRect(&dest, playOriginH, playOriginV); @@ -403,7 +403,7 @@ void HandleMacPlus (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &plusScreen2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } @@ -420,7 +420,7 @@ void HandleMacPlus (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &plusScreen1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -459,7 +459,7 @@ void HandleTV (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &tvScreen2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -474,7 +474,7 @@ void HandleTV (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &tvScreen1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -501,7 +501,7 @@ void HandleCoffee (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &coffeeLight2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } else if (dinahs[who].timer == 100) @@ -520,7 +520,7 @@ void HandleCoffee (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &coffeeLight1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -574,7 +574,7 @@ void HandleOutlet (short who) (BitMap *)*GetGWorldPixMap(workSrcMap), &outletSrc[dinahs[who].frame], &dinahs[who].dest, - srcCopy, nil); + srcCopy); } else { @@ -624,7 +624,7 @@ void HandleVCR (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &vcrTime2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } else if (dinahs[who].timer == 100) @@ -640,7 +640,7 @@ void HandleVCR (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &vcrTime2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } else @@ -648,7 +648,7 @@ void HandleVCR (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &vcrTime1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -663,7 +663,7 @@ void HandleVCR (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &vcrTime1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -690,7 +690,7 @@ void HandleStereo (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &stereoLight2, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -707,7 +707,7 @@ void HandleStereo (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &stereoLight1, &dinahs[who].dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -735,17 +735,17 @@ void HandleMicrowave (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOn, &dest, - srcCopy, nil); + srcCopy); QOffsetRect(&dest, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOn, &dest, - srcCopy, nil); + srcCopy); QOffsetRect(&dest, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOn, &dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } @@ -761,17 +761,17 @@ void HandleMicrowave (short who) CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOff, &dest, - srcCopy, nil); + srcCopy); QOffsetRect(&dest, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOff, &dest, - srcCopy, nil); + srcCopy); QOffsetRect(&dest, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), µOff, &dest, - srcCopy, nil); + srcCopy); AddRectToBackRects(&dinahs[who].dest); } } diff --git a/GpApp/Externs.h b/GpApp/Externs.h index 9d470a4..39ffa4d 100644 --- a/GpApp/Externs.h +++ b/GpApp/Externs.h @@ -11,6 +11,11 @@ #include "PLMenus.h" +namespace PortabilityLayer +{ + class ScanlineMask; +} + #define kPreferredDepth 8 @@ -123,7 +128,7 @@ void BackSpinCursor (short); void ColorText (StringPtr, long); // --- ColorUtils.c void ColorRect (Rect *, long); void ColorOval (Rect *, long); -void ColorRegion (RgnHandle, long); +void ColorRegion (PortabilityLayer::ScanlineMask *scanlineMask, long colorIndex); void ColorLine (short, short, short, short, long); void HiliteRect (Rect *, short, short); void ColorFrameRect (Rect *, long); diff --git a/GpApp/GameOver.cpp b/GpApp/GameOver.cpp index 9402378..54ba2f0 100644 --- a/GpApp/GameOver.cpp +++ b/GpApp/GameOver.cpp @@ -41,7 +41,6 @@ void DrawPages (void); pageType pages[8]; Rect pageSrcRect, pageSrc[kPageFrames], lettersSrc[8], angelSrcRect; -RgnHandle roomRgn; GWorldPtr pageSrcMap, gameOverSrcMap, angelSrcMap; GWorldPtr pageMaskMap, angelMaskMap; short countDown, stopPages, pagesStuck; @@ -301,9 +300,7 @@ void InitDiedGameOver (void) QSetRect(&lettersSrc[i], 0, 0, 25, 32); QOffsetRect(&lettersSrc[i], 0, 32 * i); } - - roomRgn = NewRgn(); - RectRgn(roomRgn, &justRoomsRect); + pagesStuck = 0; stopPages = ((thisMac.screen.bottom - thisMac.screen.top) / 2) - 16; } @@ -405,10 +402,10 @@ void DrawPages (void) { if (pages[i].stuck) { - CopyBits((BitMap *)*GetGWorldPixMap(gameOverSrcMap), + CopyBitsConstrained((BitMap *)*GetGWorldPixMap(gameOverSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), &lettersSrc[i], &pages[i].dest, - srcCopy, roomRgn); + srcCopy, &justRoomsRect); } else { @@ -478,9 +475,6 @@ void DoDiedGameOver (void) nextLoop = TickCount() + 2; } - if (roomRgn != nil) - DisposeRgn(roomRgn); - DisposeGWorld(pageSrcMap); pageSrcMap = nil; diff --git a/GpApp/Grease.cpp b/GpApp/Grease.cpp index 4036380..38b6fe7 100644 --- a/GpApp/Grease.cpp +++ b/GpApp/Grease.cpp @@ -73,11 +73,11 @@ void HandleGrease (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[grease[i].mapNum].map), (BitMap *)*GetGWorldPixMap(workSrcMap), &src, &grease[i].dest, - srcCopy, nil); + srcCopy); CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[grease[i].mapNum].map), (BitMap *)*GetGWorldPixMap(backSrcMap), &src, &grease[i].dest, - srcCopy, nil); + srcCopy); AddRectToWorkRects(&grease[i].dest); if (grease[i].isRight) @@ -145,7 +145,7 @@ void BackupGrease (Rect *src, short index, Boolean isRight) { CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(savedMaps[index].map), - src, &dest, srcCopy, nil); + src, &dest, srcCopy); if (isRight) { diff --git a/GpApp/HighScores.cpp b/GpApp/HighScores.cpp index 7ecf326..f723e2a 100644 --- a/GpApp/HighScores.cpp +++ b/GpApp/HighScores.cpp @@ -7,6 +7,7 @@ #include "PLFolders.h" +#include "PLHacks.h" #include "PLKeyEncoding.h" #include "PLNumberFormatting.h" #include "PLScript.h" @@ -364,6 +365,9 @@ Boolean TestHighScore (void) if (resumedSavedGame) return (false); + + if (IsHighScoreDisabled()) + return false; thisHousePtr = *thisHouse; diff --git a/GpApp/HouseLegal.cpp b/GpApp/HouseLegal.cpp index 3cb45cd..7c02b18 100644 --- a/GpApp/HouseLegal.cpp +++ b/GpApp/HouseLegal.cpp @@ -737,8 +737,7 @@ void LopOffExtraRooms (void) { r = (*thisHouse)->nRooms - count; newSize = sizeof(houseType) + (sizeof(roomType) * (long)r); - SetHandleSize((Handle)thisHouse, newSize); // resize house handle (shrink) - if (MemError() != noErr) // problem? + if (SetHandleSize((Handle)thisHouse, newSize) != noErr) // resize house handle (shrink) { ForeColor(redColor); GetLocalizedString(16, message); diff --git a/GpApp/Input.cpp b/GpApp/Input.cpp index 539e424..881e77a 100644 --- a/GpApp/Input.cpp +++ b/GpApp/Input.cpp @@ -111,7 +111,7 @@ void DoPause (void) CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &bounds, &bounds, srcCopy, nil); + &bounds, &bounds, srcCopy); do { diff --git a/GpApp/InterfaceInit.cpp b/GpApp/InterfaceInit.cpp index 262130b..50d44d2 100644 --- a/GpApp/InterfaceInit.cpp +++ b/GpApp/InterfaceInit.cpp @@ -20,7 +20,7 @@ #define kDiagCursorID 131 -extern RgnHandle mirrorRgn; +extern Rect **mirrorRects; extern WindowPtr mapWindow, toolsWindow, linkWindow; extern WindowPtr menuWindow; extern Rect shieldRect, boardSrcRect, localRoomsDest[]; @@ -174,7 +174,7 @@ void VariableInit (void) doubleTime = GetDblTime(); - mirrorRgn = nil; + mirrorRects = nil; mainWindow = nil; boardWindow = nil; mapWindow = nil; diff --git a/GpApp/MainWindow.cpp b/GpApp/MainWindow.cpp index 07ec720..4544aba 100644 --- a/GpApp/MainWindow.cpp +++ b/GpApp/MainWindow.cpp @@ -11,6 +11,7 @@ #include "Externs.h" #include "Environ.h" #include "House.h" +#include "MenuManager.h" #include "RectUtils.h" #include "PLKeyEncoding.h" #include "WindowDef.h" @@ -109,11 +110,19 @@ void RedrawSplashScreen (void) LoadScaledGraphic(kSplash8BitPICT, &tempRect); DrawOnSplash(); SetPortWindowPort(mainWindow); + + CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), + GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + &workSrcRect, &workSrcRect, srcCopy); + // if (quickerTransitions) // DissBitsChunky(&workSrcRect); // else // DissBits(&workSrcRect); CopyRectMainToWork(&workSrcRect); + + mainWindow->m_graf.m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); } //-------------------------------------------------------------- UpdateMainWindow @@ -126,15 +135,15 @@ void UpdateMainWindow (void) RgnHandle dummyRgn; dummyRgn = NewRgn(); + GetPortVisibleRegion(GetWindowPort(mainWindow), dummyRgn); SetPortWindowPort(mainWindow); if (theMode == kEditMode) { PauseMarquee(); - CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), + CopyBitsConstrained((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &mainWindowRect, &mainWindowRect, srcCopy, - GetPortVisibleRegion(GetWindowPort(mainWindow), dummyRgn)); + &mainWindowRect, &mainWindowRect, srcCopy, &(*dummyRgn)->rect); ResumeMarquee(); } else if ((theMode == kSplashMode) || (theMode == kPlayMode)) @@ -144,10 +153,9 @@ void UpdateMainWindow (void) QSetRect(&tempRect, 0, 0, 640, 460); QOffsetRect(&tempRect, splashOriginH, splashOriginV); LoadScaledGraphic(kSplash8BitPICT, &tempRect); - CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), + CopyBitsConstrained((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &workSrcRect, &mainWindowRect, srcCopy, - GetPortVisibleRegion(GetWindowPort(mainWindow), dummyRgn)); + &workSrcRect, &mainWindowRect, srcCopy, &(*dummyRgn)->rect); SetPortWindowPort(mainWindow); DrawOnSplash(); diff --git a/GpApp/Map.cpp b/GpApp/Map.cpp index 6f1866e..cef50ba 100644 --- a/GpApp/Map.cpp +++ b/GpApp/Map.cpp @@ -235,7 +235,7 @@ void RedrawMapContents (void) QOffsetRect(&src, 0, type * kMapRoomHeight); CopyBits((BitMap *)*GetGWorldPixMap(nailSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mapWindow)), - &src, &aRoom, srcCopy, nil); + &src, &aRoom, srcCopy); } if (whoCares == thisRoomNumber) diff --git a/GpApp/Marquee.cpp b/GpApp/Marquee.cpp index ce8214b..bf2192d 100644 --- a/GpApp/Marquee.cpp +++ b/GpApp/Marquee.cpp @@ -435,7 +435,7 @@ void DrawGliderMarquee (void) GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), &leftStartGliderSrc, &marqueeGliderRect, - srcXor, nil); + srcXor); } //-------------------------------------------------------------- SetMarqueeGliderCenter diff --git a/GpApp/ObjectDraw.cpp b/GpApp/ObjectDraw.cpp index 1c767bd..daf5718 100644 --- a/GpApp/ObjectDraw.cpp +++ b/GpApp/ObjectDraw.cpp @@ -267,7 +267,6 @@ void DrawShelf (Rect *shelfTop) #define kShelfShadowOff 12 Rect tempRect; long brownC, ltTanC, tanC, dkRedC, blackC; - RgnHandle shadowRgn; CGrafPtr wasCPort; Pattern dummyPattern; @@ -290,10 +289,6 @@ void DrawShelf (Rect *shelfTop) wasCPort = GetGraphicsPort(); SetGraphicsPort(backSrcMap); - - shadowRgn = NewRgn(); - if (shadowRgn == nil) - RedAlert(kErrUnnaccounted); PortabilityLayer::Vec2i poly[5]; poly[0] = PortabilityLayer::Vec2i(shelfTop->left, shelfTop->bottom); @@ -302,19 +297,19 @@ void DrawShelf (Rect *shelfTop) poly[3] = poly[2] + PortabilityLayer::Vec2i(0, -kShelfThick + 1); poly[4] = poly[3] + PortabilityLayer::Vec2i(-kShelfShadowOff, -kShelfShadowOff); - //PortabilityLayer::ScanlineMask *mask = PortabilityLayer::ScanlineMaskConverter::CompilePoly(poly, sizeof(poly) / sizeof(poly[0])); + PortabilityLayer::ScanlineMask *mask = PortabilityLayer::ScanlineMaskConverter::CompilePoly(poly, sizeof(poly) / sizeof(poly[0])); - OpenRgn(); - CloseRgn(shadowRgn); - PenPat(GetQDGlobalsGray(&dummyPattern)); - PenMask(true); - if (thisMac.isDepth == 4) - ColorRegion(shadowRgn, 15); - else - ColorRegion(shadowRgn, k8DkstGrayColor); - PenNormal(); - DisposeRgn(shadowRgn); - //mask->Destroy(); + if (mask) + { + PenPat(GetQDGlobalsGray(&dummyPattern)); + PenMask(true); + if (thisMac.isDepth == 4) + ColorRegion(mask, 15); + else + ColorRegion(mask, k8DkstGrayColor); + PenNormal(); + mask->Destroy(); + } MoveTo(shelfTop->left, shelfTop->bottom); InsetRect(shelfTop, 0, 1); @@ -365,7 +360,6 @@ void DrawCabinet (Rect *cabinet) #define kCabinetShadowOff 6 Rect tempRect; long brownC, dkGrayC, ltTanC, tanC, dkRedC, blackC; - RgnHandle shadowRgn; CGrafPtr wasCPort; Pattern dummyPattern; @@ -392,24 +386,31 @@ void DrawCabinet (Rect *cabinet) SetGraphicsPort(backSrcMap); MoveTo(cabinet->left, cabinet->bottom); - shadowRgn = NewRgn(); - if (shadowRgn == nil) - RedAlert(kErrUnnaccounted); - OpenRgn(); - Line(kCabinetShadowOff, kCabinetShadowOff); - Line(RectWide(cabinet), 0); - Line(0, -RectTall(cabinet) + kCabinetDeep); - Line(-kCabinetShadowOff, -kCabinetShadowOff); - LineTo(cabinet->left, cabinet->bottom); - CloseRgn(shadowRgn); - PenPat(GetQDGlobalsGray(&dummyPattern)); - PenMask(true); - if (thisMac.isDepth == 4) - ColorRegion(shadowRgn, 15); - else - ColorRegion(shadowRgn, dkGrayC); - PenNormal(); - DisposeRgn(shadowRgn); + + { + + PortabilityLayer::Vec2i poly[5]; + poly[0] = PortabilityLayer::Vec2i(cabinet->left, cabinet->bottom); + poly[1] = poly[0] + PortabilityLayer::Vec2i(kCabinetShadowOff, kCabinetShadowOff); + poly[2] = poly[1] + PortabilityLayer::Vec2i(RectWide(cabinet), 0); + poly[3] = poly[2] + PortabilityLayer::Vec2i(0, -RectTall(cabinet) + kCabinetDeep); + poly[4] = poly[3] + PortabilityLayer::Vec2i(-kCabinetShadowOff, -kCabinetShadowOff); + + PortabilityLayer::ScanlineMask *mask = PortabilityLayer::ScanlineMaskConverter::CompilePoly(poly, sizeof(poly) / sizeof(poly[0])); + + if (mask) + { + PenPat(GetQDGlobalsGray(&dummyPattern)); + PenMask(true); + if (thisMac.isDepth == 4) + ColorRegion(mask, 15); + else + ColorRegion(mask, dkGrayC); + PenNormal(); + + mask->Destroy(); + } + } InsetRect(cabinet, 1, 1); // fill bulk of cabinet brown ColorRect(cabinet, brownC); @@ -498,19 +499,18 @@ void DrawSimpleFurniture (short what, Rect *theRect) //-------------------------------------------------------------- DrawCounter -void DrawCounter (Rect *counter) +void DrawCounter(Rect *counter) { - #define kCounterFooterHigh 12 - #define kCounterStripWide 6 - #define kCounterStripTall 29 - #define kCounterPanelDrop 12 +#define kCounterFooterHigh 12 +#define kCounterStripWide 6 +#define kCounterStripTall 29 +#define kCounterPanelDrop 12 Rect tempRect; - RgnHandle shadowRgn; long brownC, dkGrayC, tanC, blackC, dkstRedC; short nRects, width, i; CGrafPtr wasCPort; Pattern dummyPattern; - + if (thisMac.isDepth == 4) { brownC = 11; @@ -527,30 +527,36 @@ void DrawCounter (Rect *counter) blackC = k8BlackColor; dkstRedC = k8DkRed2Color; } - + wasCPort = GetGraphicsPort(); SetGraphicsPort(backSrcMap); - + MoveTo(counter->right - 2, counter->bottom); - shadowRgn = NewRgn(); - if (shadowRgn == nil) - RedAlert(kErrUnnaccounted); - OpenRgn(); - Line(10, -10); - Line(0, -RectTall(counter) + 29); - Line(2, 0); - Line(0, -7); - Line(-12, -12); - LineTo(counter->right - 2, counter->bottom); - CloseRgn(shadowRgn); - PenPat(GetQDGlobalsGray(&dummyPattern)); - PenMask(true); - if (thisMac.isDepth == 4) - ColorRegion(shadowRgn, 15); - else - ColorRegion(shadowRgn, dkGrayC); - PenNormal(); - DisposeRgn(shadowRgn); + + { + PortabilityLayer::Vec2i poly[6]; + poly[0] = PortabilityLayer::Vec2i(counter->right - 2, counter->bottom); + poly[1] = poly[0] + PortabilityLayer::Vec2i(10, -10); + poly[2] = poly[1] + PortabilityLayer::Vec2i(0, -RectTall(counter) + 29); + poly[3] = poly[2] + PortabilityLayer::Vec2i(2, 0); + poly[4] = poly[3] + PortabilityLayer::Vec2i(0, -7); + poly[5] = poly[4] + PortabilityLayer::Vec2i(-12, -12); + + PortabilityLayer::ScanlineMask *mask = PortabilityLayer::ScanlineMaskConverter::CompilePoly(poly, sizeof(poly) / sizeof(poly[0])); + + if (mask) + { + PenPat(GetQDGlobalsGray(&dummyPattern)); + PenMask(true); + if (thisMac.isDepth == 4) + ColorRegion(mask, 15); + else + ColorRegion(mask, dkGrayC); + PenNormal(); + + mask->Destroy(); + } + } InsetRect(counter, 2, 2); ColorRect(counter, brownC); @@ -642,19 +648,19 @@ void DrawCounter (Rect *counter) //-------------------------------------------------------------- DrawDresser -void DrawDresser (Rect *dresser) +void DrawDresser(Rect *dresser) { - #define kDresserTopThick 4 - #define kDresserCrease 9 - #define kDresserDrawerDrop 12 - #define kDresserSideSpare 14 +#define kDresserTopThick 4 +#define kDresserCrease 9 +#define kDresserDrawerDrop 12 +#define kDresserSideSpare 14 Rect tempRect, dest; long yellowC, brownC, dkGrayC, ltTanC, dkstRedC; RgnHandle shadowRgn; short nRects, height, i; CGrafPtr wasCPort; Pattern dummyPattern; - + if (thisMac.isDepth == 4) { yellowC = 9; @@ -671,30 +677,23 @@ void DrawDresser (Rect *dresser) ltTanC = k8LtTanColor; dkstRedC = k8DkRed2Color; } - + wasCPort = GetGraphicsPort(); SetGraphicsPort(backSrcMap); - + MoveTo(dresser->left + 10, dresser->bottom + 9); - shadowRgn = NewRgn(); - if (shadowRgn == nil) - RedAlert(kErrUnnaccounted); - OpenRgn(); - Line(RectWide(dresser) - 11, 0); - Line(9, -9); - Line(0, -RectTall(dresser) + 12); - Line(-9, -9); - Line(-RectWide(dresser) + 11, 0); - LineTo(dresser->left + 10, dresser->bottom + 9); - CloseRgn(shadowRgn); - PenPat(GetQDGlobalsGray(&dummyPattern)); - PenMask(true); - if (thisMac.isDepth == 4) - ColorRegion(shadowRgn, 15); - else - ColorRegion(shadowRgn, k8DkstGrayColor); - PenNormal(); - DisposeRgn(shadowRgn); + + { + PortabilityLayer::Vec2i poly[6]; + poly[0] = PortabilityLayer::Vec2i(dresser->left + 10, dresser->bottom + 9); + poly[1] = poly[0] + PortabilityLayer::Vec2i(RectWide(dresser) - 11, 0); + poly[2] = poly[1] + PortabilityLayer::Vec2i(9, -9); + poly[3] = poly[2] + PortabilityLayer::Vec2i(0, -RectTall(dresser) + 12); + poly[4] = poly[3] + PortabilityLayer::Vec2i(-9, -9); + poly[5] = poly[4] + PortabilityLayer::Vec2i(-RectWide(dresser) + 11, 0); + + PortabilityLayer::ScanlineMask *mask = PortabilityLayer::ScanlineMaskConverter::CompilePoly(poly, sizeof(poly) / sizeof(poly[0])); + } InsetRect(dresser, 2, 2); ColorRect(dresser, k8PumpkinColor); @@ -736,14 +735,14 @@ void DrawDresser (Rect *dresser) QOffsetRect(&dest, tempRect.left, tempRect.top); CopyBits((BitMap *)*GetGWorldPixMap(furnitureSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &knobSrc, &dest, srcCopy, nil); + &knobSrc, &dest, srcCopy); QSetRect(&dest, -4, -4, 4, 4); QOffsetRect(&dest, -HalfRectTall(&tempRect), HalfRectTall(&tempRect)); QOffsetRect(&dest, tempRect.right, tempRect.top); CopyBits((BitMap *)*GetGWorldPixMap(furnitureSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &knobSrc, &dest, srcCopy, nil); + &knobSrc, &dest, srcCopy); QOffsetRect(&tempRect, 0, kDresserTopThick + height); } @@ -988,7 +987,7 @@ void DrawClockDigit (short number, Rect *dest) { CopyBits((BitMap *)*GetGWorldPixMap(bonusSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &digits[number], dest, srcCopy, nil); + &digits[number], dest, srcCopy); } //-------------------------------------------------------------- DrawBlueClock diff --git a/GpApp/ObjectDraw2.cpp b/GpApp/ObjectDraw2.cpp index 8bae1e7..44354e0 100644 --- a/GpApp/ObjectDraw2.cpp +++ b/GpApp/ObjectDraw2.cpp @@ -302,13 +302,13 @@ void DrawLightSwitch (Rect *theRect, Boolean state) { CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &lightSwitchSrc[0], theRect, srcCopy, nil); + &lightSwitchSrc[0], theRect, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &lightSwitchSrc[1], theRect, srcCopy, nil); + &lightSwitchSrc[1], theRect, srcCopy); } } @@ -319,11 +319,11 @@ void DrawMachineSwitch (Rect *theRect, Boolean state) if (state) CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &machineSwitchSrc[0], theRect, srcCopy, nil); + &machineSwitchSrc[0], theRect, srcCopy); else CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &machineSwitchSrc[1], theRect, srcCopy, nil); + &machineSwitchSrc[1], theRect, srcCopy); } //-------------------------------------------------------------- DrawThermostat @@ -333,11 +333,11 @@ void DrawThermostat (Rect *theRect, Boolean state) if (state) CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &thermostatSrc[0], theRect, srcCopy, nil); + &thermostatSrc[0], theRect, srcCopy); else CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &thermostatSrc[1], theRect, srcCopy, nil); + &thermostatSrc[1], theRect, srcCopy); } //-------------------------------------------------------------- DrawPowerSwitch @@ -347,11 +347,11 @@ void DrawPowerSwitch (Rect *theRect, Boolean state) if (state) CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &powerSrc[0], theRect, srcCopy, nil); + &powerSrc[0], theRect, srcCopy); else CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &powerSrc[1], theRect, srcCopy, nil); + &powerSrc[1], theRect, srcCopy); } //-------------------------------------------------------------- DrawKnifeSwitch @@ -361,11 +361,11 @@ void DrawKnifeSwitch (Rect *theRect, Boolean state) if (state) CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &knifeSwitchSrc[0], theRect, srcCopy, nil); + &knifeSwitchSrc[0], theRect, srcCopy); else CopyBits((BitMap *)*GetGWorldPixMap(switchSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &knifeSwitchSrc[1], theRect, srcCopy, nil); + &knifeSwitchSrc[1], theRect, srcCopy); } //-------------------------------------------------------------- DrawInvisibleSwitch @@ -617,13 +617,13 @@ void DrawMacPlus (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &plusScreen2, &screen, srcCopy, nil); + &plusScreen2, &screen, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &plusScreen1, &screen, srcCopy, nil); + &plusScreen1, &screen, srcCopy); } @@ -693,13 +693,13 @@ void DrawTV (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &tvScreen2, &bounds, srcCopy, nil); + &tvScreen2, &bounds, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &tvScreen1, &bounds, srcCopy, nil); + &tvScreen1, &bounds, srcCopy); } } @@ -724,13 +724,13 @@ void DrawCoffee (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &coffeeLight2, &light, srcCopy, nil); + &coffeeLight2, &light, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &coffeeLight1, &light, srcCopy, nil); + &coffeeLight1, &light, srcCopy); } } @@ -787,13 +787,13 @@ void DrawVCR (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &vcrTime2, &bounds, srcCopy, nil); + &vcrTime2, &bounds, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &vcrTime1, &bounds, srcCopy, nil); + &vcrTime1, &bounds, srcCopy); } } @@ -841,13 +841,13 @@ void DrawStereo (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &stereoLight2, &bounds, srcCopy, nil); + &stereoLight2, &bounds, srcCopy); } else { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &stereoLight1, &bounds, srcCopy, nil); + &stereoLight1, &bounds, srcCopy); } } @@ -895,29 +895,29 @@ void DrawMicrowave (Rect *theRect, Boolean isOn, Boolean isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOn, &bounds, srcCopy, nil); + µOn, &bounds, srcCopy); QOffsetRect(&bounds, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOn, &bounds, srcCopy, nil); + µOn, &bounds, srcCopy); QOffsetRect(&bounds, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOn, &bounds, srcCopy, nil); + µOn, &bounds, srcCopy); } else if (isLit) { CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOff, &bounds, srcCopy, nil); + µOff, &bounds, srcCopy); QOffsetRect(&bounds, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOff, &bounds, srcCopy, nil); + µOff, &bounds, srcCopy); QOffsetRect(&bounds, 16, 0); CopyBits((BitMap *)*GetGWorldPixMap(applianceSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - µOff, &bounds, srcCopy, nil); + µOff, &bounds, srcCopy); } } @@ -1401,7 +1401,7 @@ void DrawPictSansWhiteObject (short what, Rect *theRect) CopyBits((BitMap *)*GetGWorldPixMap(tempMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &srcRects[what], theRect, transparent, nil); + &srcRects[what], theRect, transparent); SetGraphicsPort(wasCPort); @@ -1427,7 +1427,7 @@ void DrawCustPictSansWhite (short pictID, Rect *theRect) CopyBits((BitMap *)*GetGWorldPixMap(tempMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &bounds, theRect, transparent, nil); + &bounds, theRect, transparent); SetGraphicsPort(wasCPort); diff --git a/GpApp/ObjectEdit.cpp b/GpApp/ObjectEdit.cpp index 11519f3..d5359da 100644 --- a/GpApp/ObjectEdit.cpp +++ b/GpApp/ObjectEdit.cpp @@ -2676,7 +2676,7 @@ void DrawThisRoomsObjects (void) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &backSrcRect, &backSrcRect, srcCopy, nil); + &backSrcRect, &backSrcRect, srcCopy); } #endif diff --git a/GpApp/Play.cpp b/GpApp/Play.cpp index 4c4bb2d..7683312 100644 --- a/GpApp/Play.cpp +++ b/GpApp/Play.cpp @@ -394,7 +394,7 @@ void HandlePlayEvent (void) BeginUpdate(mainWindow); CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &justRoomsRect, &justRoomsRect, srcCopy, nil); + &justRoomsRect, &justRoomsRect, srcCopy); RefreshScoreboard(kNormalTitleMode); EndUpdate(mainWindow); SetPort(wasPort); @@ -507,8 +507,8 @@ void PlayGame (void) PaintRect(&boardSrcRect); CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &boardSrcRect, &boardDestRect, srcCopy, 0L); + GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + &boardSrcRect, &boardDestRect, srcCopy); { Rect bounds; @@ -550,8 +550,8 @@ void PlayGame (void) PaintRect(&boardSrcRect); CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &boardSrcRect, &boardDestRect, srcCopy, 0L); + GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + &boardSrcRect, &boardDestRect, srcCopy); SetGraphicsPort(wasCPort); } @@ -560,6 +560,10 @@ void PlayGame (void) Rect bounds; PicHandle thePicture; SInt16 hOffset; + + CGrafPtr wasCPort = GetGraphicsPort(); + + SetGraphicsPort(boardSrcMap); if (boardSrcRect.right >= 640) hOffset = (RectWide(&boardSrcRect) - kMaxViewWidth) / 2; @@ -573,6 +577,8 @@ void PlayGame (void) QOffsetRect(&bounds, hOffset, 0); DrawPicture(thePicture, &bounds); ReleaseResource((Handle)thePicture); + + SetGraphicsPort(wasCPort); } #else diff --git a/GpApp/Render.cpp b/GpApp/Render.cpp index 0a8c00e..d7f0326 100644 --- a/GpApp/Render.cpp +++ b/GpApp/Render.cpp @@ -35,7 +35,7 @@ void CopyRectsAssm (void); Rect work2MainRects[kMaxGarbageRects]; Rect back2WorkRects[kMaxGarbageRects]; Rect shieldRect; -RgnHandle mirrorRgn; +Rect **mirrorRects; Point shieldPt; long nextFrame; short numWork2Main, numBack2Work; @@ -155,31 +155,35 @@ void DrawReflection (gliderPtr thisGlider, Boolean oneOrTwo) return; SetPort((GrafPtr)workSrcMap); - GetClip(wasClip); - SetClip(mirrorRgn); - - if (oneOrTwo) + + long numMirrorRects = GetHandleSize(reinterpret_cast(mirrorRects)) / sizeof(Rect); + + for (long i = 0; i < numMirrorRects; i++) { - if (showFoil) - CopyMask((BitMap *)*GetGWorldPixMap(glid2SrcMap), - (BitMap *)*GetGWorldPixMap(glidMaskMap), - (BitMap *)*GetGWorldPixMap(workSrcMap), - &thisGlider->src, &thisGlider->mask, &dest); + const Rect *mirrorRect = (*mirrorRects) + i; + + if (oneOrTwo) + { + if (showFoil) + CopyMaskConstrained((BitMap *)*GetGWorldPixMap(glid2SrcMap), + (BitMap *)*GetGWorldPixMap(glidMaskMap), + (BitMap *)*GetGWorldPixMap(workSrcMap), + &thisGlider->src, &thisGlider->mask, &dest, mirrorRect); + else + CopyMaskConstrained((BitMap *)*GetGWorldPixMap(glidSrcMap), + (BitMap *)*GetGWorldPixMap(glidMaskMap), + (BitMap *)*GetGWorldPixMap(workSrcMap), + &thisGlider->src, &thisGlider->mask, &dest, mirrorRect); + } else - CopyMask((BitMap *)*GetGWorldPixMap(glidSrcMap), + { + CopyMaskConstrained((BitMap *)*GetGWorldPixMap(glid2SrcMap), (BitMap *)*GetGWorldPixMap(glidMaskMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &thisGlider->src, &thisGlider->mask, &dest); - } - else - { - CopyMask((BitMap *)*GetGWorldPixMap(glid2SrcMap), - (BitMap *)*GetGWorldPixMap(glidMaskMap), - (BitMap *)*GetGWorldPixMap(workSrcMap), - &thisGlider->src, &thisGlider->mask, &dest); + &thisGlider->src, &thisGlider->mask, &dest, mirrorRect); + } } - SetClip(wasClip); DisposeRgn(wasClip); src =thisGlider->whole; @@ -211,7 +215,7 @@ void RenderFlames (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[flames[i].who].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &flames[i].src, &flames[i].dest, srcCopy, nil); + &flames[i].src, &flames[i].dest, srcCopy); AddRectToWorkRects(&flames[i].dest); } @@ -230,7 +234,7 @@ void RenderFlames (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[tikiFlames[i].who].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &tikiFlames[i].src, &tikiFlames[i].dest, srcCopy, nil); + &tikiFlames[i].src, &tikiFlames[i].dest, srcCopy); AddRectToWorkRects(&tikiFlames[i].dest); } @@ -249,7 +253,7 @@ void RenderFlames (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[bbqCoals[i].who].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &bbqCoals[i].src, &bbqCoals[i].dest, srcCopy, nil); + &bbqCoals[i].src, &bbqCoals[i].dest, srcCopy); AddRectToWorkRects(&bbqCoals[i].dest); } @@ -312,7 +316,7 @@ void RenderPendulums (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[pendulums[i].who].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &pendulums[i].src, &pendulums[i].dest, srcCopy, nil); + &pendulums[i].src, &pendulums[i].dest, srcCopy); AddRectToWorkRects(&pendulums[i].dest); } @@ -440,7 +444,7 @@ void RenderStars (void) CopyBits((BitMap *)*GetGWorldPixMap(savedMaps[theStars[i].who].map), (BitMap *)*GetGWorldPixMap(workSrcMap), - &theStars[i].src, &theStars[i].dest, srcCopy, nil); + &theStars[i].src, &theStars[i].dest, srcCopy); AddRectToWorkRects(&theStars[i].dest); } @@ -624,7 +628,7 @@ void CopyRectsQD (void) CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(mainWindowGraf), &work2MainRects[i], &work2MainRects[i], - srcCopy, nil); + srcCopy); } mainWindowGraf->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); @@ -634,7 +638,7 @@ void CopyRectsQD (void) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), &back2WorkRects[i], &back2WorkRects[i], - srcCopy, nil); + srcCopy); } } @@ -701,7 +705,7 @@ void CopyRectBackToWork (Rect *theRect) { CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); } //-------------------------------------------------------------- CopyRectWorkToBack @@ -710,7 +714,7 @@ void CopyRectWorkToBack (Rect *theRect) { CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); } //-------------------------------------------------------------- CopyRectWorkToMain @@ -719,7 +723,7 @@ void CopyRectWorkToMain (Rect *theRect) { CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); } //-------------------------------------------------------------- CopyRectMainToWork @@ -728,7 +732,7 @@ void CopyRectMainToWork (Rect *theRect) { CopyBits(GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), (BitMap *)*GetGWorldPixMap(workSrcMap), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); } //-------------------------------------------------------------- CopyRectMainToBack @@ -737,30 +741,26 @@ void CopyRectMainToBack (Rect *theRect) { CopyBits(GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), (BitMap *)*GetGWorldPixMap(backSrcMap), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); } //-------------------------------------------------------------- AddToMirrorRegion void AddToMirrorRegion (Rect *theRect) { - RgnHandle tempRgn; - - if (mirrorRgn == nil) + if (mirrorRects == nil) { - mirrorRgn = NewRgn(); - if (mirrorRgn != nil) - RectRgn(mirrorRgn, theRect); + mirrorRects = reinterpret_cast(NewHandle(sizeof(Rect))); + if (mirrorRects != nil) + **mirrorRects = *theRect; } else { - tempRgn = NewRgn(); - if (tempRgn != nil) - { - RectRgn(tempRgn, theRect); - UnionRgn(mirrorRgn, tempRgn, mirrorRgn); - DisposeRgn(tempRgn); - } + const long oldSize = GetHandleSize(reinterpret_cast(mirrorRects)); + const long newSize = oldSize + sizeof(Rect); + + if (SetHandleSize(reinterpret_cast(mirrorRects), newSize) == noErr) + (*mirrorRects)[oldSize / sizeof(Rect)] = *theRect; } hasMirror = true; } @@ -769,9 +769,9 @@ void AddToMirrorRegion (Rect *theRect) void ZeroMirrorRegion (void) { - if (mirrorRgn != nil) - DisposeRgn(mirrorRgn); - mirrorRgn = nil; + if (mirrorRects != nil) + DisposeHandle(reinterpret_cast(mirrorRects)); + mirrorRects = nil; hasMirror = false; } diff --git a/GpApp/Room.cpp b/GpApp/Room.cpp index b76d85c..839dc88 100644 --- a/GpApp/Room.cpp +++ b/GpApp/Room.cpp @@ -253,7 +253,7 @@ void ReadyBackground (short theID, short *theTiles) CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &workSrcRect, &workSrcRect, srcCopy, nil); + &workSrcRect, &workSrcRect, srcCopy); return; } @@ -281,7 +281,7 @@ void ReadyBackground (short theID, short *theTiles) src.right = src.left + kTileWide; CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); QOffsetRect(&dest, kTileWide, 0); } @@ -289,7 +289,7 @@ void ReadyBackground (short theID, short *theTiles) QSetRect(&dest, 0, 0, kRoomWide, kTileHigh); CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); } //-------------------------------------------------------------- ReflectCurrentRoom diff --git a/GpApp/RoomGraphics.cpp b/GpApp/RoomGraphics.cpp index 70c3087..ae83495 100644 --- a/GpApp/RoomGraphics.cpp +++ b/GpApp/RoomGraphics.cpp @@ -232,7 +232,7 @@ void DrawRoomBackground (short who, short where, short elevation) src.right = src.left + kTileWide; CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); QOffsetRect(&dest, kTileWide, 0); } } @@ -256,7 +256,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].top - suppSrcRect.bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) @@ -274,7 +274,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) @@ -292,7 +292,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].top - suppSrcRect.bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) { @@ -309,7 +309,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) @@ -327,7 +327,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].top - suppSrcRect.bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) @@ -345,7 +345,7 @@ void DrawFloorSupport (void) localRoomsDest[kCentralRoom].bottom); CopyBits((BitMap *)*GetGWorldPixMap(suppSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); for (i = 0; i < numTempManholes; i++) if (SectRect(&dest, &tempManholes[i], &whoCares)) @@ -365,7 +365,7 @@ void ReadyBackMap (void) { CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), (BitMap *)*GetGWorldPixMap(backSrcMap), - &workSrcRect, &workSrcRect, srcCopy, nil); + &workSrcRect, &workSrcRect, srcCopy); } //-------------------------------------------------------------- RestoreWorkMap @@ -378,7 +378,7 @@ void RestoreWorkMap (void) CopyBits((BitMap *)*GetGWorldPixMap(backSrcMap), (BitMap *)*GetGWorldPixMap(workSrcMap), - &backSrcRect, &backSrcRect, srcCopy, nil); + &backSrcRect, &backSrcRect, srcCopy); } //-------------------------------------------------------------- ReadyLevel diff --git a/GpApp/RoomInfo.cpp b/GpApp/RoomInfo.cpp index 8a530c3..0f2559c 100644 --- a/GpApp/RoomInfo.cpp +++ b/GpApp/RoomInfo.cpp @@ -78,7 +78,7 @@ void UpdateRoomInfoDialog (DialogPtr theDialog) CopyBits(GetPortBitMapForCopyBits(tileSrcMap), GetPortBitMapForCopyBits(GetDialogPort(theDialog)), - &tileSrcRect, &tileSrc, srcCopy, nil); + &tileSrcRect, &tileSrc, srcCopy); /* CopyBits(&((GrafPtr)tileSrcMap)->portBits, &(((GrafPtr)theDialog)->portBits), @@ -93,7 +93,7 @@ void UpdateRoomInfoDialog (DialogPtr theDialog) CopyBits(GetPortBitMapForCopyBits(tileSrcMap), GetPortBitMapForCopyBits(GetDialogPort(theDialog)), - &src, &dest, srcCopy, nil); + &src, &dest, srcCopy); /* CopyBits(&((GrafPtr)tileSrcMap)->portBits, &(((GrafPtr)theDialog)->portBits), diff --git a/GpApp/Scoreboard.cpp b/GpApp/Scoreboard.cpp index d2fb176..624daae 100644 --- a/GpApp/Scoreboard.cpp +++ b/GpApp/Scoreboard.cpp @@ -69,7 +69,7 @@ void RefreshScoreboard (SInt16 mode) CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), - &boardSrcRect, &boardDestRect, srcCopy, 0L); + &boardSrcRect, &boardDestRect, srcCopy); MarkScoreboardPortDirty(); @@ -197,7 +197,7 @@ void RefreshRoomTitle (short mode) CopyBits((BitMap *)*GetGWorldPixMap(boardTSrcMap), (BitMap *)*GetGWorldPixMap(boardSrcMap), - &boardTSrcRect, &boardTDestRect, srcCopy, nil); + &boardTSrcRect, &boardTDestRect, srcCopy); } //-------------------------------------------------------------- RefreshNumGliders @@ -236,7 +236,7 @@ void RefreshNumGliders (void) CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap), (BitMap *)*GetGWorldPixMap(boardSrcMap), - &boardGSrcRect, &boardGDestRect, srcCopy, nil); + &boardGSrcRect, &boardGDestRect, srcCopy); } //-------------------------------------------------------------- RefreshPoints @@ -271,7 +271,7 @@ void RefreshPoints (void) CopyBits((BitMap *)*GetGWorldPixMap(boardPSrcMap), (BitMap *)*GetGWorldPixMap(boardSrcMap), - &boardPSrcRect, &boardPDestRect, srcCopy, nil); + &boardPSrcRect, &boardPDestRect, srcCopy); displayedScore = theScore; } @@ -308,7 +308,7 @@ void QuickGlidersRefresh (void) CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), - &boardGSrcRect, &boardGQDestRect, srcCopy, nil); + &boardGSrcRect, &boardGQDestRect, srcCopy); MarkScoreboardPortDirty(); } @@ -345,7 +345,7 @@ void QuickScoreRefresh (void) CopyBits((BitMap *)*GetGWorldPixMap(boardPSrcMap), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), - &boardPSrcRect, &boardPQDestRect, srcCopy, nil); + &boardPSrcRect, &boardPQDestRect, srcCopy); MarkScoreboardPortDirty(); } @@ -360,7 +360,7 @@ void QuickBatteryRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBadgesRects[kBatteryBadge], &badgesDestRects[kBatteryBadge], - srcCopy, nil); + srcCopy); } else if ((batteryTotal < 0) && (!flash)) { @@ -368,7 +368,7 @@ void QuickBatteryRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBadgesRects[kHeliumBadge], &badgesDestRects[kHeliumBadge], - srcCopy, nil); + srcCopy); } else { @@ -376,7 +376,7 @@ void QuickBatteryRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBlankRects[kBatteryBadge], &badgesDestRects[kBatteryBadge], - srcCopy, nil); + srcCopy); } MarkScoreboardPortDirty(); @@ -392,7 +392,7 @@ void QuickBandsRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBadgesRects[kBandsBadge], &badgesDestRects[kBandsBadge], - srcCopy, nil); + srcCopy); } else { @@ -400,7 +400,7 @@ void QuickBandsRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBlankRects[kBandsBadge], &badgesDestRects[kBandsBadge], - srcCopy, nil); + srcCopy); } MarkScoreboardPortDirty(); @@ -416,7 +416,7 @@ void QuickFoilRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBadgesRects[kFoilBadge], &badgesDestRects[kFoilBadge], - srcCopy, nil); + srcCopy); } else { @@ -424,7 +424,7 @@ void QuickFoilRefresh (Boolean flash) GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), &badgesBlankRects[kFoilBadge], &badgesDestRects[kFoilBadge], - srcCopy, nil); + srcCopy); } MarkScoreboardPortDirty(); diff --git a/GpApp/Tools.cpp b/GpApp/Tools.cpp index 3685fb2..131c94f 100644 --- a/GpApp/Tools.cpp +++ b/GpApp/Tools.cpp @@ -176,7 +176,7 @@ void DrawToolTiles (void) CopyBits((BitMap *)*GetGWorldPixMap(toolSrcMap), GetPortBitMapForCopyBits(GetWindowPort(toolsWindow)), - &srcRect, &destRect, srcCopy, nil); + &srcRect, &destRect, srcCopy); } } #endif diff --git a/GpApp/Transitions.cpp b/GpApp/Transitions.cpp index 3f2681d..89a9c71 100644 --- a/GpApp/Transitions.cpp +++ b/GpApp/Transitions.cpp @@ -9,6 +9,7 @@ #include "Externs.h" #include "Environ.h" #include "MainWindow.h" +#include "PLQDraw.h" #include "RectUtils.h" @@ -56,7 +57,7 @@ void PourScreenOn (Rect *theRect) CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &columnRects[i], &columnRects[i], srcCopy, nil); + &columnRects[i], &columnRects[i], srcCopy); QOffsetRect(&columnRects[i], 0, kChipHigh); columnProgress[i]++; @@ -112,12 +113,13 @@ void WipeScreenOn (short direction, Rect *theRect) } dummyRgn = NewRgn(); + GetPortVisibleRegion(GetWindowPort(mainWindow), dummyRgn); for (i = 0; i < count; i++) { - CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), + CopyBitsConstrained((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), - &wipeRect, &wipeRect, srcCopy, GetPortVisibleRegion(GetWindowPort(mainWindow), dummyRgn)); + &wipeRect, &wipeRect, srcCopy, &(*dummyRgn)->rect); QOffsetRect(&wipeRect, hOffset, vOffset); @@ -142,7 +144,7 @@ void DumpScreenOn (Rect *theRect) CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(graf), - theRect, theRect, srcCopy, nil); + theRect, theRect, srcCopy); graf->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); } diff --git a/GpCommon/IGpInputDriver.h b/GpCommon/IGpInputDriver.h new file mode 100644 index 0000000..cc97dc1 --- /dev/null +++ b/GpCommon/IGpInputDriver.h @@ -0,0 +1,5 @@ +#pragma once + +struct IGpInputDriver +{ +}; diff --git a/PortabilityLayer/PLCore.cpp b/PortabilityLayer/PLCore.cpp index 68ef213..865f0a2 100644 --- a/PortabilityLayer/PLCore.cpp +++ b/PortabilityLayer/PLCore.cpp @@ -1026,9 +1026,13 @@ OSErr PtrAndHand(const void *data, Handle handle, Size size) return noErr; } -void SetHandleSize(Handle hdl, Size newSize) +OSErr SetHandleSize(Handle hdl, Size newSize) { - PL_NotYetImplemented(); + PortabilityLayer::MemoryManager *mm = PortabilityLayer::MemoryManager::GetInstance(); + if (!mm->ResizeHandle(reinterpret_cast(hdl), newSize)) + return genericErr; + + return noErr; } void *NewPtr(Size size) diff --git a/PortabilityLayer/PLCore.h b/PortabilityLayer/PLCore.h index 0808c6c..5acbb1c 100644 --- a/PortabilityLayer/PLCore.h +++ b/PortabilityLayer/PLCore.h @@ -370,7 +370,7 @@ void DisposeHandle(Handle handle); long GetHandleSize(Handle handle); OSErr PtrAndHand(const void *data, Handle handle, Size size); // Appends data to the end of a handle -void SetHandleSize(Handle hdl, Size newSize); +OSErr SetHandleSize(Handle hdl, Size newSize); void *NewPtr(Size size); void *NewPtrClear(Size size); diff --git a/PortabilityLayer/PLHacks.cpp b/PortabilityLayer/PLHacks.cpp index fdd3a2e..80eecdc 100644 --- a/PortabilityLayer/PLHacks.cpp +++ b/PortabilityLayer/PLHacks.cpp @@ -1,11 +1,19 @@ #include "PLHacks.h" +// Trademark issue bool IsMacPlusGraphicBanned() { return true; } +// Trademark issue bool IsMacPlusSoundBanned() { return true; } + +// High scores disabled until dialogs work +bool IsHighScoreDisabled() +{ + return true; +} diff --git a/PortabilityLayer/PLHacks.h b/PortabilityLayer/PLHacks.h index db810bc..bbbdda4 100644 --- a/PortabilityLayer/PLHacks.h +++ b/PortabilityLayer/PLHacks.h @@ -2,3 +2,4 @@ bool IsMacPlusGraphicBanned(); bool IsMacPlusSoundBanned(); +bool IsHighScoreDisabled(); diff --git a/PortabilityLayer/PLQDraw.cpp b/PortabilityLayer/PLQDraw.cpp index d648bcd..01b1ed1 100644 --- a/PortabilityLayer/PLQDraw.cpp +++ b/PortabilityLayer/PLQDraw.cpp @@ -15,6 +15,8 @@ #include "ResourceManager.h" #include "ResTypeID.h" #include "RGBAColor.h" +#include "ScanlineMask.h" +#include "ScanlineMaskIterator.h" #include "QDStandardPalette.h" #include "WindowManager.h" #include "QDGraf.h" @@ -215,33 +217,33 @@ static void PlotLine(PortabilityLayer::QDState *qdState, PortabilityLayer::QDPor default: case PortabilityLayer::PlotDirection_Exhausted: return; - + case PortabilityLayer::PlotDirection_NegX_NegY: case PortabilityLayer::PlotDirection_0X_NegY: case PortabilityLayer::PlotDirection_PosX_NegY: // These should never happen, the point order is swapped so that Y is always 0 or positive assert(false); return; - + case PortabilityLayer::PlotDirection_NegX_PosY: currentPoint.m_x--; currentPoint.m_y++; plotIndex = plotIndex + pitch - pixelSize; - break; + break; case PortabilityLayer::PlotDirection_0X_PosY: currentPoint.m_y++; plotIndex = plotIndex + pitch; - break; + break; case PortabilityLayer::PlotDirection_PosX_PosY: currentPoint.m_x++; currentPoint.m_y++; plotIndex = plotIndex + pitch + pixelSize; break; - + case PortabilityLayer::PlotDirection_NegX_0Y: currentPoint.m_x--; plotIndex = plotIndex - pixelSize; - break; + break; case PortabilityLayer::PlotDirection_PosX_0Y: currentPoint.m_x++; plotIndex = plotIndex + pixelSize; @@ -572,9 +574,155 @@ void PaintOval(const Rect *rect) PL_NotYetImplemented_TODO("Ovals"); } -void PaintRgn(RgnHandle region) +void FillScanlineSpan(uint8_t *rowStart, size_t startCol, size_t endCol) { - PL_NotYetImplemented_TODO("Polys"); + for (size_t col = startCol; col < endCol; col++) + rowStart[col] = 255; +} + +void FillScanlineMask(const PortabilityLayer::ScanlineMask *scanlineMask) +{ + if (!scanlineMask) + return; + + PortabilityLayer::QDManager *qdManager = PortabilityLayer::QDManager::GetInstance(); + PortabilityLayer::QDState *qdState = qdManager->GetState(); + + const PortabilityLayer::QDPort *port = qdManager->GetPort(); + PixMap *pixMap = *port->GetPixMap(); + const Rect portRect = port->GetRect(); + const Rect maskRect = scanlineMask->GetRect(); + + const Rect constrainedRect = portRect.Intersect(maskRect); + if (!constrainedRect.IsValid()) + return; + + const size_t firstMaskRow = static_cast(constrainedRect.top - maskRect.top); + const size_t firstMaskCol = static_cast(constrainedRect.left - maskRect.left); + const size_t firstPortRow = static_cast(constrainedRect.top - portRect.top); + const size_t firstPortCol = static_cast(constrainedRect.left - portRect.left); + const size_t pitch = pixMap->m_pitch; + const size_t maskSpanWidth = scanlineMask->GetRect().right - scanlineMask->GetRect().left; + + // Skip mask rows + PortabilityLayer::ScanlineMaskIterator iter = scanlineMask->GetIterator(); + for (size_t i = 0; i < firstMaskRow; i++) + { + size_t spanRemaining = maskSpanWidth; + while (spanRemaining > 0) + spanRemaining -= iter.Next(); + } + + uint8_t color8 = 0; + + const GpPixelFormat_t pixelFormat = pixMap->m_pixelFormat; + + size_t pixelSize = 0; + switch (pixMap->m_pixelFormat) + { + case GpPixelFormats::k8BitStandard: + color8 = qdState->ResolveForeColor8(nullptr, 256); + break; + default: + PL_NotYetImplemented(); + return; + } + + uint8_t pattern8x8[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + bool havePattern = false; + if (const uint8_t *statePattern = qdState->GetPattern8x8()) + { + memcpy(pattern8x8, statePattern, 8); + for (int i = 0; i < 8; i++) + { + if (pattern8x8[i] != 0xff) + { + havePattern = true; + break; + } + } + } + + const size_t constrainedRectWidth = static_cast(constrainedRect.right - constrainedRect.left); + + uint8_t *pixMapData = static_cast(pixMap->m_data); + uint8_t *firstRowStart = pixMapData + (constrainedRect.top * pitch); + const size_t numRows = static_cast(constrainedRect.bottom - constrainedRect.top); + for (size_t row = 0; row < numRows; row++) + { + uint8_t *thisRowStart = firstRowStart + row * pitch; + + bool spanState = false; + + size_t currentSpan = iter.Next(); + { + // Skip prefix cols. If the span ends at the first col, this must not advance the iterator to it (currentSpan should be 0 instead) + size_t prefixColsRemaining = firstMaskCol; + + while (prefixColsRemaining > 0) + { + if (prefixColsRemaining <= currentSpan) + { + currentSpan -= prefixColsRemaining; + break; + } + else + { + prefixColsRemaining -= currentSpan; + currentSpan = iter.Next(); + spanState = !spanState; + } + } + } + + // Paint in-bound cols. If the span ends at the end of the mask, this must not advance the iterator beyond it (currentSpan should be 0 instead) + size_t paintColsRemaining = constrainedRectWidth; + size_t spanStartCol = firstPortCol; + + while (paintColsRemaining > 0) + { + if (paintColsRemaining <= currentSpan) + { + currentSpan -= paintColsRemaining; + break; + } + else + { + const size_t spanEndCol = spanStartCol + currentSpan; + if (spanState) + FillScanlineSpan(thisRowStart, spanStartCol, spanEndCol); + + spanStartCol = spanEndCol; + paintColsRemaining -= currentSpan; + currentSpan = iter.Next(); + spanState = !spanState; + } + } + + // Flush any lingering span + if (spanState) + { + const size_t spanEndCol = firstPortCol + constrainedRectWidth; + FillScanlineSpan(thisRowStart, spanStartCol, spanEndCol); + } + + if (row != numRows - 1) + { + size_t terminalColsRemaining = maskSpanWidth - constrainedRectWidth - firstMaskCol; + + assert(currentSpan <= terminalColsRemaining); + + terminalColsRemaining -= currentSpan; + + while (terminalColsRemaining > 0) + { + currentSpan = iter.Next(); + + assert(currentSpan <= terminalColsRemaining); + terminalColsRemaining -= currentSpan; + } + } + } } void ClipRect(const Rect *rect) @@ -703,7 +851,7 @@ void GetIndPattern(Pattern *pattern, int patListID, int index) memcpy(pattern, patternRes + 2 + (index - 1) * 8, 8); } -static void CopyBitsComplete(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *maskRectBase, const Rect *destRectBase, RgnHandle maskRegion) +static void CopyBitsComplete(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *maskRectBase, const Rect *destRectBase, const Rect *maskConstraintRect) { assert(srcBitmap->m_pixelFormat == destBitmap->m_pixelFormat); @@ -736,7 +884,10 @@ static void CopyBitsComplete(const BitMap *srcBitmap, const BitMap *maskBitmap, { const Rect constrainedSrcRect = srcRectBase->Intersect(srcBounds); - const Rect constrainedDestRect = destRectBase->Intersect(destBounds); + Rect constrainedDestRect = destRectBase->Intersect(destBounds); + + if (maskConstraintRect) + constrainedDestRect = constrainedDestRect.Intersect(*maskConstraintRect); const int32_t leftNudge = std::max(constrainedSrcRect.left - srcRectBase->left, constrainedDestRect.left - destRectBase->left); const int32_t topNudge = std::max(constrainedSrcRect.top - srcRectBase->top, constrainedDestRect.top - destRectBase->top); @@ -792,44 +943,30 @@ static void CopyBitsComplete(const BitMap *srcBitmap, const BitMap *maskBitmap, assert(destRect.left >= destBounds.left); assert(destRect.right <= destBounds.right); - const Region *mask = nullptr; - - if (maskRegion) - mask = *maskRegion; - - const Rect constrainedDestRect = mask ? destRect.Intersect(mask->rect) : destRect; - if (!constrainedDestRect.IsValid()) - return; - Rect constrainedSrcRect = srcRect; - constrainedSrcRect.left += constrainedDestRect.left - destRect.left; - constrainedSrcRect.right += constrainedDestRect.right - destRect.right; - constrainedSrcRect.top += constrainedDestRect.top - destRect.top; - constrainedSrcRect.bottom += constrainedDestRect.bottom - destRect.bottom; + constrainedSrcRect.left += destRect.left - destRect.left; + constrainedSrcRect.right += destRect.right - destRect.right; + constrainedSrcRect.top += destRect.top - destRect.top; + constrainedSrcRect.bottom += destRect.bottom - destRect.bottom; Rect constrainedMaskRect = maskRect; if (maskRectBase != nullptr) { - constrainedMaskRect.left += constrainedDestRect.left - destRect.left; - constrainedMaskRect.right += constrainedDestRect.right - destRect.right; - constrainedMaskRect.top += constrainedDestRect.top - destRect.top; - constrainedMaskRect.bottom += constrainedDestRect.bottom - destRect.bottom; + constrainedMaskRect.left += destRect.left - destRect.left; + constrainedMaskRect.right += destRect.right - destRect.right; + constrainedMaskRect.top += destRect.top - destRect.top; + constrainedMaskRect.bottom += destRect.bottom - destRect.bottom; } const size_t srcFirstCol = constrainedSrcRect.left - srcBitmap->m_rect.left; const size_t srcFirstRow = constrainedSrcRect.top - srcBitmap->m_rect.top; - const size_t destFirstCol = constrainedDestRect.left - destBitmap->m_rect.left; - const size_t destFirstRow = constrainedDestRect.top - destBitmap->m_rect.top; + const size_t destFirstCol = destRect.left - destBitmap->m_rect.left; + const size_t destFirstRow = destRect.top - destBitmap->m_rect.top; const size_t maskFirstCol = maskBitmap ? constrainedMaskRect.left - maskBitmap->m_rect.left : 0; const size_t maskFirstRow = maskBitmap ? constrainedMaskRect.top - maskBitmap->m_rect.top : 0; - if (mask && mask->size != sizeof(Region)) - { - PL_NotYetImplemented(); - } - else { size_t pixelSizeBytes = 0; @@ -900,7 +1037,12 @@ static void CopyBitsComplete(const BitMap *srcBitmap, const BitMap *maskBitmap, } } -void CopyBits(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *destRectBase, CopyBitsMode copyMode, RgnHandle maskRegion) +void CopyBits(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *destRectBase, CopyBitsMode copyMode) +{ + CopyBitsConstrained(srcBitmap, destBitmap, srcRectBase, destRectBase, copyMode, nullptr); +} + +void CopyBitsConstrained(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *destRectBase, CopyBitsMode copyMode, const Rect *constrainRect) { const BitMap *maskBitmap = nullptr; const Rect *maskRect = nullptr; @@ -910,7 +1052,12 @@ void CopyBits(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRectBa maskRect = srcRectBase; } - CopyBitsComplete(srcBitmap, maskBitmap, destBitmap, srcRectBase, maskRect, destRectBase, maskRegion); + CopyBitsComplete(srcBitmap, maskBitmap, destBitmap, srcRectBase, maskRect, destRectBase, constrainRect); +} + +void CopyMaskConstrained(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *maskRectBase, const Rect *destRectBase, const Rect *constrainRect) +{ + CopyBitsComplete(srcBitmap, maskBitmap, destBitmap, srcRectBase, maskRectBase, destRectBase, constrainRect); } void CopyMask(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *maskRectBase, const Rect *destRectBase) diff --git a/PortabilityLayer/PLQDraw.h b/PortabilityLayer/PLQDraw.h index 2a66869..907ba89 100644 --- a/PortabilityLayer/PLQDraw.h +++ b/PortabilityLayer/PLQDraw.h @@ -6,6 +6,11 @@ #include "QDGraf.h" #include "SharedTypes.h" +namespace PortabilityLayer +{ + class ScanlineMask; +} + struct Dialog; enum IconAlignmentType @@ -49,7 +54,6 @@ enum SystemColorID enum CopyBitsMode { srcCopy, - srcOr, srcXor, transparent, }; @@ -122,7 +126,7 @@ void RGBForeColor(const RGBColor *color); void DrawString(const PLPasStr &str); void PaintRect(const Rect *rect); void PaintOval(const Rect *rect); -void PaintRgn(RgnHandle region); +void FillScanlineMask(const PortabilityLayer::ScanlineMask *scanlineMask); void ClipRect(const Rect *rect); // Sets the clipping area void FrameRect(const Rect *rect); @@ -146,8 +150,10 @@ void GetIndPattern(Pattern *pattern, int patListID, int index); void DebugPixMap(PixMap **pixMap, const char *outName); -void CopyBits(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRect, const Rect *destRect, CopyBitsMode copyMode, RgnHandle maskRegion); +void CopyBits(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRect, const Rect *destRect, CopyBitsMode copyMode); +void CopyBitsConstrained(const BitMap *srcBitmap, BitMap *destBitmap, const Rect *srcRect, const Rect *destRect, CopyBitsMode copyMode, const Rect *constraintRect); void CopyMask(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRect, const Rect *maskRect, const Rect *destRect); +void CopyMaskConstrained(const BitMap *srcBitmap, const BitMap *maskBitmap, BitMap *destBitmap, const Rect *srcRectBase, const Rect *maskRectBase, const Rect *destRectBase, const Rect *constraintRect); RgnHandle NewRgn(); void RectRgn(RgnHandle region, const Rect *rect); diff --git a/PortabilityLayer/PortabilityLayer.vcxproj b/PortabilityLayer/PortabilityLayer.vcxproj index e658a8e..9125d81 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj +++ b/PortabilityLayer/PortabilityLayer.vcxproj @@ -238,6 +238,8 @@ + + @@ -315,6 +317,7 @@ + diff --git a/PortabilityLayer/PortabilityLayer.vcxproj.filters b/PortabilityLayer/PortabilityLayer.vcxproj.filters index bb3ebe2..38a1a04 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj.filters +++ b/PortabilityLayer/PortabilityLayer.vcxproj.filters @@ -387,6 +387,12 @@ Header Files + + Header Files + + + Header Files + @@ -587,5 +593,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/PortabilityLayer/QDState.cpp b/PortabilityLayer/QDState.cpp index 2727bea..d1dfd59 100644 --- a/PortabilityLayer/QDState.cpp +++ b/PortabilityLayer/QDState.cpp @@ -20,11 +20,14 @@ namespace PortabilityLayer , m_clipRegion(nullptr) , m_penInvert(false) , m_penMask(false) + , m_havePattern8x8(false) { m_backUnresolvedColor.r = m_backUnresolvedColor.g = m_backUnresolvedColor.b = m_backUnresolvedColor.a = 255; m_foreUnresolvedColor.r = m_foreUnresolvedColor.g = m_foreUnresolvedColor.b = 0; m_foreUnresolvedColor.a = 255; m_penPos.h = m_penPos.v = 0; + + memset(m_pattern8x8, 0, sizeof(m_pattern8x8)); } void QDState::SetForeColor(const RGBAColor &color) @@ -81,4 +84,39 @@ namespace PortabilityLayer return resolvedColor; } } + + void QDState::SetPenPattern8x8(const uint8_t *pattern) + { + if (!pattern) + { + m_havePattern8x8 = false; + return; + } + + bool isSolid = true; + for (int i = 0; i < 8; i++) + { + if (pattern[i] != 0xff) + { + isSolid = false; + break; + } + } + + if (isSolid) + m_havePattern8x8 = false; + else + { + m_havePattern8x8 = true; + memcpy(m_pattern8x8, pattern, sizeof(m_pattern8x8)); + } + } + + const uint8_t *QDState::GetPattern8x8() const + { + if (m_havePattern8x8) + return m_pattern8x8; + + return nullptr; + } } diff --git a/PortabilityLayer/QDState.h b/PortabilityLayer/QDState.h index 5f3eb26..e8aed6c 100644 --- a/PortabilityLayer/QDState.h +++ b/PortabilityLayer/QDState.h @@ -28,6 +28,9 @@ namespace PortabilityLayer uint8_t ResolveForeColor8(const RGBAColor *palette, unsigned int numColors); uint8_t ResolveBackColor8(const RGBAColor *palette, unsigned int numColors); + void SetPenPattern8x8(const uint8_t *pattern); + const uint8_t *GetPattern8x8() const; + private: static uint8_t ResolveColor8(const RGBAColor &color, uint8_t &cached, bool &isCached, const RGBAColor *palette, unsigned int numColors); @@ -39,6 +42,9 @@ namespace PortabilityLayer uint8_t m_foreResolvedColor8; uint8_t m_backResolvedColor8; + uint8_t m_pattern8x8[8]; + bool m_havePattern8x8; + bool m_isForeResolved16; bool m_isForeResolved8; bool m_isBackResolved16; diff --git a/PortabilityLayer/ScanlineMask.cpp b/PortabilityLayer/ScanlineMask.cpp index bf6d223..f55dc32 100644 --- a/PortabilityLayer/ScanlineMask.cpp +++ b/PortabilityLayer/ScanlineMask.cpp @@ -1,6 +1,7 @@ #include "CoreDefs.h" #include "ScanlineMask.h" #include "ScanlineMaskBuilder.h" +#include "ScanlineMaskIterator.h" #include #include @@ -13,7 +14,17 @@ namespace PortabilityLayer free(this); } - ScanlineMask *ScanlineMask::Create(const ScanlineMaskBuilder &builder) + const Rect &ScanlineMask::GetRect() const + { + return m_rect; + } + + ScanlineMaskIterator ScanlineMask::GetIterator() const + { + return ScanlineMaskIterator(m_data, m_dataStorage); + } + + ScanlineMask *ScanlineMask::Create(const Rect &rect, const ScanlineMaskBuilder &builder) { size_t alignedPrefixSize = sizeof(ScanlineMask) + PL_SYSTEM_MEMORY_ALIGNMENT - 1; alignedPrefixSize -= alignedPrefixSize % PL_SYSTEM_MEMORY_ALIGNMENT; @@ -23,18 +34,18 @@ namespace PortabilityLayer const size_t *spans = builder.GetSpans(); size_t storageSize = numSpans; - DataStorage dataStorage = DataStorage_UInt8; + ScanlineMaskDataStorage dataStorage = ScanlineMaskDataStorage_UInt8; if (longestSpan <= 0xff) - dataStorage = DataStorage_UInt8; + dataStorage = ScanlineMaskDataStorage_UInt8; else if (longestSpan <= 0xffff) { storageSize *= 2; - dataStorage = DataStorage_UInt16; + dataStorage = ScanlineMaskDataStorage_UInt16; } else if (longestSpan <= 0xffffffff) { storageSize *= 4; - dataStorage = DataStorage_UInt32; + dataStorage = ScanlineMaskDataStorage_UInt32; } else return nullptr; @@ -45,19 +56,19 @@ namespace PortabilityLayer void *spanStorage = static_cast(storage) + alignedPrefixSize; - ScanlineMask *mask = new (storage) ScanlineMask(dataStorage, spanStorage, numSpans); + ScanlineMask *mask = new (storage) ScanlineMask(rect, dataStorage, spanStorage, numSpans); for (size_t i = 0; i < numSpans; i++) { switch (dataStorage) { - case DataStorage_UInt8: + case ScanlineMaskDataStorage_UInt8: static_cast(spanStorage)[i] = static_cast(spans[i]); break; - case DataStorage_UInt16: + case ScanlineMaskDataStorage_UInt16: static_cast(spanStorage)[i] = static_cast(spans[i]); break; - case DataStorage_UInt32: + case ScanlineMaskDataStorage_UInt32: static_cast(spanStorage)[i] = static_cast(spans[i]); break; } @@ -66,10 +77,11 @@ namespace PortabilityLayer return mask; } - ScanlineMask::ScanlineMask(DataStorage dataStorage, const void *data, size_t numSpans) + ScanlineMask::ScanlineMask(const Rect &rect, ScanlineMaskDataStorage dataStorage, const void *data, size_t numSpans) : m_dataStorage(dataStorage) , m_data(data) , m_numSpans(numSpans) + , m_rect(rect) { } diff --git a/PortabilityLayer/ScanlineMask.h b/PortabilityLayer/ScanlineMask.h index 2e088c6..85cd18d 100644 --- a/PortabilityLayer/ScanlineMask.h +++ b/PortabilityLayer/ScanlineMask.h @@ -1,31 +1,31 @@ #pragma once -#include +#include + +#include "SharedTypes.h" +#include "ScanlineMaskDataStorage.h" namespace PortabilityLayer { class ScanlineMaskBuilder; - + class ScanlineMaskIterator; + class ScanlineMask { public: void Destroy(); + const Rect &GetRect() const; + ScanlineMaskIterator GetIterator() const; - static ScanlineMask *Create(const ScanlineMaskBuilder &builder); + static ScanlineMask *Create(const Rect &rect, const ScanlineMaskBuilder &builder); private: - enum DataStorage - { - DataStorage_UInt8, - DataStorage_UInt16, - DataStorage_UInt32, - }; - - explicit ScanlineMask(DataStorage dataStorage, const void *data, size_t numSpans); + explicit ScanlineMask(const Rect &rect, ScanlineMaskDataStorage dataStorage, const void *data, size_t numSpans); ~ScanlineMask(); - const DataStorage m_dataStorage; + const ScanlineMaskDataStorage m_dataStorage; const void *m_data; const size_t m_numSpans; + const Rect m_rect; }; } diff --git a/PortabilityLayer/ScanlineMaskConverter.cpp b/PortabilityLayer/ScanlineMaskConverter.cpp index ec916ff..07b3b9c 100644 --- a/PortabilityLayer/ScanlineMaskConverter.cpp +++ b/PortabilityLayer/ScanlineMaskConverter.cpp @@ -8,7 +8,7 @@ #include #include -#define PL_SCANLINE_MASKS_DEBUGGING 1 +#define PL_SCANLINE_MASKS_DEBUGGING 0 #if PL_SCANLINE_MASKS_DEBUGGING #include "stb_image_write.h" @@ -240,9 +240,16 @@ namespace PortabilityLayer } } +#if PL_SCANLINE_MASKS_DEBUGGING + static int debugID = 0; + char path[256]; + sprintf_s(path, "DebugData/ScanlineMask%i.png", debugID++); + stbi_write_png(path, width, height, 4, flagBits, width * 4); +#endif + free(storage); - return ScanlineMask::Create(maskBuilder); + return ScanlineMask::Create(Rect::Create(minPoint.m_y, minPoint.m_x, minPoint.m_y + static_cast(height), minPoint.m_x + static_cast(width)), maskBuilder); } class PolyPlotter final : public IPlotter diff --git a/PortabilityLayer/ScanlineMaskDataStorage.h b/PortabilityLayer/ScanlineMaskDataStorage.h new file mode 100644 index 0000000..d6694d6 --- /dev/null +++ b/PortabilityLayer/ScanlineMaskDataStorage.h @@ -0,0 +1,11 @@ +#pragma once + +namespace PortabilityLayer +{ + enum ScanlineMaskDataStorage + { + ScanlineMaskDataStorage_UInt8, + ScanlineMaskDataStorage_UInt16, + ScanlineMaskDataStorage_UInt32, + }; +} diff --git a/PortabilityLayer/ScanlineMaskIterator.cpp b/PortabilityLayer/ScanlineMaskIterator.cpp new file mode 100644 index 0000000..e4db142 --- /dev/null +++ b/PortabilityLayer/ScanlineMaskIterator.cpp @@ -0,0 +1,40 @@ +#include "ScanlineMaskIterator.h" + +namespace PortabilityLayer +{ + ScanlineMaskIterator::ScanlineMaskIterator(const void *data, ScanlineMaskDataStorage dataStorage) + : m_loc(data) + , m_storage(dataStorage) + { + } + + size_t ScanlineMaskIterator::Next() + { + switch (m_storage) + { + case ScanlineMaskDataStorage_UInt8: + { + const uint8_t *loc = static_cast(m_loc); + uint8_t value = *loc; + m_loc = loc + 1; + return value; + } + case ScanlineMaskDataStorage_UInt16: + { + const uint16_t *loc = static_cast(m_loc); + uint16_t value = *loc; + m_loc = loc + 1; + return value; + } + case ScanlineMaskDataStorage_UInt32: + { + const uint32_t *loc = static_cast(m_loc); + uint32_t value = *loc; + m_loc = loc + 1; + return value; + } + default: + return 0; + } + } +} diff --git a/PortabilityLayer/ScanlineMaskIterator.h b/PortabilityLayer/ScanlineMaskIterator.h new file mode 100644 index 0000000..16e4373 --- /dev/null +++ b/PortabilityLayer/ScanlineMaskIterator.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include "ScanlineMaskDataStorage.h" + +namespace PortabilityLayer +{ + class ScanlineMaskIterator + { + public: + ScanlineMaskIterator(const void *data, ScanlineMaskDataStorage dataStorage); + size_t Next(); + + private: + const void *m_loc; + const ScanlineMaskDataStorage m_storage; + }; +}