// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #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; } }; } #endif // __rendertexture_hh