]> Shamusworld >> Repos - virtualjaguar/commitdiff
Minor graphical update
authorShamus Hammons <jlhamm@acm.org>
Thu, 27 Nov 2003 03:58:42 +0000 (03:58 +0000)
committerShamus Hammons <jlhamm@acm.org>
Thu, 27 Nov 2003 03:58:42 +0000 (03:58 +0000)
src/gui.cpp

index 5575496243fac23d18a63697fc3f31cd2a96f4eb..d6ae7dbf434038661c9de932b9f920da10fe83bb 100644 (file)
@@ -27,7 +27,7 @@ using namespace std;                                                          // For STL stuff
 
 class Window;                                                                          // Forward declaration...
 
-void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap);
+void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap, uint8 * alpha = NULL);
 void DrawStringTrans(int16 * screen, uint32 x, uint32 y, uint16 color, uint8 opacity, const char * text, ...);
 void DrawStringOpaque(int16 * screen, uint32 x, uint32 y, uint16 color1, uint16 color2, const char * text, ...);
 Window * LoadROM(void);
@@ -118,27 +118,49 @@ uint16 downArrowBox[] = {
 uint16 pushButtonUp[] = {
        8, 8,
 
-       0x0000,0x0000,0x0000,0x000A,0x000A,0x0000,0x0000,0x0000,                // ...##...
-       0x0000,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x0000,                // .######.
-       0x0000,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x0000,                // .######.
-       0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,                // ########
-       0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,                // ########
-       0x0000,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x0000,                // .######.
-       0x0000,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x0000,                // .######.
-       0x0000,0x0000,0x0000,0x000A,0x000A,0x0000,0x0000,0x0000                 // ...##...
+       0x0000, 0x0C63, 0x394A, 0x494A, 0x4108, 0x2CC6, 0x0421, 0x0000, 
+       0x0C63, 0x518C, 0x48E7, 0x48C6, 0x48A5, 0x48A5, 0x3CE7, 0x0421, 
+       0x3D4A, 0x48E7, 0x48C6, 0x48C6, 0x44A5, 0x48A5, 0x48A5, 0x2CC6, 
+       0x494A, 0x48C6, 0x48C6, 0x44A5, 0x44A5, 0x44A5, 0x48A5, 0x40E7, 
+       0x4529, 0x48A5, 0x44A5, 0x44A5, 0x44A5, 0x44A5, 0x4CA5, 0x40E7, 
+       0x2CC6, 0x48A5, 0x48A5, 0x44A5, 0x44A5, 0x48A5, 0x4CA5, 0x2CC6, 
+       0x0421, 0x3CE7, 0x48A5, 0x48A5, 0x4CA5, 0x4CA5, 0x44E7, 0x0421, 
+       0x0000, 0x0421, 0x28C6, 0x40E7, 0x40E7, 0x2CC6, 0x0421, 0x0000
+};
+
+uint8 pbuAlpha[] = {
+       0xFF, 0xE4, 0xA0, 0x99, 0xA4, 0xBE, 0xF0, 0xFF, 
+       0xE3, 0x85, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xF0, 
+       0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 
+       0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 
+       0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 
+       0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 
+       0xF1, 0xAD, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xF1, 
+       0xFF, 0xF2, 0xC0, 0xAD, 0xAD, 0xC0, 0xF2, 0xFF
 };
 
 uint16 pushButtonDown[] = {
        8, 8,
 
-       0x0000,0x0000,0x0000,0x000A,0x000A,0x0000,0x0000,0x0000,                // ...@@...
-       0x0000,0x000A,0x000A,0x0C7F,0x0C7F,0x000A,0x000A,0x0000,                // .@@##@@.
-       0x0000,0x000A,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x000A,0x0000,                // .@####@.
-       0x000A,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x000A,                // @######@
-       0x000A,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x000A,                // @######@
-       0x0000,0x000A,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x000A,0x0000,                // .@####@.
-       0x0000,0x000A,0x000A,0x0C7F,0x0C7F,0x000A,0x000A,0x0000,                // .@@##@@.
-       0x0000,0x0000,0x0000,0x000A,0x000A,0x0000,0x0000,0x0000                 // ...@@...
+       0x0000, 0x0C63, 0x4A31, 0x5631, 0x4DCE, 0x2D4A, 0x0421, 0x0000, 
+       0x0C63, 0x6AF7, 0x714A, 0x7908, 0x7908, 0x6908, 0x418C, 0x0421, 
+       0x4A31, 0x714A, 0x7508, 0x6CE7, 0x6CE7, 0x74E7, 0x68E7, 0x2929, 
+       0x5A31, 0x7908, 0x6CE7, 0x6CE7, 0x6CE7, 0x6CE7, 0x78E7, 0x3D6B, 
+       0x4DCE, 0x7908, 0x6CE7, 0x6CE7, 0x6CE7, 0x6CE7, 0x78E7, 0x416B, 
+       0x2D4A, 0x6D08, 0x74E7, 0x6CE7, 0x6CE7, 0x74E7, 0x6CE7, 0x2929, 
+       0x0842, 0x418C, 0x6CE7, 0x78E7, 0x78E7, 0x6CE7, 0x416B, 0x0842, 
+       0x0000, 0x0842, 0x2929, 0x416B, 0x416B, 0x2929, 0x0842, 0x0000
+};
+
+uint8 pbdAlpha[] = {
+       0xFF, 0xE4, 0x72, 0x68, 0x7E, 0xA7, 0xF0, 0xFF, 
+       0xE4, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x93, 0xF0, 
+       0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 
+       0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 
+       0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 
+       0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 
+       0xEF, 0x91, 0x00, 0x00, 0x00, 0x00, 0x96, 0xEF, 
+       0xFF, 0xEF, 0xAE, 0x98, 0x97, 0xAF, 0xEF, 0xFF
 };
 
 uint16 slideSwitchUp[] = {
@@ -432,7 +454,8 @@ void PushButton::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
                }
        }*/
 
