mirror of
https://github.com/gryf/wmaker.git
synced 2026-01-09 07:14:18 +01:00
wrlib: merge gradient duplicate code
This patch is adding a new static function named renderGradientWidth to factorize some code. Signed-off-by: Carlos R. Mafra <crmafra@gmail.com>
This commit is contained in:
committed by
Carlos R. Mafra
parent
bec572ea8b
commit
88d9deea83
245
wrlib/gradient.c
245
wrlib/gradient.c
@@ -134,6 +134,44 @@ static RImage *renderHGradient(unsigned width, unsigned height, int r0, int g0,
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned char *renderGradientWidth(unsigned char *ptr, unsigned width, unsigned char r, unsigned char g, unsigned char b)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = width / 4; i--;) {
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
}
|
||||||
|
switch (width % 4) {
|
||||||
|
case 3:
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
case 2:
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
case 1:
|
||||||
|
*ptr++ = r;
|
||||||
|
*ptr++ = g;
|
||||||
|
*ptr++ = b;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*----------------------------------------------------------------------
|
*----------------------------------------------------------------------
|
||||||
* renderVGradient--
|
* renderVGradient--
|
||||||
@@ -149,11 +187,10 @@ static RImage *renderHGradient(unsigned width, unsigned height, int r0, int g0,
|
|||||||
*/
|
*/
|
||||||
static RImage *renderVGradient(unsigned width, unsigned height, int r0, int g0, int b0, int rf, int gf, int bf)
|
static RImage *renderVGradient(unsigned width, unsigned height, int r0, int g0, int b0, int rf, int gf, int bf)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i;
|
||||||
long r, g, b, dr, dg, db;
|
long r, g, b, dr, dg, db;
|
||||||
RImage *image;
|
RImage *image;
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
unsigned char rr, gg, bb;
|
|
||||||
|
|
||||||
image = RCreateImage(width, height, False);
|
image = RCreateImage(width, height, False);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -170,65 +207,7 @@ static RImage *renderVGradient(unsigned width, unsigned height, int r0, int g0,
|
|||||||
db = ((bf - b0) << 16) / (int)height;
|
db = ((bf - b0) << 16) / (int)height;
|
||||||
|
|
||||||
for (i = 0; i < height; i++) {
|
for (i = 0; i < height; i++) {
|
||||||
rr = r >> 16;
|
ptr = renderGradientWidth(ptr, width, r >> 16, g >> 16, b >> 16);
|
||||||
gg = g >> 16;
|
|
||||||
bb = b >> 16;
|
|
||||||
for (j = 0; j < width / 8; j++) {
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
}
|
|
||||||
switch (width % 8) {
|
|
||||||
case 7:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 6:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 5:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 4:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 3:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 2:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 1:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
}
|
|
||||||
r += dr;
|
r += dr;
|
||||||
g += dg;
|
g += dg;
|
||||||
b += db;
|
b += db;
|
||||||
@@ -358,8 +337,6 @@ static RImage *renderMVGradient(unsigned width, unsigned height, RColor ** color
|
|||||||
RImage *image;
|
RImage *image;
|
||||||
unsigned char *ptr, *tmp;
|
unsigned char *ptr, *tmp;
|
||||||
unsigned height2;
|
unsigned height2;
|
||||||
int x;
|
|
||||||
unsigned char rr, gg, bb;
|
|
||||||
|
|
||||||
assert(count > 2);
|
assert(count > 2);
|
||||||
|
|
||||||
@@ -389,38 +366,7 @@ static RImage *renderMVGradient(unsigned width, unsigned height, RColor ** color
|
|||||||
db = ((int)(colors[i]->blue - colors[i - 1]->blue) << 16) / (int)height2;
|
db = ((int)(colors[i]->blue - colors[i - 1]->blue) << 16) / (int)height2;
|
||||||
|
|
||||||
for (j = 0; j < height2; j++) {
|
for (j = 0; j < height2; j++) {
|
||||||
rr = r >> 16;
|
ptr = renderGradientWidth(ptr, width, r >> 16, g >> 16, b >> 16);
|
||||||
gg = g >> 16;
|
|
||||||
bb = b >> 16;
|
|
||||||
|
|
||||||
for (x = 0; x < width / 4; x++) {
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
}
|
|
||||||
switch (width % 4) {
|
|
||||||
case 3:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
case 2:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
case 1:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
}
|
|
||||||
r += dr;
|
r += dr;
|
||||||
g += dg;
|
g += dg;
|
||||||
b += db;
|
b += db;
|
||||||
@@ -431,43 +377,9 @@ static RImage *renderMVGradient(unsigned width, unsigned height, RColor ** color
|
|||||||
b = colors[i]->blue << 16;
|
b = colors[i]->blue << 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
rr = r >> 16;
|
|
||||||
gg = g >> 16;
|
|
||||||
bb = b >> 16;
|
|
||||||
|
|
||||||
if (k < height) {
|
if (k < height) {
|
||||||
tmp = ptr;
|
tmp = ptr;
|
||||||
for (x = 0; x < width / 4; x++) {
|
ptr = renderGradientWidth(ptr, width, r >> 16, g >> 16, b >> 16);
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
}
|
|
||||||
switch (width % 4) {
|
|
||||||
case 3:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
case 2:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
case 1:
|
|
||||||
*ptr++ = rr;
|
|
||||||
*ptr++ = gg;
|
|
||||||
*ptr++ = bb;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = k + 1; j < height; j++) {
|
for (j = k + 1; j < height; j++) {
|
||||||
memcpy(ptr, tmp, lineSize);
|
memcpy(ptr, tmp, lineSize);
|
||||||
ptr += lineSize;
|
ptr += lineSize;
|
||||||
@@ -529,12 +441,11 @@ static RImage *renderMDGradient(unsigned width, unsigned height, RColor ** color
|
|||||||
RImage *RRenderInterwovenGradient(unsigned width, unsigned height,
|
RImage *RRenderInterwovenGradient(unsigned width, unsigned height,
|
||||||
RColor colors1[2], int thickness1, RColor colors2[2], int thickness2)
|
RColor colors1[2], int thickness1, RColor colors2[2], int thickness2)
|
||||||
{
|
{
|
||||||
int i, j, k, l, ll;
|
int i, k, l, ll;
|
||||||
long r1, g1, b1, dr1, dg1, db1;
|
long r1, g1, b1, dr1, dg1, db1;
|
||||||
long r2, g2, b2, dr2, dg2, db2;
|
long r2, g2, b2, dr2, dg2, db2;
|
||||||
RImage *image;
|
RImage *image;
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
unsigned char rr, gg, bb;
|
|
||||||
|
|
||||||
image = RCreateImage(width, height, False);
|
image = RCreateImage(width, height, False);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -559,71 +470,11 @@ RImage *RRenderInterwovenGradient(unsigned width, unsigned height,
|
|||||||
db2 = ((colors2[1].blue - colors2[0].blue) << 16) / (int)height;
|
db2 = ((colors2[1].blue - colors2[0].blue) << 16) / (int)height;
|
||||||
|
|
||||||
for (i = 0, k = 0, l = 0, ll = thickness1; i < height; i++) {
|
for (i = 0, k = 0, l = 0, ll = thickness1; i < height; i++) {
|
||||||
if (k == 0) {
|
if (k == 0)
|
||||||
rr = r1 >> 16;
|
ptr = renderGradientWidth(ptr, width, r1 >> 16, g1 >> 16, b1 >> 16);
|
||||||
gg = g1 >> 16;
|
else
|
||||||
bb = b1 >> 16;
|
ptr = renderGradientWidth(ptr, width, r2 >> 16, g2 >> 16, b2 >> 16);
|
||||||
} else {
|
|
||||||
rr = r2 >> 16;
|
|
||||||
gg = g2 >> 16;
|
|
||||||
bb = b2 >> 16;
|
|
||||||
}
|
|
||||||
for (j = 0; j < width / 8; j++) {
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
}
|
|
||||||
switch (width % 8) {
|
|
||||||
case 7:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 6:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 5:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 4:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 3:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 2:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
case 1:
|
|
||||||
*(ptr++) = rr;
|
|
||||||
*(ptr++) = gg;
|
|
||||||
*(ptr++) = bb;
|
|
||||||
}
|
|
||||||
if (++l == ll) {
|
if (++l == ll) {
|
||||||
if (k == 0) {
|
if (k == 0) {
|
||||||
k = 1;
|
k = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user