]> Dogcows Code - chaz/openbox/blobdiff - otk/rendertexture.hh
only store what we need to in the class
[chaz/openbox] / otk / rendertexture.hh
index 68f935dc00d485a41f51076339d60be2b1154f8e..54fbd9c26d3ed480ed9b67519cc3b9077b0f4671 100644 (file)
@@ -2,9 +2,166 @@
 #ifndef __rendertexture_hh
 #define __rendertexture_hh
 
+#include "rendercolor.hh"
+
 namespace otk {
 
+//! Superclass for all the Textures
 class RenderTexture {
+public:
+  enum ReliefType {
+    Flat,
+    Raised,
+    Sunken
+  };
+  enum BevelType {
+    Bevel1,
+    Bevel2
+  };
+  enum GradientType {
+    Solid,
+    Horizontal,
+    Vertical,
+    Diagonal,
+    CrossDiagonal,
+    PipeCross,
+    Rectangle,
+    Pyramid,
+    Elliptic
+  };
+
+private:
+  int _screen;
+  
+  //! If true, the texture is not rendered at all, so all options are ignored
+  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;
+  //! The type of gradient to fill the texture with (if any)
+  GradientType _gradient;
+  //! If interlace lines should be drawn over the texture
+  bool _interlaced;
+
+  //! The base color for the texture, the only color when the texture is solid.
+  //! This must always be defined
+  const RenderColor *_color;
+  //! The secondary color for a gradient texture.
+  //! This is only defined for gradients
+  const RenderColor *_secondary_color;
+  //! The shadow color for the bevel. This must be defined if
+  //! 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
+  const RenderColor *_bevel_light_color;
+  //! 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(int screen,
+                bool parent_relative, ReliefType relief, BevelType bevel,
+                bool border, GradientType gradient, bool interlaced,
+                const RGB &color,
+                const RGB &secondary_color,
+                const RGB &border_color,
+                const RGB &interlace_color)
+    : _screen(screen),
+      _parent_relative(parent_relative),
+      _relief(relief),
+      _bevel(bevel),
+      _border(border),
+      _gradient(gradient),
+      _interlaced(interlaced),
+      _color(new RenderColor(screen, color)),
+      _secondary_color(new RenderColor(screen, secondary_color)),
+      _bevel_dark_color(0),
+      _bevel_light_color(0),
+      _border_color(new RenderColor(screen, border_color)),
+      _interlace_color(new RenderColor(screen, interlace_color))
+  {
+    if (_relief != Flat) {
+      unsigned char r, g, b;
+
+      // calculate the light bevel color
+      r = _color->red() + _color->red() / 2;
+      g = _color->green() + _color->green() / 2;
+      b = _color->blue() + _color->blue() / 2;
+      // watch for wraparound
+      if (r < _color->red()) r = 0xff;
+      if (g < _color->green()) g = 0xff;
+      if (b < _color->blue()) b = 0xff;
+      _bevel_dark_color = new RenderColor(screen, r, g, b);
+      
+      // calculate the dark bevel color
+      r = _color->red() / 4 + _color->red() / 2;
+      g = _color->green() / 4 + _color->green() / 2;
+      b = _color->blue() / 4 + _color->blue() / 2;
+      _bevel_light_color = new RenderColor(screen, r, g, b);
+    }
+    
+    assert(_relief == Flat || (_bevel_dark_color && _bevel_light_color));
+    //assert(!_border || _border_color);
+    //assert(!_interlaced || _interlace_color);
+    assert(_color);
+    assert(_secondary_color);
+    assert(_border_color);
+    assert(_interlace_color);
+  }
+  
+  virtual ~RenderTexture() {
+    delete _color;
+    delete _secondary_color;
+    if (_bevel_dark_color) delete _bevel_dark_color;
+    if (_bevel_dark_color) delete _bevel_light_color;
+    delete _border_color;
+    delete _interlace_color;
+  }
+
+  //! If true, the texture is not rendered at all, so all options are ignored
+  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; }
+  //! The type of gradient to fill the texture with (if any)
+  inline GradientType gradient() const { return _gradient; }
+  //! If interlace lines should be drawn over the texture
+  inline bool interlaced() const { return _interlaced; }
+
+  //! The base color for the texture, the only color when the texture is solid.
+  //! This must always be defined
+  inline const RenderColor& color() const { return *_color; }
+  //! The secondary color for gradient textures.
+  //! This is only defined for gradients
+  inline const RenderColor& secondary_color() const
+    { return *_secondary_color; }
+  //! The shadow color for the bevel. This must be defined if
+  //! 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
+  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
+  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; }
 };
 
 }
This page took 0.026098 seconds and 4 git commands to generate.