make horizontal gradients faster by not jumping around in memory as much
This commit is contained in:
parent
3a03a554f0
commit
9a93350aa7
1 changed files with 40 additions and 43 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
gradient.c for the Openbox window manager
|
gradient.c for the Openbox window manager
|
||||||
Copyright (c) 2006 Mikael Magnusson
|
Copyright (c) 2006 Mikael Magnusson
|
||||||
Copyright (c) 2003-2007 Dana Jansens
|
Copyright (c) 2003-2008 Dana Jansens
|
||||||
Copyright (c) 2003 Derek Foreman
|
Copyright (c) 2003 Derek Foreman
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
#include "gradient.h"
|
#include "gradient.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y,
|
static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y,
|
||||||
gboolean raised);
|
gboolean raised);
|
||||||
|
@ -483,64 +484,60 @@ static void gradient_horizontal(RrSurface *sf, gint w, gint h)
|
||||||
{
|
{
|
||||||
gint x, y;
|
gint x, y;
|
||||||
RrPixel32 *data = sf->pixel_data, *datav;
|
RrPixel32 *data = sf->pixel_data, *datav;
|
||||||
RrPixel32 current;
|
|
||||||
|
|
||||||
VARS(x);
|
VARS(x);
|
||||||
SETUP(x, sf->primary, sf->secondary, w);
|
SETUP(x, sf->primary, sf->secondary, w);
|
||||||
|
|
||||||
for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
|
|
||||||
current = COLOR(x);
|
|
||||||
datav = data;
|
datav = data;
|
||||||
for (y = h - 1; y >= 0; --y) { /* 0 -> h */
|
for (x = w - 1; x > 0; --x) { /* 0 -> w - 1 */
|
||||||
*datav = current;
|
*datav = COLOR(x);
|
||||||
datav += w;
|
++datav;
|
||||||
}
|
|
||||||
++data;
|
|
||||||
|
|
||||||
NEXT(x);
|
NEXT(x);
|
||||||
}
|
}
|
||||||
current = COLOR(x);
|
*datav = COLOR(x);
|
||||||
for (y = h - 1; y >= 0; --y) /* 0 -> h */
|
++datav;
|
||||||
*(data + y * w) = current;
|
|
||||||
|
for (y = h - 1; y > 0; --y) { /* 1 -> h */
|
||||||
|
memcpy(datav, data, w * sizeof(RrPixel32));
|
||||||
|
datav += w;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h)
|
static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h)
|
||||||
{
|
{
|
||||||
gint x, y;
|
gint x, y, half1, half2;
|
||||||
RrPixel32 *data = sf->pixel_data, *datav;
|
RrPixel32 *data = sf->pixel_data, *datav;
|
||||||
RrPixel32 current;
|
|
||||||
|
|
||||||
VARS(x);
|
VARS(x);
|
||||||
SETUP(x, sf->primary, sf->secondary, w/2);
|
|
||||||
|
|
||||||
if (w > 1) {
|
half1 = (w + 1) / 2;
|
||||||
for (x = w - 1; x > w/2-1; --x) { /* 0 -> w-1 */
|
half2 = w / 2;
|
||||||
current = COLOR(x);
|
|
||||||
|
SETUP(x, sf->primary, sf->secondary, half1);
|
||||||
datav = data;
|
datav = data;
|
||||||
for (y = h - 1; y >= 0; --y) { /* 0 -> h */
|
for (x = half1 - 1; x > 0; --x) { /* 0 -> half1 - 1 */
|
||||||
*datav = current;
|
*datav = COLOR(x);
|
||||||
datav += w;
|
++datav;
|
||||||
}
|
|
||||||
++data;
|
|
||||||
|
|
||||||
NEXT(x);
|
NEXT(x);
|
||||||
}
|
}
|
||||||
SETUP(x, sf->secondary, sf->primary, w/2);
|
*datav = COLOR(x);
|
||||||
for (x = w/2 - 1; x > 0; --x) { /* 0 -> w-1 */
|
++datav;
|
||||||
current = COLOR(x);
|
|
||||||
datav = data;
|
|
||||||
for (y = h - 1; y >= 0; --y) { /* 0 -> h */
|
|
||||||
*datav = current;
|
|
||||||
datav += w;
|
|
||||||
}
|
|
||||||
++data;
|
|
||||||
|
|
||||||
|
if (half2 > 0) {
|
||||||
|
SETUP(x, sf->secondary, sf->primary, half2);
|
||||||
|
for (x = half2 - 1; x > 0; --x) { /* 0 -> half2 - 1 */
|
||||||
|
*datav = COLOR(x);
|
||||||
|
++datav;
|
||||||
NEXT(x);
|
NEXT(x);
|
||||||
}
|
}
|
||||||
|
*datav = COLOR(x);
|
||||||
|
++datav;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (y = h - 1; y > 0; --y) { /* 1 -> h */
|
||||||
|
memcpy(datav, data, w * sizeof(RrPixel32));
|
||||||
|
datav += w;
|
||||||
}
|
}
|
||||||
current = COLOR(x);
|
|
||||||
for (y = h - 1; y >= 0; --y) /* 0 -> h */
|
|
||||||
*(data + y * w) = current;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gradient_vertical(RrSurface *sf, gint w, gint h)
|
static void gradient_vertical(RrSurface *sf, gint w, gint h)
|
||||||
|
|
Loading…
Reference in a new issue