]> Dogcows Code - chaz/openbox/commitdiff
drawSolidBackground seems to work :)
authorDana Jansens <danakj@orodu.net>
Mon, 20 Jan 2003 20:20:06 +0000 (20:20 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 20 Jan 2003 20:20:06 +0000 (20:20 +0000)
otk/rendercontrol.cc
otk/rendercontrol.hh
otk/rendertest.cc
otk/rendertexture.hh
otk/truerendercontrol.cc
otk/widget.cc

index 0f84af892b22b2dc68c75f6d7df385056687229b..189bbd6e00514a3d2fd242adcf9c7595ff54b8eb 100644 (file)
@@ -102,4 +102,89 @@ void RenderControl::drawString(Surface& sf, const Font &font, int x, int y,
   return;
 }
 
+void RenderControl::drawSolidBackground(Surface& sf,
+                                        const RenderTexture& texture) const
+{
+  assert(_screen == sf._screen);
+  assert(_screen == texture.color().screen());
+  
+  if (texture.parentRelative()) return;
+  
+  sf.setPixmap(texture.color());
+
+  int width = sf.width(), height = sf.height();
+  int left = 0, top = 0, right = width - 1, bottom = height - 1;
+
+  if (texture.interlaced())
+    for (int i = 0; i < height; i += 2)
+      XDrawLine(**display, sf.pixmap(), texture.interlaceColor().gc(),
+                0, i, width, i);
+
+  switch (texture.relief()) {
+  case RenderTexture::Raised:
+    switch (texture.bevel()) {
+    case RenderTexture::Bevel1:
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left, bottom, right, bottom);
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                right, bottom, right, top);
+
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left, top, right, top);
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left, bottom, left, top);
+      break;
+    case RenderTexture::Bevel2:
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left + 1, bottom - 2, right - 2, bottom - 2);
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                right - 2, bottom - 2, right - 2, top + 1);
+
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left + 1, top + 1, right - 2, top + 1);
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left + 1, bottom - 2, left + 1, top + 1);
+      break;
+    default:
+      assert(false); // unhandled RenderTexture::BevelType
+    }
+    break;
+  case RenderTexture::Sunken:
+    switch (texture.bevel()) {
+    case RenderTexture::Bevel1:
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left, bottom, right, bottom);
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                right, bottom, right, top);
+
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left, top, right, top);
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left, bottom, left, top);
+      break;
+    case RenderTexture::Bevel2:
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                left + 1, bottom - 2, right - 2, bottom - 2);
+      XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
+                right - 2, bottom - 2, right - 2, top + 1);
+
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left + 1, top + 1, right - 2, top + 1);
+      XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
+                left + 1, bottom - 2, left + 1, top + 1);
+      break;
+    default:
+      assert(false); // unhandled RenderTexture::BevelType
+    }
+    break;
+  case RenderTexture::Flat:
+    if (texture.border())
+      XDrawRectangle(**display, sf.pixmap(), texture.borderColor().gc(),
+                     left, top, right, bottom);
+    break;
+  default:
+    assert(false); // unhandled RenderTexture::ReliefType
+  }
+}
+
 }
index 20ec8c1d5cffe201f10f1830e13cfe18dcd69ef3..f4ae64936a1203ba316c4dfd351d9649c913ef8c 100644 (file)
@@ -63,18 +63,21 @@ protected:
 
   RenderControl(int screen);
 
+  virtual void drawSolidBackground(Surface& sf,
+                                   const RenderTexture& texture) const;
+  
 public:
   virtual ~RenderControl();
 
   static RenderControl *getRenderControl(int screen);
 
   //! Draws a string onto a Surface
-  virtual void drawString(Surface& sf, const Font &font, int x, int y,
-                         const Color &color, const ustring &string) const;
+  virtual void drawString(Surface& sf, const Fontfont, int x, int y,
+                         const Color& color, const ustring& string) const;
 
   //! Draws a background onto a Surface, as specified by a RenderTexture
-  virtual void drawBackground(Surface &sf,
-                             const RenderTexture &texture) const = 0;
+  virtual void drawBackground(Surfacesf,
+                             const RenderTexturetexture) const = 0;
 };
 
 }
