Move colour blend routine from html_redraw to plot_style and make it a define.

svn path=/trunk/netsurf/; revision=8451
This commit is contained in:
Michael Drake 2009-07-10 19:53:30 +00:00
parent 96d8e9335c
commit e0a4b50e87
2 changed files with 31 additions and 37 deletions

View File

@ -28,31 +28,40 @@
#define WIDGET_BLOBC 0x000000
/* Darken a colour by taking three quaters of each channels intensity */
#define darken_colour(c1) \
((((3 * (c1 >> 16)) >> 2) << 16) | \
(((3 * ((c1 >> 8) & 0xff)) >> 2) << 8) | \
#define darken_colour(c1) \
((((3 * (c1 >> 16)) >> 2) << 16) | \
(((3 * ((c1 >> 8) & 0xff)) >> 2) << 8) | \
(((3 * (c1 & 0xff)) >> 2) << 0))
/* Darken a colour by taking nine sixteenths of each channels intensity */
#define double_darken_colour(c1) \
((((9 * (c1 >> 16)) >> 4) << 16) | \
(((9 * ((c1 >> 8) & 0xff)) >> 4) << 8) | \
#define double_darken_colour(c1) \
((((9 * (c1 >> 16)) >> 4) << 16) | \
(((9 * ((c1 >> 8) & 0xff)) >> 4) << 8) | \
(((9 * (c1 & 0xff)) >> 4) << 0))
/* Lighten a colour by taking three quaters of each channels intensity
* and adding a full quater
* and adding a full quater
*/
#define lighten_colour(c1) \
(((((3 * (c1 >> 16)) >> 2) + 64) << 16) | \
((((3 * ((c1 >> 8) & 0xff)) >> 2) + 64) << 8) | \
((((3 * (c1 & 0xff)) >> 2) + 64) << 0))
/* Lighten a colour by taking nine sixteenths of each channels intensity and adding a full intensity 7/16ths */
#define double_lighten_colour(c1) \
(((((9 * (c1 >> 16)) >> 4) + 112) << 16) | \
((((9 * ((c1 >> 8) & 0xff)) >> 4) + 112) << 8) | \
/* Lighten a colour by taking nine sixteenths of each channels intensity and
* adding a full intensity 7/16ths */
#define double_lighten_colour(c1) \
(((((9 * (c1 >> 16)) >> 4) + 112) << 16) | \
((((9 * ((c1 >> 8) & 0xff)) >> 4) + 112) << 8) | \
((((9 * (c1 & 0xff)) >> 4) + 112) << 0))
/* Blend two colours by taking half the intensity of each channel in the first
* colour and adding them to half the intensity of each channel in the second
* colour */
#define blend_colour(c0, c1) \
((((c0 >> 16) + (c1 >> 16)) >> 1) << 16) | \
(((((c0 >> 8) & 0xff) + ((c1 >> 8) & 0xff)) >> 1) << 8) | \
((((c0 & 0xff) + (c1 & 0xff)) >> 1) << 0)
typedef enum {
PLOT_OP_TYPE_NONE = 0, /**< No operation */
PLOT_OP_TYPE_SOLID, /**< Solid colour */
@ -64,7 +73,7 @@ typedef struct {
plot_operation_type_t stroke_type;
int stroke_width;
colour stroke_colour;
plot_operation_type_t fill_type;
plot_operation_type_t fill_type;
colour fill_colour;
} plot_style_t;

View File

@ -70,7 +70,6 @@ static bool html_redraw_border_plot(int i, int *p, colour c,
css_border_style style, int thickness);
static colour html_redraw_darker(colour c);
static colour html_redraw_lighter(colour c);
static colour html_redraw_blend(colour c0, colour c1);
static bool html_redraw_checkbox(int x, int y, int width, int height,
bool selected);
static bool html_redraw_radio(int x, int y, int width, int height,
@ -1252,22 +1251,6 @@ colour html_redraw_lighter(colour c)
}
/**
* Blend two colours.
*
* \param c0 colour
* \param c1 colour
* \return a blended colour, half way between c0 and c1
*/
colour html_redraw_blend(colour c0, colour c1)
{
return ((((c0 >> 16) + (c1 >> 16)) / 2) << 16) |
(((((c0 >> 8) & 0xff) + ((c1 >> 8) & 0xff)) / 2) << 8) |
((((c0 & 0xff) + (c1 & 0xff)) / 2) << 0);
}
/**
* Plot a checkbox.
*
@ -1286,11 +1269,14 @@ bool html_redraw_checkbox(int x, int y, int width, int height,
if (z == 0)
z = 1;
if (!(plot.rectangle(x, y, x + width, y + height, plot_style_fill_wbasec) &&
if (!(plot.rectangle(x, y, x + width, y + height,
plot_style_fill_wbasec) &&
plot.line(x, y, x + width, y, plot_style_stroke_darkwbasec) &&
plot.line(x, y, x, y + height, plot_style_stroke_darkwbasec) &&
plot.line(x + width, y, x + width, y + height, plot_style_stroke_lightwbasec) &&
plot.line(x, y + height, x + width, y + height, plot_style_stroke_lightwbasec)))
plot.line(x + width, y, x + width, y + height,
plot_style_stroke_lightwbasec) &&
plot.line(x, y + height, x + width, y + height,
plot_style_stroke_lightwbasec)))
return false;
if (selected) {
@ -1813,8 +1799,7 @@ bool html_redraw_text_decoration(struct box *box,
if (html_redraw_printing)
colour = box->style->color;
else
colour = html_redraw_blend(background_colour,
box->style->color);
colour = blend_colour(background_colour, box->style->color);
if (box->type == BOX_INLINE) {
if (!box->inline_end)
@ -1919,7 +1904,8 @@ bool html_redraw_text_decoration_block(struct box *box, int x, int y,
}
static inline bool
html_redraw_scrollbar_rectangle(int x0, int y0, int x1, int y1, colour c, bool inset)
html_redraw_scrollbar_rectangle(int x0, int y0, int x1, int y1, colour c,
bool inset)
{
static plot_style_t c0 = {
.stroke_type = PLOT_OP_TYPE_SOLID,
@ -1943,8 +1929,7 @@ html_redraw_scrollbar_rectangle(int x0, int y0, int x1, int y1, colour c, bool i
c0.stroke_colour = lighten_colour(c);
c1.stroke_colour = darken_colour(c);
}
c2.stroke_colour = html_redraw_blend(c0.stroke_colour,
c1.stroke_colour);
c2.stroke_colour = blend_colour(c0.stroke_colour, c1.stroke_colour);
if (!plot.line(x0, y0, x1, y0, &c0)) return false;
if (!plot.line(x1, y0, x1, y1 + 1, &c1)) return false;