X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=3a963406c33b0385165cac42fbdd3cdea7173c8b;hb=48a75b80d6148afe88d250f24a3f337677cf9c18;hp=9cd64fa3bfd47dfe0682d897bcfac9d0fa754174;hpb=895cd9f43d5bca69a0f5c3411363c1ed623bb3f5;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index 9cd64fa3..3a963406 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -1,3 +1,4 @@ +#include #include #include "render.h" #include "gradient.h" @@ -379,9 +380,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 +395,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 +438,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 +483,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 +524,79 @@ 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; + + 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); + glVertex3i(x, y, 0); + glVertex3i(x+w, y, 0); + glVertex3i(x+w, y+h, 0); + + glVertex3i(x+w, y+h, 0); + glVertex3i(x, y+h, 0); + glVertex3i(x, y, 0); + glEnd(); + return; + case Background_Vertical: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex3i(x, y, 0); + glColor3f(sr, sg, sb); + glVertex3i(x+w, y, 0); + glVertex3i(x+w, y+h, 0); + + glVertex3i(x+w, y+h, 0); + glColor3f(pr, pg, pb); + glVertex3i(x, y+h, 0); + glVertex3i(x, y, 0); + glEnd(); + break; + case Background_Horizontal: + glBegin(GL_TRIANGLES); + glColor3f(pr, pg, pb); + glVertex3i(x, y, 0); + glVertex3i(x+w, y, 0); + glColor3f(sr, sg, sb); + glVertex3i(x+w, y+h, 0); + + glVertex3i(x+w, y+h, 0); + glVertex3i(x, y+h, 0); + glColor3f(pr, pg, pb); + glVertex3i(x, y, 0); + glEnd(); + break; + case Background_Diagonal: +printf("diagonal\n"); + break; + case Background_CrossDiagonal: +printf("crossdiagonal\n"); + break; + case Background_Pyramid: +printf("pyramid\n"); + break; + case Background_PipeCross: +printf("pipecross\n"); + break; + case Background_Rectangle: +printf("rect\n"); + break; + default: + g_message("unhandled gradient"); + return; + } +} +#endif /* USE_GL */