X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Frendercontrol.cc;h=8f9329688c04c4f09fffdd9db6967f466999c947;hb=213df2814b002da2c5f324210d44559f9d651e21;hp=2e80217d499ff06b80a04352479becf320ec0bc3;hpb=1e58c863bbaddd2f2dbebfde740ca842e8837a1c;p=chaz%2Fopenbox diff --git a/otk/rendercontrol.cc b/otk/rendercontrol.cc index 2e80217d..8f932968 100644 --- a/otk/rendercontrol.cc +++ b/otk/rendercontrol.cc @@ -13,16 +13,23 @@ #include "surface.hh" #include "font.hh" #include "ustring.hh" +#include "property.hh" extern "C" { -#ifdef HAVE_STDLIB_H -# include -#endif // HAVE_STDLIB_H +#ifdef HAVE_SYS_WAIT_H +# include +#endif // HAVE_SYS_WAIT_H + +#ifdef HAVE_UNISTD_H +# include +#endif // HAVE_UNISTD_H #include "../src/gettext.h" #define _(str) gettext(str) } +#include + namespace otk { RenderControl *RenderControl::getRenderControl(int screen) @@ -47,8 +54,10 @@ RenderControl *RenderControl::getRenderControl(int screen) RenderControl::RenderControl(int screen) : _screen(screen) + { printf("Initializing RenderControl\n"); + } RenderControl::~RenderControl() @@ -56,13 +65,6 @@ RenderControl::~RenderControl() printf("Destroying RenderControl\n"); } -void RenderControl::drawRoot(const RenderColor &color) const -{ - Window root = display->screenInfo(_screen)->rootWindow(); - XSetWindowBackground(**display, root, color.pixel()); - XClearWindow(**display, root); -} - void RenderControl::drawString(Surface& sf, const Font &font, int x, int y, const RenderColor &color, const ustring &string) const @@ -285,12 +287,7 @@ void RenderControl::drawGradientBackground( } reduceDepth(sf, im); - - im->data = (char*) data; - sf.setPixmap(im); - - im->data = NULL; XDestroyImage(im); } @@ -451,12 +448,32 @@ void RenderControl::drawImage(Surface &sf, int w, int h, if (x < 0) x = 0; if (y < 0) y = 0; - // XXX SCALING!@!&*(@! to make it fit on the surface - int orgw = w; + // Reduce the image size if its too big to make it fit on the surface + int oldw = w, oldh = h; + unsigned long *olddata = data; if (w > sfw) w = sfw; if (h > sfh) h = sfh; + unsigned long newdata[w*h]; + if (w < oldw || h < oldh) { + double dx = oldw / (double)w; + double dy = oldh / (double)h; + double px = 0.0; + double py = 0.0; + int iy = 0; + for (i = 0, c = 0, e = w*h; i < e; ++i) { + newdata[i] = olddata[(int)px + iy]; + if (++c >= w) { + c = 0; + px = 0; + py += dy; + iy = (int)py * oldw; + } else + px += dx; + } + data = newdata; + } - for (i = 0, c = 0, bgi = y * sfw + x, e = orgw*h; i < e; ++i, ++bgi) { + for (i = 0, c = 0, bgi = y * sfw + x, e = w*h; i < e; ++i, ++bgi) { unsigned char alpha = data[i] >> 24; unsigned char r = data[i] >> 16; unsigned char g = data[i] >> 8; @@ -477,7 +494,6 @@ void RenderControl::drawImage(Surface &sf, int w, int h, if (++c >= w) { c = 0; bgi += sfw - w; - i += orgw - w; } } @@ -488,12 +504,7 @@ void RenderControl::drawImage(Surface &sf, int w, int h, im->byte_order = endian; reduceDepth(sf, im); - - im->data = (char*) bg; - sf.setPixmap(im); - - im->data = NULL; XDestroyImage(im); }