From 657a576946f3b18e4e0902a8f403aa3997531c0d Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Tue, 4 Jun 2013 22:41:56 +0700 Subject: [PATCH] Fix fillcolor processing. Fillcolor has the same bitness as the color image. --- gDP.cpp | 28 +++++++++++++++++++++------- gDP.h | 3 ++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/gDP.cpp b/gDP.cpp index 268302d1..1ac45696 100644 --- a/gDP.cpp +++ b/gDP.cpp @@ -465,11 +465,7 @@ void gDPSetFogColor( u32 r, u32 g, u32 b, u32 a ) void gDPSetFillColor( u32 c ) { - gDP.fillColor.r = _SHIFTR( c, 11, 5 ) * 0.032258064f; - gDP.fillColor.g = _SHIFTR( c, 6, 5 ) * 0.032258064f; - gDP.fillColor.b = _SHIFTR( c, 1, 5 ) * 0.032258064f; - gDP.fillColor.a = (f32)_SHIFTR( c, 0, 1 ); - + gDP.fillColor.color = c; gDP.fillColor.z = (f32)_SHIFTR( c, 2, 14 ); gDP.fillColor.dz = (f32)_SHIFTR( c, 0, 2 ); @@ -478,6 +474,22 @@ void gDPSetFillColor( u32 c ) #endif } +void gDPGetFillColor(f32 _fillColor[4]) +{ + const u32 c = gDP.fillColor.color; + if (gDP.colorImage.size < 3) { + _fillColor[0] = _SHIFTR( c, 11, 5 ) * 0.032258064f; + _fillColor[1] = _SHIFTR( c, 6, 5 ) * 0.032258064f; + _fillColor[2] = _SHIFTR( c, 1, 5 ) * 0.032258064f; + _fillColor[3] = (f32)_SHIFTR( c, 0, 1 ); + } else { + _fillColor[0] = _SHIFTR( c, 24, 8 ) * 0.0039215686f; + _fillColor[1] = _SHIFTR( c, 16, 8 ) * 0.0039215686f; + _fillColor[2] = _SHIFTR( c, 8, 8 ) * 0.0039215686f; + _fillColor[3] = _SHIFTR( c, 0, 8 ) * 0.0039215686f; + } +} + void gDPSetPrimColor( u32 m, u32 l, u32 r, u32 g, u32 b, u32 a ) { gDP.primColor.m = m * 0.0039215689f; @@ -783,6 +795,8 @@ void gDPFillRectangle( s32 ulx, s32 uly, s32 lrx, s32 lry ) return; } + f32 fillColor[4]; + gDPGetFillColor(fillColor); if (gDP.otherMode.cycleType == G_CYC_FILL) { //if (gDP.fillColor.a == 0.0f) @@ -793,12 +807,12 @@ void gDPFillRectangle( s32 ulx, s32 uly, s32 lrx, s32 lry ) if ((ulx == 0) && (uly == 0) && (lrx == VI.width) && (lry == VI.height)) { - OGL_ClearColorBuffer( &gDP.fillColor.r ); + OGL_ClearColorBuffer( fillColor ); return; } } - OGL_DrawRect( ulx, uly, lrx, lry, (gDP.otherMode.cycleType == G_CYC_FILL) ? &gDP.fillColor.r : &gDP.blendColor.r ); + OGL_DrawRect( ulx, uly, lrx, lry, (gDP.otherMode.cycleType == G_CYC_FILL) ? fillColor : &gDP.blendColor.r ); if (depthBuffer.top) depthBuffer.top->cleared = FALSE; gDP.colorImage.changed = TRUE; diff --git a/gDP.h b/gDP.h index 4a52dbe4..f1c436eb 100644 --- a/gDP.h +++ b/gDP.h @@ -168,8 +168,8 @@ struct gDPInfo struct { - f32 r, g, b, a; f32 z, dz; + u32 color; } fillColor; struct @@ -257,6 +257,7 @@ void gDPSetEnvColor( u32 r, u32 g, u32 b, u32 a ); void gDPSetBlendColor( u32 r, u32 g, u32 b, u32 a ); void gDPSetFogColor( u32 r, u32 g, u32 b, u32 a ); void gDPSetFillColor( u32 c ); +void gDPGetFillColor(f32 _fillColor[4]); void gDPSetPrimColor( u32 m, u32 l, u32 r, u32 g, u32 b, u32 a ); void gDPSetTile( u32 format, u32 size, u32 line, u32 tmem, u32 tile, u32 palette, u32 cmt, u32 cms, u32 maskt, u32 masks, u32 shiftt, u32 shifts ); void gDPSetTileSize( u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt );