src/Image.hh (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
// Image.hh for Fluxbox Window Manager // Copyright (c) 2001 - 2002 Henrik Kinnunen (fluxbox@linuxmail.org) // // Image.hh for Blackbox - an X11 Window manager // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // $Id: Image.hh,v 1.12 2002/09/14 13:50:38 fluxgen Exp $ #ifndef IMAGE_HH #define IMAGE_HH #include "Timer.hh" #include "BaseDisplay.hh" #include "Color.hh" #include "Texture.hh" #include <X11/Xlib.h> #include <X11/Xutil.h> #include <list> class BImageControl; /** Renders to pixmap */ class BImage { public: BImage(BImageControl *ic, unsigned int, unsigned int); ~BImage(); /// render to pixmap Pixmap render(const FbTk::Texture *src_texture); /// render solid texture to pixmap Pixmap renderSolid(const FbTk::Texture *src_texture); /// render gradient texture to pixmap Pixmap renderGradient(const FbTk::Texture *src_texture); protected: /** Render to pixmap @return rendered pixmap */ Pixmap renderPixmap(); /** Render to XImage @returns allocated and rendered XImage, user is responsible to deallocate */ XImage *renderXImage(); /** @name render functions */ //@{ void invert(); void bevel1(); void bevel2(); void dgradient(); void egradient(); void hgradient(); void pgradient(); void rgradient(); void vgradient(); void cdgradient(); void pcgradient(); //@} private: BImageControl *control; #ifdef INTERLACE bool interlaced; #endif // INTERLACE XColor *colors; // color table const FbTk::Color *from, *to; int red_offset, green_offset, blue_offset, red_bits, green_bits, blue_bits, ncolors, cpc, cpccpc; unsigned char *red, *green, *blue, *red_table, *green_table, *blue_table; unsigned int width, height, *xtable, *ytable; }; /** Holds screen info and color tables */ class BImageControl : public TimeoutHandler { public: BImageControl(BaseDisplay *disp, ScreenInfo *screen, bool = False, int = 4, unsigned long = 300000l, unsigned long = 200l); virtual ~BImageControl(); inline BaseDisplay *baseDisplay() { return basedisplay; } inline bool doDither() { return dither; } inline const Colormap &colormap() const { return m_colormap; } inline const ScreenInfo *getScreenInfo() const { return screeninfo; } inline Window drawable() const { return window; } /// @return visual of screen inline Visual *visual() { return screeninfo->getVisual(); } /// @return Bits per pixel of screen inline int bitsPerPixel() const { return bits_per_pixel; } /// @return depth of screen inline int depth() const { return screen_depth; } inline int colorsPerChannel() const { return colors_per_channel; } unsigned long color(const char *colorname); unsigned long color(const char *, unsigned char *, unsigned char *, unsigned char *); unsigned long getSqrt(unsigned int val); /** Render to pixmap @param width width of pixmap @param height height of pixmap @param src_texture texture type to render @return pixmap of the rendered image, on failure None */ Pixmap renderImage(unsigned int width, unsigned int height, const FbTk::Texture *src_texture); void installRootColormap(); void removeImage(Pixmap thepix); void colorTables(unsigned char **, unsigned char **, unsigned char **, int *, int *, int *, int *, int *, int *); void getXColorTable(XColor **, int *); void getGradientBuffers(unsigned int, unsigned int, unsigned int **, unsigned int **); void setDither(bool d) { dither = d; } void setColorsPerChannel(int cpc); void parseTexture(FbTk::Texture *ret_texture, const char *sval); virtual void timeout(); protected: /** Search cache for a specific pixmap @return None if no cache was found */ Pixmap searchCache(unsigned int width, unsigned int height, unsigned long texture_type, const FbTk::Color &color, const FbTk::Color &color_to); private: bool dither; BaseDisplay *basedisplay; ScreenInfo *screeninfo; #ifdef TIMEDCACHE BTimer timer; #endif // TIMEDCACHE Colormap m_colormap; Window window; XColor *colors; ///< color table int colors_per_channel, ncolors, screen_number, screen_depth, bits_per_pixel, red_offset, green_offset, blue_offset, red_bits, green_bits, blue_bits; unsigned char red_color_table[256], green_color_table[256], blue_color_table[256]; unsigned int *grad_xbuffer, *grad_ybuffer, grad_buffer_width, grad_buffer_height; static unsigned long *sqrt_table; /// sqrt lookup table typedef struct Cache { Pixmap pixmap; unsigned int count, width, height; unsigned long pixel1, pixel2, texture; } Cache; unsigned long cache_max; typedef std::list<Cache *> CacheList; CacheList cache; }; #endif // IMAGE_HH |