Author: alink
Date: Tue Apr 29 05:14:19 2008
New Revision: 26225

URL: http://svn.gna.org/viewcvs/wesnoth?rev=26225&view=rev
Log:
Skip transparent pixels when possible in most of rendering functions,
because they often work on "sparse" sprites or hex (25% transparent)

Modified:
    trunk/src/sdl_utils.cpp

Modified: trunk/src/sdl_utils.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/sdl_utils.cpp?rev=26225&r1=26224&r2=26225&view=diff
==============================================================================
--- trunk/src/sdl_utils.cpp (original)
+++ trunk/src/sdl_utils.cpp Tue Apr 29 05:14:19 2008
@@ -509,9 +509,9 @@
        return create_optimized_surface(dst);
 }
 
-surface adjust_surface_colour(surface const &surf, int r, int g, int b)
-{
-       if((r == 0 && g == 0 && b == 0) || surf == NULL)
+surface adjust_surface_colour(surface const &surf, int red, int green, int 
blue)
+{
+       if((red == 0 && green == 0 && blue == 0) || surf == NULL)
                return create_optimized_surface(surf);
 
        surface nsurf(make_neutral_surface(surf));
@@ -527,18 +527,20 @@
                Uint32* end = beg + nsurf->w*surf->h;
 
                while(beg != end) {
-                       Uint8 red, green, blue, alpha;
-                       alpha = (*beg) >> 24;
-                       red   = (*beg) >> 16;
-                       green = (*beg) >> 8;
-                       blue  = (*beg) >> 0;
-
-
-                       red = maximum<int>(0,minimum<int>(255,int(red)+r));
-                       green = maximum<int>(0,minimum<int>(255,int(green)+g));
-                       blue  = maximum<int>(0,minimum<int>(255,int(blue)+b));
-
-                       *beg = (alpha << 24) + (red << 16) + (green << 8) + 
blue;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg) >> 0;
+
+                               r = 
maximum<int>(0,minimum<int>(255,int(r)+red));
+                               g = 
maximum<int>(0,minimum<int>(255,int(g)+green));
+                               b = 
maximum<int>(0,minimum<int>(255,int(b)+blue));
+
+                               *beg = (alpha << 24) + (r << 16) + (g << 8) + b;
+                       }
 
                        ++beg;
                }
@@ -564,24 +566,26 @@
                Uint32* end = beg + nsurf->w*surf->h;
 
                while(beg != end) {
-                       Uint8 r, g, b, a;
-                       a = (*beg) >> 24;
-                       r = (*beg) >> 16;
-                       g = (*beg) >> 8;
-                       b = (*beg);
-
-                       //const Uint8 avg = (red+green+blue)/3;
-
-                       // Use the correct formula for RGB to grayscale 
conversion.
-                       // Ok, this is no big deal :)
-                       // The correct formula being:
-                       // gray=0.299red+0.587green+0.114blue
-                       const Uint8 avg = static_cast<Uint8>((
-                               77  * static_cast<Uint16>(r) +
-                               150 * static_cast<Uint16>(g) +
-                               29  * static_cast<Uint16>(b)  ) / 256);
-
-                       *beg = (a << 24) | (avg << 16) | (avg << 8) | avg;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+                               //const Uint8 avg = (red+green+blue)/3;
+
+                               // Use the correct formula for RGB to grayscale 
conversion.
+                               // Ok, this is no big deal :)
+                               // The correct formula being:
+                               // gray=0.299red+0.587green+0.114blue
+                               const Uint8 avg = static_cast<Uint8>((
+                                       77  * static_cast<Uint16>(r) +
+                                       150 * static_cast<Uint16>(g) +
+                                       29  * static_cast<Uint16>(b)  ) / 256);
+
+                               *beg = (alpha << 24) | (avg << 16) | (avg << 8) 
| avg;
+                       }
 
                        ++beg;
                }
@@ -607,29 +611,31 @@
                Uint32* end = beg + nsurf->w*surf->h;
 
                while(beg != end) {
-                       Uint8 r, g, b, a;
-                       a = (*beg) >> 24;
-                       r = (*beg) >> 16;
-                       g = (*beg) >> 8;
-                       b = (*beg);
-
-                       //const Uint8 avg = (red+green+blue)/3;
-
-                       // Use the correct formula for RGB to grayscale 
conversion.
-                       // Ok, this is no big deal :)
-                       // The correct formula being:
-                       // gray=0.299red+0.587green+0.114blue
-                       const Uint8 avg = static_cast<Uint8>((
-                               77  * static_cast<Uint16>(r) +
-                               150 * static_cast<Uint16>(g) +
-                               29  * static_cast<Uint16>(b)  ) / 256);
-                       // then tint 77%, 67%, 72%
-                       r = ((avg * 196) >> 8);
-                       g = ((avg * 171) >> 8);
-                       b = ((avg * 184) >> 8);
-
-
-                       *beg = (a << 24) | (r << 16) | (g << 8) | b;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+
+                               //const Uint8 avg = (red+green+blue)/3;
+
+                               // Use the correct formula for RGB to grayscale 
conversion.
+                               // Ok, this is no big deal :)
+                               // The correct formula being:
+                               // gray=0.299red+0.587green+0.114blue
+                               const Uint8 avg = static_cast<Uint8>((
+                                       77  * static_cast<Uint16>(r) +
+                                       150 * static_cast<Uint16>(g) +
+                                       29  * static_cast<Uint16>(b)  ) / 256);
+                               // then tint 77%, 67%, 72%
+                               r = ((avg * 196) >> 8);
+                               g = ((avg * 171) >> 8);
+                               b = ((avg * 184) >> 8);
+
+                               *beg = (alpha << 24) | (r << 16) | (g << 8) | b;
+                       }
 
                        ++beg;
                }