index d6e3dbfcab9ca596c0e4f1b2fe8650deeeb36cb5..ce0bb1447906e56551c4946f9db796ac18d581be 100644 (file)
@@ -14,13 +14,17 @@ int main(int argc, char **argv)
   foo.resize(600, 500);
 
   otk::RenderColor color(0, 0, 0xff, 0xff);
+  otk::RenderColor colord(0, 0, 0, 0);
+  otk::RenderColor colorl(0, 0xff, 0xff, 0xff);
   otk::RenderTexture tex(false,
-                        otk::RenderTexture::Flat,
+                        otk::RenderTexture::Raised,
+                        otk::RenderTexture::Bevel1,
                         false,
                         otk::RenderTexture::Solid,
                         false,
                         &color,
-                        0,
+                        &colord,
+                        &colorl,
                         0,
                         0);
   foo.setTexture(&tex);
index 3b9d4baa61defb563eef36ee2453278693047930..3d324e30fc7a65e204b1d13c3d188f14742395a2 100644 (file)
@@ -35,6 +35,8 @@ private:
   bool _parent_relative;
   //! The relief type of the texture
   ReliefType _relief;
+  //! The way the bevel should be drawn
+  BevelType _bevel;
   //! If a flat border is drawn on the outside, ignored for all ReliefType
   //! values except ReliefType::Flat
   bool _border;
@@ -47,33 +49,40 @@ private:
   //! This must always be defined
   const RenderColor *_color;
   //! The shadow color for the bevel. This must be defined if
-  //! RenderTexture::relief is not RenderTexture::ReliefType::Flat
+  //! RenderTexture::_relief is not RenderTexture::ReliefType::Flat
   const RenderColor *_bevel_dark_color;
   //! The light color for the bevel. This must be defined if
-  //! RenderTexture::relief is not RenderTexture::ReliefType::Flat
+  //! RenderTexture::_relief is not RenderTexture::ReliefType::Flat
   const RenderColor *_bevel_light_color;
-  //! The color for the flat border if RenderTexture::border is true. This must
-  //! be defined if it is true
+  //! The color for the flat border if RenderTexture::_border is true. This
+  //! must be defined if it is true
   const RenderColor *_border_color;
+  //! The color for the interlace lines if RenderTexture. This must be defined
+  //! if it is true
+  const RenderColor *_interlace_color;
 
 public:
-  RenderTexture(bool parent_relative, ReliefType relief, bool border,
-                GradientType gradient, bool interlaced,
+  RenderTexture(bool parent_relative, ReliefType relief, BevelType bevel,
+                bool border, GradientType gradient, bool interlaced,
                 const RenderColor *color, const RenderColor *bevel_dark_color,
                 const RenderColor *bevel_light_color,
-                const RenderColor *border_color)
+                const RenderColor *border_color,
+                const RenderColor *interlace_color)
     : _parent_relative(parent_relative),
       _relief(relief),
+      _bevel(bevel),
       _border(border),
       _gradient(gradient),
       _interlaced(interlaced),
       _color(color),
       _bevel_dark_color(bevel_dark_color),
       _bevel_light_color(bevel_light_color),
-      _border_color(border_color)
+      _border_color(border_color),
+      _interlace_color(interlace_color)
     {
       assert(_relief == Flat || (_bevel_dark_color && _bevel_light_color));
       assert(!_border || _border_color);
+      assert(!_interlaced || _interlace_color);
       assert(_color);
     }
 
@@ -81,6 +90,8 @@ public:
   inline bool parentRelative() const { return _parent_relative; }
   //! The relief type of the texture
   inline ReliefType relief() const { return _relief; }
+  //! The way the bevel should be drawn
+  inline BevelType bevel() const { return _bevel; }
   //! If a flat border is drawn on the outside, ignored for all ReliefType
   //! values except ReliefType::Flat
   inline bool border() const { return _border; }
@@ -93,16 +104,20 @@ public:
   //! This must always be defined
   inline const RenderColor& color() const { return *_color; }
   //! The shadow color for the bevel. This must be defined if
-  //! RenderTexture::relief is not RenderTexture::ReliefType::Flat
+  //! RenderTexture::_relief is not RenderTexture::ReliefType::Flat
   inline const RenderColor& bevelDarkColor() const
     { return *_bevel_dark_color; }
   //! The light color for the bevel. This must be defined if
-  //! RenderTexture::relief is not RenderTexture::ReliefType::Flat
+  //! RenderTexture::)relief is not RenderTexture::ReliefType::Flat
   inline const RenderColor& bevelLightColor() const
     { return *_bevel_light_color; }
