X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FImage.cc;h=2094c00382995ca82f17a66a691bd5c10e0af50b;hb=1e36acfd9198a7d8cbad4eef094e15a03eebc291;hp=674fdeace13ef93283e2bcbfa35f3cec0111a429;hpb=01096f867493aed2efc2694c986811404288c1f1;p=chaz%2Fopenbox diff --git a/src/Image.cc b/src/Image.cc index 674fdeac..2094c003 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -41,7 +41,7 @@ using std::min; #include "Texture.hh" -BImage::BImage(BImageControl *c, unsigned int w, unsigned int h) { +BImage::BImage(BImageControl *c, int w, int h) { control = c; width = (w > 0) ? w : 1; @@ -107,49 +107,57 @@ Pixmap BImage::render_solid(const BTexture &texture) { XDrawLine(display, pixmap, peninterlace.gc(), 0, i, width, i); } + int left = 0, top = 0, right = width - 1, bottom = height - 1; + + if (texture.texture() & BTexture::Border) { + BPen penborder(texture.borderColor()); + XDrawRectangle(display, pixmap, penborder.gc(), + left, top, right, bottom); + } + if (texture.texture() & BTexture::Bevel1) { if (texture.texture() & BTexture::Raised) { XDrawLine(display, pixmap, penshadow.gc(), - 0, height - 1, width - 1, height - 1); + left, bottom, right, bottom); XDrawLine(display, pixmap, penshadow.gc(), - width - 1, height - 1, width - 1, 0); + right, bottom, right, top); XDrawLine(display, pixmap, penlight.gc(), - 0, 0, width - 1, 0); + left, top, right, top); XDrawLine(display, pixmap, penlight.gc(), - 0, height - 1, 0, 0); + left, bottom, left, top); } else if (texture.texture() & BTexture::Sunken) { XDrawLine(display, pixmap, penlight.gc(), - 0, height - 1, width - 1, height - 1); + left, bottom, right, bottom); XDrawLine(display, pixmap, penlight.gc(), - width - 1, height - 1, width - 1, 0); + right, bottom, right, top); XDrawLine(display, pixmap, penshadow.gc(), - 0, 0, width - 1, 0); + left, top, right, top); XDrawLine(display, pixmap, penshadow.gc(), - 0, height - 1, 0, 0); + left, bottom, left, top); } } else if (texture.texture() & BTexture::Bevel2) { if (texture.texture() & BTexture::Raised) { XDrawLine(display, pixmap, penshadow.gc(), - 1, height - 3, width - 3, height - 3); + left + 1, bottom - 2, right - 2, bottom - 2); XDrawLine(display, pixmap, penshadow.gc(), - width - 3, height - 3, width - 3, 1); + right - 2, bottom - 2, right - 2, top + 1); XDrawLine(display, pixmap, penlight.gc(), - 1, 1, width - 3, 1); + left + 1, top + 1, right - 2, top + 1); XDrawLine(display, pixmap, penlight.gc(), - 1, height - 3, 1, 1); + left + 1, bottom - 2, left + 1, top + 1); } else if (texture.texture() & BTexture::Sunken) { XDrawLine(display, pixmap, penlight.gc(), - 1, height - 3, width - 3, height - 3); + left + 1, bottom - 2, right - 2, bottom - 2); XDrawLine(display, pixmap, penlight.gc(), - width - 3, height - 3, width - 3, 1); + right - 2, bottom - 2, right - 2, top + 1); XDrawLine(display, pixmap, penshadow.gc(), - 1, 1, width - 3, 1); + left + 1, top + 1, right - 2, top + 1); XDrawLine(display, pixmap, penshadow.gc(), - 1, height - 3, 1, 1); + left + 1, bottom - 2, left + 1, top + 1); } } @@ -188,6 +196,8 @@ Pixmap BImage::render_gradient(const BTexture &texture) { if (texture.texture() & BTexture::Bevel1) bevel1(); else if (texture.texture() & BTexture::Bevel2) bevel2(); + if (texture.texture() & BTexture::Border) border(texture); + if (inverted) invert(); return renderPixmap(); @@ -811,6 +821,50 @@ void BImage::bevel2(void) { } +void BImage::border(const BTexture &texture) { + if (width < 2 || height < 2) return; + + register unsigned int i; + int r = texture.borderColor().red(), + g = texture.borderColor().green(), + b = texture.borderColor().blue(); + + unsigned char *pr, *pg, *pb; + + // top line + pr = red; + pg = green; + pb = blue; + for (i = 0; i < width; ++i) { + *pr++ = r; + *pg++ = g; + *pb++ = b; + } + + if (height > 2) { + // left and right lines (pr,pg,pb are already lined up) + for (i = 1; i < height - 1; ++i) { + *pr = r; + *pg = g; + *pb = b; + pr += width - 1; + pg += width - 1; + pb += width - 1; + *pr++ = r; + *pg++ = g; + *pb++ = b; + } + } + + // bottom line (pr,pg,pb are already lined up) + for (i = 0; i < width; ++i) { + *pr++ = r; + *pg++ = g; + *pb++ = b; + } +} + + void BImage::invert(void) { register unsigned int i, j, wh = (width * height) - 1; unsigned char tmp;