Optimized gradient when top color is the same as the bottom one.
authorRicardo Cruz <rick2@aeiou.pt>
Sat, 12 Jun 2004 16:07:12 +0000 (16:07 +0000)
committerRicardo Cruz <rick2@aeiou.pt>
Sat, 12 Jun 2004 16:07:12 +0000 (16:07 +0000)
SVN-Revision: 1472

src/screen/drawing_context.cpp
src/screen/screen.h
src/screen/texture.cpp

index c5903f5..13d260d 100644 (file)
@@ -181,15 +181,22 @@ DrawingContext::draw_gradient(DrawingRequest& request)
   else
   {
 #endif
-    float redstep = (float(bottom.red)-float(top.red)) / float(screen->h);
-    float greenstep = (float(bottom.green)-float(top.green)) / float(screen->h);
-    float bluestep = (float(bottom.blue) - float(top.blue)) / float(screen->h);
-
-    for(float y = 0; y < screen->h; y += 2)
-      fillrect(0, (int)y, screen->w, 2,
-          int(float(top.red) + redstep * y),
-          int(float(top.green) + greenstep * y),
-          int(float(top.blue) + bluestep * y), 255);
+    if(&top == &bottom)
+      {
+      fillrect(0, 0, screen->w, screen->h, top.red, top.green, top.blue);
+      }
+    else
+      {
+      float redstep = (float(bottom.red)-float(top.red)) / float(screen->h);
+      float greenstep = (float(bottom.green)-float(top.green)) / float(screen->h);
+      float bluestep = (float(bottom.blue) - float(top.blue)) / float(screen->h);
+
+      for(float y = 0; y < screen->h; y += 2)
+        fillrect(0, (int)y, screen->w, 2,
+            int(float(top.red) + redstep * y),
+            int(float(top.green) + greenstep * y),
+            int(float(top.blue) + bluestep * y), 255);
+      }
 #ifndef NOOPENGL
 
     }
index 85744e8..2383573 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef NOOPENGL
 #include <SDL_opengl.h>
 #endif
-
+#include <iostream>
 class Color
 {
 public:
@@ -40,6 +40,12 @@ public:
     : red(o.red), green(o.green), blue(o.blue), alpha(o.alpha)
   { }
 
+  bool operator==(const Color& o)
+    {  if(red == o.red && green == o.green &&
+          blue == o.blue && alpha == o.alpha)
+         return true;
+       return false;  }
+
   Uint8 red, green, blue, alpha;
 };
 
index 6e9f82e..e92ad61 100644 (file)
@@ -373,21 +373,29 @@ sdl_surface_from_gradient(Color top, Color bottom, int w, int h)
   if(sdl_surface == NULL)
       st_abort("Cannot create surface for the gradient", "SURFACE");
 
-  float redstep = (float(bottom.red)-float(top.red)) / float(h);
-  float greenstep = (float(bottom.green)-float(top.green)) / float(h);
-  float bluestep = (float(bottom.blue) - float(top.blue)) / float(h);
-
-  SDL_Rect rect;
-  rect.x = 0;
-  rect.w = w;
-  rect.h = 1;
-  for(float y = 0; y < h; y++)
+  if(top == bottom)
     {
-    rect.y = (int)y;
-    SDL_FillRect(sdl_surface, &rect, SDL_MapRGB(sdl_surface->format,
-        int(float(top.red) + redstep * y),
-        int(float(top.green) + greenstep * y),
-        int(float(top.blue) + bluestep * y)));
+    SDL_FillRect(sdl_surface, NULL, SDL_MapRGB(sdl_surface->format,
+        top.red, top.green, top.blue));
+    }
+  else
+    {
+    float redstep = (float(bottom.red)-float(top.red)) / float(h);
+    float greenstep = (float(bottom.green)-float(top.green)) / float(h);
+    float bluestep = (float(bottom.blue) - float(top.blue)) / float(h);
+
+    SDL_Rect rect;
+    rect.x = 0;
+    rect.w = w;
+    rect.h = 1;
+    for(float y = 0; y < h; y++)
+      {
+      rect.y = (int)y;
+      SDL_FillRect(sdl_surface, &rect, SDL_MapRGB(sdl_surface->format,
+          int(float(top.red) + redstep * y),
+          int(float(top.green) + greenstep * y),
+          int(float(top.blue) + bluestep * y)));
+      }
     }
 
   return sdl_surface;