-  //! The color for the flat border if RenderTexture::border is true. This must
-  //! be defined if it is true
+  //! The color for the flat border if RenderTexture::_border is true. This
+  //! must be defined if it is true
   inline const RenderColor& borderColor() const { return *_border_color; }
+  //! The color for the interlace lines if RenderTexture. This must be defined
+  //! if it is true
+  inline const RenderColor& interlaceColor() const
+    { return *_interlace_color; }
 };
 
 }
index 078cde5bb18cc2045aa5730ab78d679f4bf2aa56..6c3b896e7cf081136e940f288703a546b0e0bda9 100644 (file)
@@ -102,37 +102,42 @@ static inline void renderPixel(XImage *im, unsigned char *dp,
 void TrueRenderControl::drawBackground(Surface& sf,
                                       const RenderTexture &texture) const
 {
-  assert(sf._screen == _screen);
-  
-  int w = sf.width(), h = sf.height();
+  assert(_screen == sf._screen);
+  assert(_screen == texture.color().screen());
+
+  if (texture.gradient() == RenderTexture::Solid) {
+    drawSolidBackground(sf, texture);
+  } else {
+    int w = sf.width(), h = sf.height();
 
-  const ScreenInfo *info = display->screenInfo(_screen);
-  XImage *im = XCreateImage(**display, info->visual(), info->depth(),
-                            ZPixmap, 0, NULL, w, h, 32, 0);
+    const ScreenInfo *info = display->screenInfo(_screen);
+    XImage *im = XCreateImage(**display, info->visual(), info->depth(),
+                              ZPixmap, 0, NULL, w, h, 32, 0);
   
-  unsigned char *data = new unsigned char[im->bytes_per_line * h];
-  unsigned char *dp = data;
-  unsigned int bytes_per_pixel = im->bits_per_pixel/8;
-
-  for (int y = 0; y < h/3; ++y)
-    for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
-      renderPixel(im, dp, (255*x/w) >> _red_shift << _red_offset);
-  for (int y = 0; y < h/3; ++y)
-    for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
-      renderPixel(im, dp, (255*x/w) >> _green_shift << _green_offset);
-  for (int y = 0; y < h/3; ++y)
-    for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
-      renderPixel(im, dp, (255*x/w) >> _blue_shift << _blue_offset);
-
-  im->data = (char*) data;
+    unsigned char *data = new unsigned char[im->bytes_per_line * h];
+    unsigned char *dp = data;
+    unsigned int bytes_per_pixel = im->bits_per_pixel/8;
+
+    for (int y = 0; y < h/3; ++y)
+      for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
+        renderPixel(im, dp, (255*x/w) >> _red_shift << _red_offset);
+    for (int y = 0; y < h/3; ++y)
+      for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
+        renderPixel(im, dp, (255*x/w) >> _green_shift << _green_offset);
+    for (int y = 0; y < h/3; ++y)
+      for (int x = 0; x < w; ++x, dp += bytes_per_pixel)
+        renderPixel(im, dp, (255*x/w) >> _blue_shift << _blue_offset);
+
+    im->data = (char*) data;
 
 //  sf.setPixmap(im);
-  sf.setPixmap(texture.color());
+    sf.setPixmap(texture.color());
 //  sf.setPixmap(RenderColor(_screen, 0xff, 0xff, 0));
 
-  delete [] im->data;
-  im->data = NULL;
-  XDestroyImage(im);
+    delete [] im->data;
+    im->data = NULL;
+    XDestroyImage(im);
+  }
 }
 
 }
index d32cb624f4629e2fb48282f33c1ea35c6c1128e5..2e2ec2ca7b634dbceaa9b27b93a09569201ffdb9 100644 (file)
@@ -467,7 +467,7 @@ void Widget::setEventDispatcher(EventDispatcher *disp)
 void Widget::exposeHandler(const XExposeEvent &e)
 {
   EventHandler::exposeHandler(e);
-  XClearArea(**display, _window, e.x, e.y, e.width, e.height, false);
+//  XClearArea(**display, _window, e.x, e.y, e.width, e.height, false);
 }
 
 void Widget::configureHandler(const XConfigureEvent &e)
This page took 0.038607 seconds and 4 git commands to generate.