@@ -693,17 +699,20 @@
 
                if (amount < 0) amount = 0;
                while(beg != end) {
-                       Uint8 red, green, blue, alpha;
-                       alpha = (*beg) >> 24;
-                       red   = (*beg) >> 16;
-                       green = (*beg) >> 8;
-                       blue  = (*beg) >> 0;
-
-                       red = 
minimum<unsigned>(unsigned(fxpmult(red,amount)),255);
-                       green = 
minimum<unsigned>(unsigned(fxpmult(green,amount)),255);
-                       blue = 
minimum<unsigned>(unsigned(fxpmult(blue,amount)),255);
-
-                       *beg = (alpha << 24) + (red << 16) + (green << 8) + 
blue;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+
+                               r = minimum<unsigned>(unsigned(fxpmult(r, 
amount)),255);
+                               g = minimum<unsigned>(unsigned(fxpmult(g, 
amount)),255);
+                               b = minimum<unsigned>(unsigned(fxpmult(b, 
amount)),255);
+
+                               *beg = (alpha << 24) + (r << 16) + (g << 8) + b;
+                       }
 
                        ++beg;
                }
@@ -732,15 +741,17 @@
 
                if (amount < 0) amount = 0;
                while(beg != end) {
-                       Uint8 red, green, blue, alpha;
-                       alpha = (*beg) >> 24;
-                       red   = (*beg) >> 16;
-                       green = (*beg) >> 8;
-                       blue  = (*beg) >> 0;
-
-                       alpha = 
minimum<unsigned>(unsigned(fxpmult(alpha,amount)),255);
-
-                       *beg = (alpha << 24) + (red << 16) + (green << 8) + 
blue;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+
+                               alpha = 
minimum<unsigned>(unsigned(fxpmult(alpha,amount)),255);
+                               *beg = (alpha << 24) + (r << 16) + (g << 8) + b;
+                       }
 
                        ++beg;
                }
@@ -772,15 +783,17 @@
                Uint32* end = beg + nsurf->w*surf->h;
 
                while(beg != end) {
-                       Uint8 red, green, blue, alpha;
-                       alpha = (*beg) >> 24;
-                       red   = (*beg) >> 16;
-                       green = (*beg) >> 8;
-                       blue  = (*beg) >> 0;
-
-                       alpha = 
Uint8(maximum<int>(0,minimum<int>(255,int(alpha) + amount)));
-
-                       *beg = (alpha << 24) + (red << 16) + (green << 8) + 
blue;
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+                               
+                               alpha = 
Uint8(maximum<int>(0,minimum<int>(255,int(alpha) + amount)));
+                               *beg = (alpha << 24) + (r << 16) + (g << 8) + b;
+                       }
 
                        ++beg;
                }
@@ -823,20 +836,20 @@
                Uint32* mend = mbeg + nmask->w*nmask->h;
 
                while(beg != end && mbeg != mend) {
-                       Uint8 red, green, blue, alpha;
-                       Uint8 malpha;
-
-                       alpha = (*beg) >> 24;
-                       red   = (*beg) >> 16;
-                       green = (*beg) >> 8;
-                       blue  = (*beg) >> 0;
-
-                       malpha = (*mbeg) >> 24;
-
-                       alpha = Uint8(minimum<int>(malpha, alpha));
-
-                       *beg = (alpha << 24) + (red << 16) + (green << 8) + 
blue;
-
+                       Uint8 alpha = (*beg) >> 24;
+
+                       if(alpha) {
+                               Uint8 r, g, b;
+                               r = (*beg) >> 16;
+                               g = (*beg) >> 8;
+                               b = (*beg);
+
+                               Uint8 malpha = (*mbeg) >> 24;
+                               if (alpha > malpha) alpha = malpha;
+
+                               *beg = (alpha << 24) + (r << 16) + (g << 8) + b;
+                       }
+                       
                        ++beg;
                        ++mbeg;
                }


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to