From 3a327a27e7f2b437dee3d429758ddb031b80e042 Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 3 Nov 2020 19:59:26 -0500 Subject: [PATCH] Add stop demo button --- ApplicationResourcePatches/PICT/1976.bmp | Bin 4158 -> 12342 bytes ApplicationResourcePatches/PICT/1977.bmp | Bin 4158 -> 12342 bytes GpApp/Externs.h | 1 + GpApp/GliderStructs.h | 4 +- GpApp/Input.cpp | 6 ++ GpApp/Play.cpp | 8 +- GpApp/Render.cpp | 63 +++++++++----- GpApp/Utilities.cpp | 16 ++++ PortabilityLayer/PLQDraw.cpp | 100 +++++++++++++++++------ PortabilityLayer/QDGraf.h | 2 +- 10 files changed, 146 insertions(+), 54 deletions(-) diff --git a/ApplicationResourcePatches/PICT/1976.bmp b/ApplicationResourcePatches/PICT/1976.bmp index 301a28b44aed661624cf1afcf94e47505190e5b5..22b2156a639579ed4e1cf8125acae2ac61fa5032 100644 GIT binary patch literal 12342 zcmeI2c}Ub-6vxdhTdcJ5sU`FfE!*hTgHW@KXNK)a+aFdG_D2TcgBFTH+G)oUUVBtl zltGXcMkYi(A}S;)l2nQ|w9?<~%|5>G_59wQr7?eVXB_RlE_bFocm14m&pr42e)-3o ziNA%kriu7Y#%HSh=@t@;5~aWUhlH@t&(xJP@cZ$WA1=GAAERUMfeVXXTkdgd_i(Y-qxb>xT+^?7+lnjt#c zwsWWc{d+dLu~E8oNt>8xLzCCrnTN_=`KgkkN*>#=dEL{;kJ9AHW?Ee#|Mu0Q>0CmaA7asCo2A1(gB@ z{9nFEIXT9tC_B&n``gh(`ro`+-=l}4zMf4}TB=3)^l2x5cD5PyuU|{EW|;;Kw56t+ zA!c)P^Ri`MNk70~BPGdKej1K%8s4uTLqZ-t+)6c3QA|a|pPg-jMe$5MiGTNQ{mPXF z41totiBTmbTKpvYS+j=O*tKgK8iMcQVm)e#i*>vPKam2(9~o(*31eeret?yiYtEh1 zQ7$ZGMuJTIuy(Y5`Xue$%fM#NG+nsh z^f58k+*~7dfIA|I@J;>ww10Wk)_W8)nsNmm047zrOHK% zi>mOUsGoOfgPiMm82xrKdZc)x3Eov{hBX8?br2W*RJPKR0e@8XDLYxnqZ6%N7ITLz<8u zVJzAfKl~MSzH&udRHTFD<0lRgHib}wz&~u5EiTS&({W~j0iVg$)ds%(Z2R#r0pg$rfc(9o7w zuNXhCA%4{G^!BZUzzJiya;Qm|KQYl-T`fm)G(*NAKp7ukt;as0Q$^65K z6V8a5bSJF;4I5ZMj(d~){MN@<=l)`8ul(rmaeh-%sI!daORA^{K?6( zH^#FS_7`yr0+qFE4Y&^Au6e`=_r8C>{?H+|DAMucI{d_=3ak!t&7Lj$&&!v!2M*}4 ziRc3(@$jE--bfgQjK?l4gn-|b-U3t8F-p~`dQ5|{hvNE;zkd5&FT&FN39-O1}Re6L^o z3Hj;9TEO*KwGdj%##+F6?E7a?r|UWN>_v^vGQEgHkB02Ebq6tM$kqXqrKT$e4H*Ts za`mW=(PRDbOwX>*_sSTr`C~`RKF;6H$*O#Q=4koh|Ns58C$wIT^LzdCvuF6cH~~Pu B6Se>V diff --git a/ApplicationResourcePatches/PICT/1977.bmp b/ApplicationResourcePatches/PICT/1977.bmp index 7023eb19fa6b164346d97ee7ee3ee72050ec0f06..d1a5ee18993fd6a329da92011f4baea47cc49cb2 100644 GIT binary patch literal 12342 zcmeI2c}P@S9LLQxTdcGawS*$HY@^p7g_>nNGi*oN{;;I5KQajaXrU;iopvn$XphQ@ zG6=H5$b_gzM1>?pl1kBrR(i)7M;&Lz@qLfK`+jq0ni*&AjAQS;E@#Fw=bq*BThF<- z{#-cikATi=8ouN4nI(UE1w^4n*I$DI0>tO{^($$h-GBhc#$Q% zyf6u-QsDr~bv+%f)9HKyPYmirP|eSp4-E}{^5lu+#f9OR1SBd%P{;2>c#>PS2rBr0 zhOeybh>Ge62vAcn5W^t_L#* z+&NuRQd_TH7FzD*OAUA6N@-~$?&jvUpk>=OJ?ephmOgzfy?cvMCr&h>Jv+OVW{8L| z@7=5a{8@~ytCOx>)5XS`am(S>#z$p`{M2Z-!-{!rudiRF88g~wbvOBU@7BM5t;x-8 z#;8-LZ1_t`8tdzA7I^+#6BA=E0@83)F=NpC$F()Rr zLCl7RhO8_+AqoIsh>?=yDL)OzHw_;+P#~d<8DpZB@Nl6b;!jUEz@xZOPvYOdU%z&3 zGloFP;KZoHLLGjR|7_SGeC*aOEe*kUL4h7E1qDsqf}gm2#UB=CrU|2>WPX5^lxQzq zYNC>tC!7R@_~Gri`|X=_@Sp&jH_ve8ij{xUCc%I4qK;{I?GnObDsG|Wx{sgc=kI&> zWMvZn)29-g=keo4xF0<2?OW+r;|JCH^(|ATn5e|X3A?cV>+0an&@l9Aq1d^9zY)Tc z|M*}3DJdf2a8X435xpgek`>YmaxY!PpO7H5fe1Qq zKpz=t%FJw~4oF8N5x%Lvm;NuW+WF_zE6w=vMw%b|%3D-d?q6uRdR2~y(9m`gAC1J1 zlm%6P|86r!QIQtG;wyg8aw#io+`PFNhTzGIiyQeaR|*RS@aomA)RLNNRc3y^jvALQ zm-k=TF(boJUM{_Pqk%TIZk5v)FF~@Y);~r_m7Z#wQSJ$I)WI zfOhyl&&(C?`LX#XB^lGw+S1aDbLX~Bngr*uSqN0Ph0?E|)$Rlk6l95yHzDn>SkXFb zmJw4i7%GvGh$&-ovh0n@TU_^&|LD=Cni>s~hRB1G1YgBAx^yX9U!=;A5DTp`dbEkx zrAl6&{?jMADaK-|$QhEG-rMt5(T}Njw5nRS6R;TqwIA^Us{w zHhp^AB;(-3UPos9g;}|hx}+PD--<7mdUh%fgSJO z34U%NezfrQ@uP%;6UMS~=$2~!*jQ6Vg*-i;j~+Z|%*kmUHq6GOyyQoGJ$$GwF4jJJ zBs>$j0y~1Q__MRc5v8I+gFPKjC_JsQ;*cNSLjJRIrPY5(|BDvc`wz{AxITMUYIxZo{+e7u~E z@oWYA;@pCR%Epb&*bb1c`NW9ye)zEd*fFsvuG6QR@DqfEKhpDiZEXjM5E9aU@}v&$2RgSe0g3(S#S1AWMi5q3 ziWa*I`&3GbtYN%cKuFRBu`FmFa{Qu>xUefotwV>(9iZxQ<4j06Yu2>RnPV6}+$Qj&qs7sJ z3(gWqp?&*`C{x1oyF}OTA8?mM;P+Q70w(llVR(<;Uy*dqtl&3(hIjE#W8_YDPQ}*g zK`Xce4^G$o>_|VyLbqB$3C}){x3a8Qu5`)IBKR#9l<*GU*)lvT?(nk+ez1ZP-nHgQ z3OD&#gl@Hh6242#d&H)@cU2%)$rcvpOioc3}q0huB-UZSKjlp6;xx>Ky~mw b;U`1%)VES^J;mV7y8k79r7XYe{?x$V`R#`f literal 4158 zcmeH{OK!t33`Fg&x(afPo+2o^&#ikNUm+2rJ`AOj&c_IX03x7pIGhn}+0M`Lu%9k* zD8FB2egCa_`Yfo%?{1oGeU#ExiPN$yrwU*BJ8uZP?hW>N_{aH;_viWvWN*o>-_JIG zJ|*w?d&*ULM}E_6x&C|oRnJUSFuJli{Qr`}l&Ws=do^=B*Y6S4=pAr7MUBofy@*4PhU~R<2Qg^K)&Y~HrYi;w83na+ z^{9@~bN%s5&#uq+${4TtV@JzA&)?3;s(gOtX!+s)|NXQlv|f$#d;jyZXZX4}12uOP AwEzGB diff --git a/GpApp/Externs.h b/GpApp/Externs.h index 6b64211..a8cf92c 100644 --- a/GpApp/Externs.h +++ b/GpApp/Externs.h @@ -201,6 +201,7 @@ short RandomInt (short); long RandomLong (long); void RedAlert (short); void LoadGraphic (DrawSurface *surface, short resID); // Only loads from app resources +void LoadGraphicNoDither (DrawSurface *surface, short resID); void LoadGraphicCustom (DrawSurface *surface, short resID); // Supports custom graphics void LoadScaledGraphic (DrawSurface *, short, Rect *); // Only loads from app resources void LoadScaledGraphicCustom (DrawSurface *, short, Rect *); // Supports custom graphics diff --git a/GpApp/GliderStructs.h b/GpApp/GliderStructs.h index d36c589..328c595 100644 --- a/GpApp/GliderStructs.h +++ b/GpApp/GliderStructs.h @@ -439,8 +439,8 @@ namespace touchScreenControlGraphics BandsDisabled, BandsActive, BandsIdle, - FlipActive, - FlipIdle, + StopActive, + StopIdle, MoveRightActive, MoveRightIdle, MoveLeftActive, diff --git a/GpApp/Input.cpp b/GpApp/Input.cpp index c022355..a7fa33f 100644 --- a/GpApp/Input.cpp +++ b/GpApp/Input.cpp @@ -494,6 +494,12 @@ void DoHeliumEngaged (gliderPtr thisGlider) if (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl))) DoCommandKey(); + // Cheesy - Use touchscreen menu as quit + if (pendingTouchScreenMenu) + { + playing = false; + paused = false; + } #endif } diff --git a/GpApp/Play.cpp b/GpApp/Play.cpp index cd0f00a..70a165e 100644 --- a/GpApp/Play.cpp +++ b/GpApp/Play.cpp @@ -581,7 +581,11 @@ void ResetTouchScreenControlBounds (void) points[TouchScreenCtrlIDs::Movement] = Point::Create(mainWindowRect.left, mainWindowRect.top); points[TouchScreenCtrlIDs::BatteryHelium] = Point::Create(mainWindowRect.left + touchScreenControlEdgeSpacing, mainWindowRect.top + touchScreenControlEdgeSpacing); points[TouchScreenCtrlIDs::Bands] = Point::Create(mainWindowRect.right - touchScreenControlEdgeSpacing - touchScreenControlSize, mainWindowRect.top + touchScreenControlEdgeSpacing); - points[TouchScreenCtrlIDs::Menu] = Point::Create(points[TouchScreenCtrlIDs::Bands].h - touchScreenControlInterSpacing - touchScreenControlSize, points[TouchScreenCtrlIDs::BatteryHelium].v); + + if (demoGoing) + points[TouchScreenCtrlIDs::Menu] = Point::Create(mainWindowRect.right - touchScreenControlEdgeSpacing - touchScreenControlSize, mainWindowRect.top + touchScreenControlEdgeSpacing); + else + points[TouchScreenCtrlIDs::Menu] = Point::Create(points[TouchScreenCtrlIDs::Bands].h - touchScreenControlInterSpacing - touchScreenControlSize, points[TouchScreenCtrlIDs::BatteryHelium].v); for (int i = 0; i < TouchScreenCtrlIDs::Count; i++) sizes[i] = Point::Create(touchScreenControlSize, touchScreenControlSize); @@ -622,7 +626,7 @@ void InitTouchScreenControlState(void) Rect resRect = Rect::Create(0, 0, touchScreenControlSize, touchScreenControlSize); (void)CreateOffScreenGWorld(&touchScreen.graphics[i], &resRect); - LoadGraphic(touchScreen.graphics[i], resID); + LoadGraphicNoDither(touchScreen.graphics[i], resID); } pendingTouchScreenMenu = false; diff --git a/GpApp/Render.cpp b/GpApp/Render.cpp index 46e9f96..3ce5c7c 100644 --- a/GpApp/Render.cpp +++ b/GpApp/Render.cpp @@ -611,43 +611,62 @@ void RenderShreds (void) void RenderTouchScreenControls (void) { - if (demoGoing) - return; - DrawSurface *ctrlGraphics[TouchScreenCtrlIDs::Count]; for (int i = 0; i < TouchScreenCtrlIDs::Count; i++) ctrlGraphics[i] = nullptr; ctrlGraphics[TouchScreenCtrlIDs::Movement] = nullptr; - ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsDisabled]; - ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryDisabled]; - ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::MenuIdle]; - if (batteryTotal < 0) - ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::HeliumIdle]; - else if (batteryTotal > 0) - ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryIdle]; + if (demoGoing) + { + ctrlGraphics[TouchScreenCtrlIDs::Bands] = nullptr; + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = nullptr; + ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::StopIdle]; + } + else + { + ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsDisabled]; + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryDisabled]; + ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::MenuIdle]; - if (bandsTotal > 0) - ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsIdle]; + if (batteryTotal < 0) + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::HeliumIdle]; + else if (batteryTotal > 0) + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryIdle]; + + if (bandsTotal > 0) + ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsIdle]; + } for (int i = 0; i < touchScreenControlState::kMaxFingers; i++) { - if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::BatteryHelium) + if (demoGoing) { - if (batteryTotal < 0) - ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::HeliumActive]; - else if (batteryTotal > 0) - ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryActive]; + if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::Menu) + { + ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::StopActive]; + } } - else if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::Bands) + else { - if (bandsTotal > 0) - ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsActive]; + if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::BatteryHelium) + { + if (batteryTotal < 0) + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::HeliumActive]; + else if (batteryTotal > 0) + ctrlGraphics[TouchScreenCtrlIDs::BatteryHelium] = touchScreen.graphics[touchScreenControlGraphics::BatteryActive]; + } + else if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::Bands) + { + if (bandsTotal > 0) + ctrlGraphics[TouchScreenCtrlIDs::Bands] = touchScreen.graphics[touchScreenControlGraphics::BandsActive]; + } + else if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::Menu) + { + ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::MenuActive]; + } } - else if (touchScreen.fingers[i].capturingControl == TouchScreenCtrlIDs::Menu) - ctrlGraphics[TouchScreenCtrlIDs::Menu] = touchScreen.graphics[touchScreenControlGraphics::MenuActive]; } for (int i = 0; i < TouchScreenCtrlIDs::Count; i++) diff --git a/GpApp/Utilities.cpp b/GpApp/Utilities.cpp index 0513b93..aee7235 100644 --- a/GpApp/Utilities.cpp +++ b/GpApp/Utilities.cpp @@ -277,6 +277,22 @@ void LoadGraphic (DrawSurface *surface, short resID) thePicture.Dispose(); } +void LoadGraphicNoDither(DrawSurface *surface, short resID) +{ + Rect bounds; + THandle thePicture; + + thePicture = PortabilityLayer::ResourceManager::GetInstance()->GetAppResource('PICT', resID).StaticCast(); + if (thePicture == nil) + RedAlert(kErrFailedGraphicLoad); + + bounds = (*thePicture)->GetRect(); + OffsetRect(&bounds, -bounds.left, -bounds.top); + surface->DrawPicture(thePicture, bounds, false); + + thePicture.Dispose(); +} + //-------------------------------------------------------------- LoadGraphicCustom // Same as LoadGraphic but supports custom graphics void LoadGraphicCustom(DrawSurface *surface, short resID) diff --git a/PortabilityLayer/PLQDraw.cpp b/PortabilityLayer/PLQDraw.cpp index 2e0bb0a..9ac1760 100644 --- a/PortabilityLayer/PLQDraw.cpp +++ b/PortabilityLayer/PLQDraw.cpp @@ -543,7 +543,7 @@ static void RedistributeError(int16_t *errorDiffusionNextRow, int16_t *errorDiff } } -void DrawSurface::DrawPicture(THandle pictHdl, const Rect &bounds) +void DrawSurface::DrawPicture(THandle pictHdl, const Rect &bounds, bool errorDiffusion) { if (!pictHdl) return; @@ -722,7 +722,7 @@ void DrawSurface::DrawPicture(THandle pictHdl, const Rect &bounds) int16_t *errorDiffusionNextRow = nullptr; int16_t *errorDiffusionCurrentRow = nullptr; - if (bpp == 16 || bpp == 24) + if ((bpp == 16 || bpp == 24) && errorDiffusion) { errorDiffusionBuffer = static_cast(memManager->Alloc(sizeof(int16_t) * numCopyCols * 2 * 3)); if (!errorDiffusionBuffer) @@ -802,31 +802,58 @@ void DrawSurface::DrawPicture(THandle pictHdl, const Rect &bounds) } else { - for (size_t col = 0; col < numCopyCols; col++) + if (!errorDiffusion) { - const size_t srcColIndex = col + firstSourceCol; - const size_t destColIndex = col + firstDestCol; + for (size_t col = 0; col < numCopyCols; col++) + { + const size_t srcColIndex = col + firstSourceCol; + const size_t destColIndex = col + firstDestCol; - const uint8_t srcLow = currentSourceRow[srcColIndex * 2 + 0]; - const uint8_t srcHigh = currentSourceRow[srcColIndex * 2 + 1]; + const uint8_t srcLow = currentSourceRow[srcColIndex * 2 + 0]; + const uint8_t srcHigh = currentSourceRow[srcColIndex * 2 + 1]; - const unsigned int combinedValue = srcLow | (srcHigh << 8); - const unsigned int b = (combinedValue & 0x1f); - const unsigned int g = ((combinedValue >> 5) & 0x1f); - const unsigned int r = ((combinedValue >> 10) & 0x1f); + const unsigned int combinedValue = srcLow | (srcHigh << 8); + const unsigned int b = (combinedValue & 0x1f); + const unsigned int g = ((combinedValue >> 5) & 0x1f); + const unsigned int r = ((combinedValue >> 10) & 0x1f); - const unsigned int xr = (r << 5) | (r >> 2); - const unsigned int xg = (g << 5) | (g >> 2); - const unsigned int xb = (b << 5) | (b >> 2); + const unsigned int xr = (r << 5) | (r >> 2); + const unsigned int xg = (g << 5) | (g >> 2); + const unsigned int xb = (b << 5) | (b >> 2); - ErrorDiffusionWorkPixel wp = ApplyErrorDiffusion(errorDiffusionCurrentRow, xr, xg, xb, col, numCopyCols); + uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(xr, xg, xb, 255)); - uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(wp.m_8[0], wp.m_8[1], wp.m_8[2], 255)); - PortabilityLayer::RGBAColor resultColor = stdPalette->GetColors()[colorIndex]; + currentDestRow[destColIndex] = colorIndex; + } + } + else + { + for (size_t col = 0; col < numCopyCols; col++) + { + const size_t srcColIndex = col + firstSourceCol; + const size_t destColIndex = col + firstDestCol; - RedistributeError(errorDiffusionNextRow, errorDiffusionCurrentRow, wp.m_16[0], wp.m_16[1], wp.m_16[2], resultColor.r, resultColor.g, resultColor.b, col, numCopyCols); + const uint8_t srcLow = currentSourceRow[srcColIndex * 2 + 0]; + const uint8_t srcHigh = currentSourceRow[srcColIndex * 2 + 1]; - currentDestRow[destColIndex] = colorIndex; + const unsigned int combinedValue = srcLow | (srcHigh << 8); + const unsigned int b = (combinedValue & 0x1f); + const unsigned int g = ((combinedValue >> 5) & 0x1f); + const unsigned int r = ((combinedValue >> 10) & 0x1f); + + const unsigned int xr = (r << 5) | (r >> 2); + const unsigned int xg = (g << 5) | (g >> 2); + const unsigned int xb = (b << 5) | (b >> 2); + + ErrorDiffusionWorkPixel wp = ApplyErrorDiffusion(errorDiffusionCurrentRow, xr, xg, xb, col, numCopyCols); + + uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(wp.m_8[0], wp.m_8[1], wp.m_8[2], 255)); + PortabilityLayer::RGBAColor resultColor = stdPalette->GetColors()[colorIndex]; + + RedistributeError(errorDiffusionNextRow, errorDiffusionCurrentRow, wp.m_16[0], wp.m_16[1], wp.m_16[2], resultColor.r, resultColor.g, resultColor.b, col, numCopyCols); + + currentDestRow[destColIndex] = colorIndex; + } } } } @@ -855,19 +882,38 @@ void DrawSurface::DrawPicture(THandle pictHdl, const Rect &bounds) } else { - for (size_t col = 0; col < numCopyCols; col++) + if (!errorDiffusion) { - const size_t srcColIndex = col + firstSourceCol; - const size_t destColIndex = col + firstDestCol; + for (size_t col = 0; col < numCopyCols; col++) + { + const size_t srcColIndex = col + firstSourceCol; + const size_t destColIndex = col + firstDestCol; - ErrorDiffusionWorkPixel wp = ApplyErrorDiffusion(errorDiffusionCurrentRow, currentSourceRow[srcColIndex * 3 + 2], currentSourceRow[srcColIndex * 3 + 1], currentSourceRow[srcColIndex * 3 + 0], col, numCopyCols); + const uint8_t r = currentSourceRow[srcColIndex * 3 + 2]; + const uint8_t g = currentSourceRow[srcColIndex * 3 + 1]; + const uint8_t b = currentSourceRow[srcColIndex * 3 + 0]; - uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(wp.m_8[0], wp.m_8[1], wp.m_8[2], 255)); - PortabilityLayer::RGBAColor resultColor = stdPalette->GetColors()[colorIndex]; + uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(r, g, b, 255)); - RedistributeError(errorDiffusionNextRow, errorDiffusionCurrentRow, wp.m_16[0], wp.m_16[1], wp.m_16[2], resultColor.r, resultColor.g, resultColor.b, col, numCopyCols); + currentDestRow[destColIndex] = colorIndex; + } + } + else + { + for (size_t col = 0; col < numCopyCols; col++) + { + const size_t srcColIndex = col + firstSourceCol; + const size_t destColIndex = col + firstDestCol; - currentDestRow[destColIndex] = colorIndex; + ErrorDiffusionWorkPixel wp = ApplyErrorDiffusion(errorDiffusionCurrentRow, currentSourceRow[srcColIndex * 3 + 2], currentSourceRow[srcColIndex * 3 + 1], currentSourceRow[srcColIndex * 3 + 0], col, numCopyCols); + + uint8_t colorIndex = stdPalette->MapColorLUT(PortabilityLayer::RGBAColor::Create(wp.m_8[0], wp.m_8[1], wp.m_8[2], 255)); + PortabilityLayer::RGBAColor resultColor = stdPalette->GetColors()[colorIndex]; + + RedistributeError(errorDiffusionNextRow, errorDiffusionCurrentRow, wp.m_16[0], wp.m_16[1], wp.m_16[2], resultColor.r, resultColor.g, resultColor.b, col, numCopyCols); + + currentDestRow[destColIndex] = colorIndex; + } } } } diff --git a/PortabilityLayer/QDGraf.h b/PortabilityLayer/QDGraf.h index b9ebd53..1847837 100644 --- a/PortabilityLayer/QDGraf.h +++ b/PortabilityLayer/QDGraf.h @@ -81,7 +81,7 @@ struct DrawSurface void DrawStringConstrained(const Point &point, const PLPasStr &str, const Rect &constraintRect, PortabilityLayer::ResolveCachingColor &cacheColor, PortabilityLayer::RenderedFont *font); void DrawStringWrap(const Point &point, const Rect &constrainRect, const PLPasStr &str, PortabilityLayer::ResolveCachingColor &cacheColor, PortabilityLayer::RenderedFont *font); - void DrawPicture(THandle pictHandle, const Rect &rect); + void DrawPicture(THandle pictHandle, const Rect &rect, bool errorDiffusion = true); IGpDisplayDriverSurface *m_ddSurface;