[gthumb: 18/129] reorganized some code
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb: 18/129] reorganized some code
- Date: Wed, 27 Apr 2011 20:51:53 +0000 (UTC)
commit fb9969d2b52e5fc6bc9277e01e3be985c3903ca2
Author: Paolo Bacchilega <paobac src gnome org>
Date: Fri Apr 15 16:13:11 2011 +0200
reorganized some code
gthumb/cairo-utils.c | 72 +-----------------------------
gthumb/cairo-utils.h | 115 +++++++++++++++++++++++++++---------------------
gthumb/gth-histogram.c | 7 ++-
gthumb/pixbuf-utils.c | 6 +-
4 files changed, 76 insertions(+), 124 deletions(-)
---
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index 2ff4f1f..79bd2fb 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -63,65 +63,6 @@ _gdk_color_to_cairo_color_255 (GdkColor *g_color,
void
-_cairo_paint_full_gradient (cairo_surface_t *surface,
- GdkColor *h_color1,
- GdkColor *h_color2,
- GdkColor *v_color1,
- GdkColor *v_color2)
-{
- cairo_color_255_t hcolor1;
- cairo_color_255_t hcolor2;
- cairo_color_255_t vcolor1;
- cairo_color_255_t vcolor2;
- int width;
- int height;
- int s_stride;
- unsigned char *s_pixels;
- int h, w;
- double x, y;
- double x_y, x_1_y, y_1_x, _1_x_1_y;
- guchar red, green, blue;
-
- if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
- return;
-
- _gdk_color_to_cairo_color_255 (h_color1, &hcolor1);
- _gdk_color_to_cairo_color_255 (h_color2, &hcolor2);
- _gdk_color_to_cairo_color_255 (v_color1, &vcolor1);
- _gdk_color_to_cairo_color_255 (v_color2, &vcolor2);
-
- width = cairo_image_surface_get_width (surface);
- height = cairo_image_surface_get_height (surface);
- s_stride = cairo_image_surface_get_stride (surface);
- s_pixels = cairo_image_surface_get_data (surface);
-
- for (h = 0; h < height; h++) {
- guchar *s_iter = s_pixels;
-
- x = (double) (height - h) / height;
-
- for (w = 0; w < width; w++) {
- y = (double) (width - w) / width;
- x_y = x * y;
- x_1_y = x * (1.0 - y);
- y_1_x = y * (1.0 - x);
- _1_x_1_y = (1.0 - x) * (1.0 - y);
-
- red = hcolor1.r * x_y + hcolor2.r * x_1_y + vcolor1.r * y_1_x + vcolor2.r * _1_x_1_y;
- green = hcolor1.g * x_y + hcolor2.g * x_1_y + vcolor1.g * y_1_x + vcolor2.g * _1_x_1_y;
- blue = hcolor1.b * x_y + hcolor2.b * x_1_y + vcolor1.b * y_1_x + vcolor2.b * _1_x_1_y;
-
- CAIRO_SET_RGBA (s_iter, red, green, blue, 0xff);
-
- s_iter += 4;
- }
-
- s_pixels += s_stride;
- }
-}
-
-
-void
_cairo_clear_surface (cairo_surface_t **surface)
{
cairo_surface_destroy (*surface);
@@ -180,21 +121,13 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
if (p_n_channels == 4) {
guchar *s_iter;
guchar *p_iter;
- double alpha_factor;
- guchar red, green, blue, alpha;
for (h = 0; h < height; h++) {
s_iter = s_pixels;
p_iter = p_pixels;
for (w = 0; w < width; w++) {
- alpha = p_iter[3];
- alpha_factor = (double) alpha / 255.0;
- red = (guchar) (alpha_factor * p_iter[0]) ;
- green = (guchar) (alpha_factor * p_iter[1]);
- blue = (guchar) (alpha_factor * p_iter[2]);
-
- CAIRO_SET_RGBA (s_iter, red, green, blue, alpha);
+ CAIRO_SET_RGBA (s_iter, p_iter[0], p_iter[1], p_iter[2], p_iter[3]);
s_iter += 4;
p_iter += p_n_channels;
@@ -213,7 +146,8 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
p_iter = p_pixels;
for (w = 0; w < width; w++) {
- CAIRO_SET_RGBA (s_iter, p_iter[0], p_iter[1], p_iter[2], 0xff);
+ CAIRO_SET_RGB (s_iter, p_iter[0], p_iter[1], p_iter[2]);
+
s_iter += 4;
p_iter += p_n_channels;
}
diff --git a/gthumb/cairo-utils.h b/gthumb/cairo-utils.h
index 38b6bc4..8e8b551 100644
--- a/gthumb/cairo-utils.h
+++ b/gthumb/cairo-utils.h
@@ -53,24 +53,26 @@
#define CAIRO_SET_RGB(pixel, red, green, blue) \
do { \
- pixel[CAIRO_RED] = (red); \
+ pixel[CAIRO_RED] = (red); \
pixel[CAIRO_GREEN] = (green); \
- pixel[CAIRO_BLUE] = (blue); \
+ pixel[CAIRO_BLUE] = (blue); \
+ pixel[CAIRO_ALPHA] = 0xff; \
} while (0)
#define CAIRO_SET_RGBA(pixel, red, green, blue, alpha) \
do { \
- pixel[CAIRO_RED] = (red); \
- pixel[CAIRO_GREEN] = (green); \
- pixel[CAIRO_BLUE] = (blue); \
+ gdouble alpha_factor = (gdouble) alpha / 0xff; \
+ pixel[CAIRO_RED] = (guchar) (alpha_factor * (red) + .5); \
+ pixel[CAIRO_GREEN] = (guchar) (alpha_factor * (green) + .5); \
+ pixel[CAIRO_BLUE] = (guchar) (alpha_factor * (blue) + .5); \
pixel[CAIRO_ALPHA] = (alpha); \
} while (0)
#define CAIRO_GET_RGB(pixel, red, green, blue) \
do { \
- red = pixel[CAIRO_RED]; \
+ red = pixel[CAIRO_RED]; \
green = pixel[CAIRO_GREEN]; \
- blue = pixel[CAIRO_BLUE]; \
+ blue = pixel[CAIRO_BLUE]; \
} while (0)
#define CAIRO_GET_RGBA(pixel, red, green, blue, alpha) \
@@ -79,11 +81,13 @@
\
alpha = pixel[CAIRO_ALPHA]; \
alpha_factor = (gdouble) 0xff / alpha; \
- red = (guchar) (pixel[CAIRO_RED] * alpha_factor + .5); \
+ red = (guchar) (pixel[CAIRO_RED] * alpha_factor + .5); \
green = (guchar) (pixel[CAIRO_GREEN] * alpha_factor + .5); \
- blue = (guchar) (pixel[CAIRO_BLUE] * alpha_factor + .5); \
+ blue = (guchar) (pixel[CAIRO_BLUE] * alpha_factor + .5); \
} while (0)
+/* types */
+
typedef struct {
double r;
double g;
@@ -98,46 +102,57 @@ typedef struct {
guchar a;
} cairo_color_255_t;
-void _gdk_color_to_cairo_color (GdkColor *g_color,
- cairo_color_t *c_color);
-void _gdk_color_to_cairo_color_255 (GdkColor *g_color,
- cairo_color_255_t *c_color);
-void _cairo_paint_full_gradient (cairo_surface_t *surface,
- GdkColor *h_color1,
- GdkColor *h_color2,
- GdkColor *v_color1,
- GdkColor *v_color2);
-void _cairo_clear_surface (cairo_surface_t **surface);
-gboolean _cairo_image_surface_get_has_alpha (cairo_surface_t *surface);
-cairo_surface_t *
- _cairo_image_surface_create_from_pixbuf
- (GdkPixbuf *pixbuf);
-void _cairo_draw_rounded_box (cairo_t *cr,
- double x,
- double y,
- double w,
- double h,
- double r);
-void _cairo_draw_drop_shadow (cairo_t *cr,
- double x,
- double y,
- double w,
- double h,
- double r);
-void _cairo_draw_frame (cairo_t *cr,
- double x,
- double y,
- double w,
- double h,
- double r);
-void _cairo_draw_slide (cairo_t *cr,
- double frame_x,
- double frame_y,
- double frame_width,
- double frame_height,
- double image_width,
- double image_height,
- GdkColor *frame_color,
- gboolean draw_inner_border);
+/* colors */
+
+void _gdk_color_to_cairo_color (GdkColor *g_color,
+ cairo_color_t *c_color);
+void _gdk_color_to_cairo_color_255 (GdkColor *g_color,
+ cairo_color_255_t *c_color);
+
+
+/* surface */
+
+void _cairo_clear_surface (cairo_surface_t **surface);
+gboolean _cairo_image_surface_get_has_alpha (cairo_surface_t *surface);
+cairo_surface_t * _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf);
+cairo_surface_t * _cairo_image_surface_scale_to (cairo_surface_t *surface,
+ int width,
+ int height,
+ cairo_filter_t filter);
+
+/* paint / draw */
+
+void _cairo_paint_full_gradient (cairo_surface_t *surface,
+ GdkColor *h_color1,
+ GdkColor *h_color2,
+ GdkColor *v_color1,
+ GdkColor *v_color2);
+void _cairo_draw_rounded_box (cairo_t *cr,
+ double x,
+ double y,
+ double w,
+ double h,
+ double r);
+void _cairo_draw_drop_shadow (cairo_t *cr,
+ double x,
+ double y,
+ double w,
+ double h,
+ double r);
+void _cairo_draw_frame (cairo_t *cr,
+ double x,
+ double y,
+ double w,
+ double h,
+ double r);
+void _cairo_draw_slide (cairo_t *cr,
+ double frame_x,
+ double frame_y,
+ double frame_width,
+ double frame_height,
+ double image_width,
+ double image_height,
+ GdkColor *frame_color,
+ gboolean draw_inner_border);
#endif /* CAIRO_UTILS_H */
diff --git a/gthumb/gth-histogram.c b/gthumb/gth-histogram.c
index 55f5387..c107d6c 100644
--- a/gthumb/gth-histogram.c
+++ b/gthumb/gth-histogram.c
@@ -256,11 +256,12 @@ gth_histogram_calculate_for_image (GthHistogram *self,
for (j = 0; j < width; j++) {
if (has_alpha)
- CAIRO_GET_RGBA(pixel, red, green, blue, alpha);
+ CAIRO_GET_RGBA (pixel, red, green, blue, alpha);
else
- CAIRO_GET_RGB(pixel, red, green, blue);
+ CAIRO_GET_RGB (pixel, red, green, blue);
/* count values for each RGB channel */
+
values[1][red] += 1;
values[2][green] += 1;
values[3][blue] += 1;
@@ -268,10 +269,12 @@ gth_histogram_calculate_for_image (GthHistogram *self,
values[4][alpha] += 1;
/* count value for Value channel */
+
max = MAX (MAX (red, green), blue);
values[0][max] += 1;
/* track max value for each channel */
+
values_max[0] = MAX (values_max[0], values[0][max]);
values_max[1] = MAX (values_max[1], values[1][red]);
values_max[2] = MAX (values_max[2], values[2][green]);
diff --git a/gthumb/pixbuf-utils.c b/gthumb/pixbuf-utils.c
index 13083b0..f3f774b 100644
--- a/gthumb/pixbuf-utils.c
+++ b/gthumb/pixbuf-utils.c
@@ -101,9 +101,9 @@ _gdk_pixbuf_new_from_cairo_surface (cairo_surface_t *surface)
for (i = 0; i < width; i++) {
gdouble alpha_factor = (gdouble) 0xff / s_iter[CAIRO_ALPHA];
- p_iter[0] = (guchar) (s_iter[CAIRO_RED] * alpha_factor + .5);
- p_iter[1] = (guchar) (s_iter[CAIRO_GREEN] * alpha_factor + .5);
- p_iter[2] = (guchar) (s_iter[CAIRO_BLUE] * alpha_factor + .5);
+ p_iter[0] = (guchar) (alpha_factor * s_iter[CAIRO_RED] + .5);
+ p_iter[1] = (guchar) (alpha_factor * s_iter[CAIRO_GREEN] + .5);
+ p_iter[2] = (guchar) (alpha_factor * s_iter[CAIRO_BLUE] + .5);
if (p_n_channels == 4)
p_iter[3] = s_iter[CAIRO_ALPHA];
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]