diff options
Diffstat (limited to 'src/Image.cc')
-rw-r--r-- | src/Image.cc | 166 |
1 files changed, 85 insertions, 81 deletions
diff --git a/src/Image.cc b/src/Image.cc index fe13756..e0bc22f 100644 --- a/src/Image.cc +++ b/src/Image.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Image.cc,v 1.18 2002/11/24 20:54:29 fluxgen Exp $ | 25 | // $Id: Image.cc,v 1.19 2002/11/27 22:04:02 fluxgen Exp $ |
26 | 26 | ||
27 | #include "Image.hh" | 27 | #include "Image.hh" |
28 | 28 | ||
@@ -42,7 +42,6 @@ | |||
42 | #include <sys/types.h> | 42 | #include <sys/types.h> |
43 | #endif // HAVE_SYS_TYPES_H | 43 | #endif // HAVE_SYS_TYPES_H |
44 | 44 | ||
45 | |||
46 | #include <cstdlib> | 45 | #include <cstdlib> |
47 | #include <cstring> | 46 | #include <cstring> |
48 | #include <cstdio> | 47 | #include <cstdio> |
@@ -107,21 +106,23 @@ BImage::~BImage() { | |||
107 | } | 106 | } |
108 | 107 | ||
109 | 108 | ||
110 | Pixmap BImage::render(const FbTk::Texture *texture) { | 109 | Pixmap BImage::render(const FbTk::Texture &texture) { |
111 | using namespace FbTk; | 110 | |
112 | if (texture->type() & Texture::PARENTRELATIVE) | 111 | if (texture.type() & FbTk::Texture::PARENTRELATIVE) |
113 | return ParentRelative; | 112 | return ParentRelative; |
114 | else if (texture->type() & Texture::SOLID) | 113 | else if (texture.type() & FbTk::Texture::SOLID) |
115 | return renderSolid(texture); | 114 | return renderSolid(texture); |
116 | else if (texture->type() & Texture::GRADIENT) | 115 | else if (texture.type() & FbTk::Texture::GRADIENT) |
117 | return renderGradient(texture); | 116 | return renderGradient(texture); |
118 | 117 | ||
119 | return None; | 118 | return None; |
120 | } | 119 | } |
121 | 120 | ||
122 | 121 | ||
123 | Pixmap BImage::renderSolid(const FbTk::Texture *texture) { | 122 | Pixmap BImage::renderSolid(const FbTk::Texture &texture) { |
124 | Display *disp = BaseDisplay::getXDisplay(); | 123 | |
124 | Display *disp = BaseDisplay::instance()->getXDisplay(); | ||
125 | |||
125 | Pixmap pixmap = XCreatePixmap(disp, | 126 | Pixmap pixmap = XCreatePixmap(disp, |
126 | control->drawable(), width, | 127 | control->drawable(), width, |
127 | height, control->depth()); | 128 | height, control->depth()); |
@@ -136,80 +137,78 @@ Pixmap BImage::renderSolid(const FbTk::Texture *texture) { | |||
136 | XGCValues gcv; | 137 | XGCValues gcv; |
137 | GC gc, hgc, lgc; | 138 | GC gc, hgc, lgc; |
138 | 139 | ||
139 | gcv.foreground = texture->color().pixel(); | 140 | gcv.foreground = texture.color().pixel(); |
140 | gcv.fill_style = FillSolid; | 141 | gcv.fill_style = FillSolid; |
141 | gc = XCreateGC(disp, pixmap, | 142 | gc = XCreateGC(disp, pixmap, |
142 | GCForeground | GCFillStyle, &gcv); | 143 | GCForeground | GCFillStyle, &gcv); |
143 | 144 | ||
144 | gcv.foreground = texture->hiColor().pixel(); | 145 | gcv.foreground = texture.hiColor().pixel(); |
145 | hgc = XCreateGC(disp, pixmap, | 146 | hgc = XCreateGC(disp, pixmap, |
146 | GCForeground, &gcv); | 147 | GCForeground, &gcv); |
147 | 148 | ||
148 | gcv.foreground = texture->loColor().pixel(); | 149 | gcv.foreground = texture.loColor().pixel(); |
149 | lgc = XCreateGC(disp, pixmap, | 150 | lgc = XCreateGC(disp, pixmap, |
150 | GCForeground, &gcv); | 151 | GCForeground, &gcv); |
151 | 152 | ||
152 | XFillRectangle(BaseDisplay::getXDisplay(), pixmap, gc, 0, 0, | 153 | XFillRectangle(disp, pixmap, gc, 0, 0, width, height); |
153 | width, height); | 154 | |
154 | |||
155 | using namespace FbTk; | 155 | using namespace FbTk; |
156 | 156 | ||
157 | if (texture->type() & Texture::INTERLACED) { | 157 | if (texture.type() & Texture::INTERLACED) { |
158 | gcv.foreground = texture->colorTo().pixel(); | 158 | gcv.foreground = texture.colorTo().pixel(); |
159 | GC igc = XCreateGC(disp, pixmap, | 159 | GC igc = XCreateGC(disp, pixmap, |
160 | GCForeground, &gcv); | 160 | GCForeground, &gcv); |
161 | 161 | ||
162 | register unsigned int i = 0; | 162 | register unsigned int i = 0; |
163 | for (; i < height; i += 2) | 163 | for (; i < height; i += 2) |
164 | XDrawLine(disp, pixmap, igc, | 164 | XDrawLine(disp, pixmap, igc, 0, i, width, i); |
165 | 0, i, width, i); | ||
166 | 165 | ||
167 | XFreeGC(disp, igc); | 166 | XFreeGC(disp, igc); |
168 | } | 167 | } |
169 | 168 | ||
170 | if (texture->type() & Texture::BEVEL1) { | 169 | if (texture.type() & Texture::BEVEL1) { |
171 | if (texture->type() & Texture::RAISED) { | 170 | if (texture.type() & Texture::RAISED) { |
172 | XDrawLine(disp, pixmap, lgc, | 171 | XDrawLine(disp, pixmap, lgc, |
173 | 0, height - 1, width - 1, height - 1); | 172 | 0, height - 1, width - 1, height - 1); |
174 | XDrawLine(disp, pixmap, lgc, | 173 | XDrawLine(disp, pixmap, lgc, |
175 | width - 1, height - 1, width - 1, 0); | 174 | width - 1, height - 1, width - 1, 0); |
176 | 175 | ||
177 | XDrawLine(disp, pixmap, hgc, | 176 | XDrawLine(disp, pixmap, hgc, |
178 | 0, 0, width - 1, 0); | 177 | 0, 0, width - 1, 0); |
179 | XDrawLine(disp, pixmap, hgc, | 178 | XDrawLine(disp, pixmap, hgc, |
180 | 0, height - 1, 0, 0); | 179 | 0, height - 1, 0, 0); |
181 | } else if (texture->type() & Texture::SUNKEN) { | 180 | } else if (texture.type() & Texture::SUNKEN) { |
182 | XDrawLine(disp, pixmap, hgc, | 181 | XDrawLine(disp, pixmap, hgc, |
183 | 0, height - 1, width - 1, height - 1); | 182 | 0, height - 1, width - 1, height - 1); |
184 | XDrawLine(disp, pixmap, hgc, | 183 | XDrawLine(disp, pixmap, hgc, |
185 | width - 1, height - 1, width - 1, 0); | 184 | width - 1, height - 1, width - 1, 0); |
186 | 185 | ||
187 | XDrawLine(disp, pixmap, lgc, | 186 | XDrawLine(disp, pixmap, lgc, |
188 | 0, 0, width - 1, 0); | 187 | 0, 0, width - 1, 0); |
189 | XDrawLine(disp, pixmap, lgc, | 188 | XDrawLine(disp, pixmap, lgc, |
190 | 0, height - 1, 0, 0); | 189 | 0, height - 1, 0, 0); |
191 | } | 190 | } |
192 | } else if (texture->type() & Texture::BEVEL2) { | 191 | } else if (texture.type() & Texture::BEVEL2) { |
193 | if (texture->type() & Texture::RAISED) { | 192 | if (texture.type() & Texture::RAISED) { |
194 | XDrawLine(disp, pixmap, lgc, | 193 | XDrawLine(disp, pixmap, lgc, |
195 | 1, height - 3, width - 3, height - 3); | 194 | 1, height - 3, width - 3, height - 3); |
196 | XDrawLine(disp, pixmap, lgc, | 195 | XDrawLine(disp, pixmap, lgc, |
197 | width - 3, height - 3, width - 3, 1); | 196 | width - 3, height - 3, width - 3, 1); |
198 | 197 | ||
199 | XDrawLine(disp, pixmap, hgc, | 198 | XDrawLine(disp, pixmap, hgc, |
200 | 1, 1, width - 3, 1); | 199 | 1, 1, width - 3, 1); |
201 | XDrawLine(disp, pixmap, hgc, | 200 | XDrawLine(disp, pixmap, hgc, |
202 | 1, height - 3, 1, 1); | 201 | 1, height - 3, 1, 1); |
203 | } else if (texture->type() & Texture::SUNKEN) { | 202 | } else if (texture.type() & Texture::SUNKEN) { |
204 | XDrawLine(disp, pixmap, hgc, | 203 | XDrawLine(disp, pixmap, hgc, |
205 | 1, height - 3, width - 3, height - 3); | 204 | 1, height - 3, width - 3, height - 3); |
206 | XDrawLine(disp, pixmap, hgc, | 205 | XDrawLine(disp, pixmap, hgc, |
207 | width - 3, height - 3, width - 3, 1); | 206 | width - 3, height - 3, width - 3, 1); |
208 | 207 | ||
209 | XDrawLine(disp, pixmap, lgc, | 208 | XDrawLine(disp, pixmap, lgc, |
210 | 1, 1, width - 3, 1); | 209 | 1, 1, width - 3, 1); |
211 | XDrawLine(disp, pixmap, lgc, | 210 | XDrawLine(disp, pixmap, lgc, |
212 | 1, height - 3, 1, 1); | 211 | 1, height - 3, 1, 1); |
213 | } | 212 | } |
214 | } | 213 | } |
215 | 214 | ||
@@ -221,50 +220,50 @@ Pixmap BImage::renderSolid(const FbTk::Texture *texture) { | |||
221 | } | 220 | } |
222 | 221 | ||
223 | 222 | ||
224 | Pixmap BImage::renderGradient(const FbTk::Texture *texture) { | 223 | Pixmap BImage::renderGradient(const FbTk::Texture &texture) { |
225 | 224 | ||
226 | bool inverted = false; | 225 | bool inverted = false; |
227 | 226 | ||
228 | using namespace FbTk; | 227 | using namespace FbTk; |
229 | 228 | ||
230 | interlaced = texture->type() & Texture::INTERLACED; | 229 | interlaced = texture.type() & Texture::INTERLACED; |
231 | 230 | ||
232 | if (texture->type() & Texture::SUNKEN) { | 231 | if (texture.type() & Texture::SUNKEN) { |
233 | from = &(texture->colorTo()); | 232 | from = &(texture.colorTo()); |
234 | to = &(texture->color()); | 233 | to = &(texture.color()); |
235 | 234 | ||
236 | if (! (texture->type() & Texture::INVERT)) | 235 | if (! (texture.type() & Texture::INVERT)) |
237 | inverted = true; | 236 | inverted = true; |
238 | } else { | 237 | } else { |
239 | from = &(texture->color()); | 238 | from = &(texture.color()); |
240 | to = &(texture->colorTo()); | 239 | to = &(texture.colorTo()); |
241 | 240 | ||
242 | if (texture->type() & Texture::INVERT) | 241 | if (texture.type() & Texture::INVERT) |
243 | inverted = true; | 242 | inverted = true; |
244 | } | 243 | } |
245 | 244 | ||
246 | control->getGradientBuffers(width, height, &xtable, &ytable); | 245 | control->getGradientBuffers(width, height, &xtable, &ytable); |
247 | 246 | ||
248 | if (texture->type() & Texture::DIAGONAL) | 247 | if (texture.type() & Texture::DIAGONAL) |
249 | dgradient(); | 248 | dgradient(); |
250 | else if (texture->type() & Texture::ELLIPTIC) | 249 | else if (texture.type() & Texture::ELLIPTIC) |
251 | egradient(); | 250 | egradient(); |
252 | else if (texture->type() & Texture::HORIZONTAL) | 251 | else if (texture.type() & Texture::HORIZONTAL) |
253 | hgradient(); | 252 | hgradient(); |
254 | else if (texture->type() & Texture::PYRAMID) | 253 | else if (texture.type() & Texture::PYRAMID) |
255 | pgradient(); | 254 | pgradient(); |
256 | else if (texture->type() & Texture::RECTANGLE) | 255 | else if (texture.type() & Texture::RECTANGLE) |
257 | rgradient(); | 256 | rgradient(); |
258 | else if (texture->type() & Texture::VERTICAL) | 257 | else if (texture.type() & Texture::VERTICAL) |
259 | vgradient(); | 258 | vgradient(); |
260 | else if (texture->type() & Texture::CROSSDIAGONAL) | 259 | else if (texture.type() & Texture::CROSSDIAGONAL) |
261 | cdgradient(); | 260 | cdgradient(); |
262 | else if (texture->type() & Texture::PIPECROSS) | 261 | else if (texture.type() & Texture::PIPECROSS) |
263 | pcgradient(); | 262 | pcgradient(); |
264 | 263 | ||
265 | if (texture->type() & Texture::BEVEL1) | 264 | if (texture.type() & Texture::BEVEL1) |
266 | bevel1(); | 265 | bevel1(); |
267 | else if (texture->type() & Texture::BEVEL2) | 266 | else if (texture.type() & Texture::BEVEL2) |
268 | bevel2(); | 267 | bevel2(); |
269 | 268 | ||
270 | if (inverted) | 269 | if (inverted) |
@@ -2180,34 +2179,39 @@ Pixmap BImageControl::searchCache(unsigned int width, unsigned int height, | |||
2180 | 2179 | ||
2181 | 2180 | ||
2182 | Pixmap BImageControl::renderImage(unsigned int width, unsigned int height, | 2181 | Pixmap BImageControl::renderImage(unsigned int width, unsigned int height, |
2183 | const FbTk::Texture *texture) { | 2182 | const FbTk::Texture &texture) { |
2184 | 2183 | ||
2185 | if (texture->type() & FbTk::Texture::PARENTRELATIVE) | 2184 | if (texture.type() & FbTk::Texture::PARENTRELATIVE) |
2186 | return ParentRelative; | 2185 | return ParentRelative; |
2187 | 2186 | ||
2188 | Pixmap pixmap = searchCache(width, height, texture->type(), | 2187 | // search cache first |
2189 | texture->color(), texture->colorTo()); | 2188 | Pixmap pixmap = searchCache(width, height, texture.type(), |
2190 | if (pixmap) return pixmap; | 2189 | texture.color(), texture.colorTo()); |
2190 | if (pixmap) | ||
2191 | return pixmap; // return cache item | ||
2191 | 2192 | ||
2193 | // render new image | ||
2192 | BImage image(this, width, height); | 2194 | BImage image(this, width, height); |
2193 | pixmap = image.render(texture); | 2195 | pixmap = image.render(texture); |
2194 | 2196 | ||
2195 | if (pixmap) { | 2197 | if (pixmap) { |
2198 | // create new cache item and add it to cache list | ||
2199 | |||
2196 | Cache *tmp = new Cache; | 2200 | Cache *tmp = new Cache; |
2197 | 2201 | ||
2198 | tmp->pixmap = pixmap; | 2202 | tmp->pixmap = pixmap; |
2199 | tmp->width = width; | 2203 | tmp->width = width; |
2200 | tmp->height = height; | 2204 | tmp->height = height; |
2201 | tmp->count = 1; | 2205 | tmp->count = 1; |
2202 | tmp->texture = texture->type(); | 2206 | tmp->texture = texture.type(); |
2203 | tmp->pixel1 = texture->color().pixel(); | 2207 | tmp->pixel1 = texture.color().pixel(); |
2204 | 2208 | ||
2205 | if (texture->type() & FbTk::Texture::GRADIENT) | 2209 | if (texture.type() & FbTk::Texture::GRADIENT) |
2206 | tmp->pixel2 = texture->colorTo().pixel(); | 2210 | tmp->pixel2 = texture.colorTo().pixel(); |
2207 | else | 2211 | else |
2208 | tmp->pixel2 = 0l; | 2212 | tmp->pixel2 = 0l; |
2209 | 2213 | ||
2210 | cache.push_back(tmp); | 2214 | cache.push_back(tmp); |
2211 | 2215 | ||
2212 | if ((unsigned) cache.size() > cache_max) { | 2216 | if ((unsigned) cache.size() > cache_max) { |
2213 | #ifdef DEBUG | 2217 | #ifdef DEBUG |