X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=31d4c73034eb65a230b72fae283ee3e676e9d670;hb=b8f05e53885016a96afbd5c9f0f02e0d90f75773;hp=9cd64fa3bfd47dfe0682d897bcfac9d0fa754174;hpb=895cd9f43d5bca69a0f5c3411363c1ed623bb3f5;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index 9cd64fa3..31d4c730 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -1,3 +1,6 @@ +#ifdef USE_GL +#include +#endif /* USE_GL */ #include #include "render.h" #include "gradient.h" @@ -379,9 +382,12 @@ void gradient_solid(Appearance *l, int x, int y, int w, int h) } break; case Flat: - if (sp->border) + if (sp->border) { + if (sp->border_color->gc == None) + color_allocate_gc(sp->border_color); XDrawRectangle(ob_display, l->pixmap, sp->border_color->gc, left, top, right, bottom); + } break; default: g_assert_not_reached(); /* unhandled ReliefType */ @@ -391,7 +397,7 @@ void gradient_solid(Appearance *l, int x, int y, int w, int h) void gradient_pyramid(Surface *sf, int inw, int inh) { pixel32 *data = sf->data.planar.pixel_data; - pixel32 *end = data + inw*inh; + pixel32 *end = data + inw*inh - 1; pixel32 current; float drx, dgx, dbx, dry, dgy, dby; unsigned int r,g,b; @@ -434,15 +440,13 @@ void gradient_pyramid(Surface *sf, int inw, int inh) void gradient_rectangle(Surface *sf, int inw, int inh) { pixel32 *data = sf->data.planar.pixel_data; - pixel32 *end = data + inw*inh; + pixel32 *end = data + inw*inh - 1; pixel32 current; float drx, dgx, dbx, dry, dgy, dby; unsigned int r,g,b; int x, y, h=(inh/2) + 1, w=(inw/2) + 1; int val; - g_message("rectangle"); - for (y = 0; y < h; ++y) { drx = (float)(sf->data.planar.primary->r - sf->data.planar.secondary->r); @@ -481,15 +485,13 @@ void gradient_rectangle(Surface *sf, int inw, int inh) void gradient_pipecross(Surface *sf, int inw, int inh) { pixel32 *data = sf->data.planar.pixel_data; - pixel32 *end = data + inw*inh; + pixel32 *end = data + inw*inh - 1; pixel32 current; float drx, dgx, dbx, dry, dgy, dby; unsigned int r,g,b; int x, y, h=(inh/2) + 1, w=(inw/2) + 1; int val; - g_message("pipecross"); - for (y = 0; y < h; ++y) { drx = (float)(sf->data.planar.secondary->r - sf->data.planar.primary->r); @@ -524,4 +526,233 @@ void gradient_pipecross(Surface *sf, int inw, int inh) end-=inw; } } - +#ifdef USE_GL +void render_gl_gradient(Surface *sf, int x, int y, int w, int h) +{ + float pr,pg,pb; + float sr, sg, sb; + float ar, ag, ab; + + pr = (float)sf->data.planar.primary->r/255.0; + pg = (float)sf->data.planar.primary->g/255.0; + pb = (float)sf->data.planar.primary->b/255.0; + if (sf->data.planar.secondary) { + sr = (float)sf->data.planar.secondary->r/255.0; + sg = (float)sf->data.planar.secondary->g/255.0; + sb = (float)sf->data.planar.secondary->b/255.0; + } + switch (sf->data.planar.grad) { + case Background_Solid: /* already handled */ + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glVertex2i(x, y); + glEnd(); + return; + case Background_Horizontal: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glColor3f(pr, pg, pb); + glVertex2i(x, y+h); + glVertex2i(x, y); + glEnd(); + break; + case Background_Vertical: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glVertex2i(x+w, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glEnd(); + break; + case Background_Diagonal: + ar = (pr + sr) / 2.0; + ag = (pg + sg) / 2.0; + ab = (pb + sb) / 2.0; + glBegin(GL_TRIANGLES); + glColor3f(ar, ag, ab); + glVertex2i(x, y); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y); + glColor3f(ar, ag, ab); + glVertex2i(x+w, y+h); + + glColor3f(ar, ag, ab); + glVertex2i(x+w, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x, y+h); + glColor3f(ar, ag, ab); + glVertex2i(x, y); + glEnd(); + break; + case Background_CrossDiagonal: + ar = (pr + sr) / 2.0; + ag = (pg + sg) / 2.0; + ab = (pb + sb) / 2.0; + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glColor3f(ar, ag, ab); + glVertex2i(x+w, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w, y+h); + + glColor3f(sr, sg, sb); + glVertex2i(x+w, y+h); + glColor3f(ar, ag, ab); + glVertex2i(x, y+h); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glEnd(); + break; + case Background_Pyramid: + ar = (pr + sr) / 2.0; + ag = (pg + sg) / 2.0; + ab = (pb + sb) / 2.0; + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(ar, ag, ab); + glVertex2i(x, y+h/2); + + glVertex2i(x, y+h/2); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y+h); + + glVertex2i(x, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(ar, ag, ab); + glVertex2i(x+w/2, y+h); + + glVertex2i(x+w/2, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(ar, ag, ab); + glVertex2i(x+w, y+h/2); + + glVertex2i(x+w, y+h/2); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y); + + glVertex2i(x+w, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(ar, ag, ab); + glVertex2i(x+w/2, y); + + glVertex2i(x+w/2, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glEnd(); + break; + case Background_PipeCross: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glVertex2i(x, y+h/2); + + glVertex2i(x, y+h/2); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y+h); + + glVertex2i(x, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glVertex2i(x+w/2, y+h); + + glVertex2i(x+w/2, y+h); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glVertex2i(x+w, y+h/2); + + glVertex2i(x+w, y+h/2); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y); + + glVertex2i(x+w, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glVertex2i(x+w/2, y); + + glVertex2i(x+w/2, y); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glEnd(); + break; + case Background_Rectangle: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y+h); + + glVertex2i(x, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y+h); + + glVertex2i(x+w, y+h); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x+w, y); + + glVertex2i(x+w, y); + glColor3f(sr, sg, sb); + glVertex2i(x+w/2, y+h/2); + glColor3f(pr, pg, pb); + glVertex2i(x, y); + + glEnd(); + break; + default: + g_message("unhandled gradient"); + return; + } +} +#endif /* USE_GL */