-       DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? pushButtonDown : pushButtonUp));
+//     DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? pushButtonDown : pushButtonUp));
+       DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? pushButtonDown : pushButtonUp), (*state ? pbdAlpha : pbuAlpha));
        if (text.length() > 0)
                DrawString(screenBuffer, extents.x + offsetX + 12, extents.y + offsetY, false, "%s", text.c_str());
 }
@@ -1638,8 +1661,9 @@ Window * MiscOptions(void)
 //
 // Draw "picture"
 // Uses zero as transparent color
+// Can also use an optional alpha channel
 //
-void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap)
+void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap, uint8 * alpha/*=NULL*/)
 {
        uint16 width = bitmap[0], height = bitmap[1];
        bitmap += 2;
@@ -1651,9 +1675,38 @@ void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap)
        {
                for(int xx=0; xx<width; xx++)
                {
-                               if (*bitmap && x + xx < pitch)          // NOTE: Still doesn't clip the Y val...
+                       if (alpha == NULL)
+                       {
+                               if (*bitmap && x + xx < pitch)                  // NOTE: Still doesn't clip the Y val...
                                        *(screen + address + xx + (yy * pitch)) = *bitmap;
-                               bitmap++;
+                       }
+                       else
+                       {
+                               uint8 trans = *alpha;
+                               uint16 color = *bitmap;
+                               uint16 existingColor = *(screen + address + xx + (yy * pitch));
+
+                               uint8 eRed = (existingColor >> 10) & 0x1F,
+                                       eGreen = (existingColor >> 5) & 0x1F,
+                                       eBlue = existingColor & 0x1F,
+
+                                       nRed = (color >> 10) & 0x1F,
+                                       nGreen = (color >> 5) & 0x1F,
+                                       nBlue = color & 0x1F;
+
+                               uint8 invTrans = 255 - trans;
+                               uint16 bRed = (eRed * trans + nRed * invTrans) / 255;
+                               uint16 bGreen = (eGreen * trans + nGreen * invTrans) / 255;
+                               uint16 bBlue = (eBlue * trans + nBlue * invTrans) / 255;
+
+                               uint16 blendedColor = (bRed << 10) | (bGreen << 5) | bBlue;
+
+                               *(screen + address + xx + (yy * pitch)) = blendedColor;
+
+                               alpha++;
+                       }
+
+                       bitmap++;
                }
        }
 }