diff options
Diffstat (limited to 'test/test.c')
-rw-r--r-- | test/test.c | 259 |
1 files changed, 48 insertions, 211 deletions
diff --git a/test/test.c b/test/test.c index ad1ba0be8..c32b84313 100644 --- a/test/test.c +++ b/test/test.c @@ -212,217 +212,6 @@ test_label_new (const char *text, return label; } -static void -rgba_run_alpha (art_u8 *buf, art_u8 r, art_u8 g, art_u8 b, int alpha, int n) -{ - int i; - int v; - - for (i = 0; i < n; i++) - { - v = *buf; - *buf++ = v + (((r - v) * alpha + 0x80) >> 8); - v = *buf; - *buf++ = v + (((g - v) * alpha + 0x80) >> 8); - v = *buf; - *buf++ = v + (((b - v) * alpha + 0x80) >> 8); - - *buf++ = 255; - } -} - -typedef void (*FillRunCallback) (art_u8 *buf, art_u8 r, art_u8 g, art_u8 b, int alpha, int n); - -/* This function is totally broken. - * Amongst other interesting things it will write outside - * the pixbufs pixels. - */ -static void -pixbuf_draw_rectangle (GdkPixbuf *pixbuf, - const ArtIRect *rectangle, - guint32 color, - gboolean filled) -{ - guchar r; - guchar g; - guchar b; - guchar opacity; - - guint width; - guint height; - guchar *pixels; - guint rowstride; - int y; - gboolean has_alpha; - guint pixel_offset; - guchar *offset; - - guint rect_width; - guint rect_height; - - ArtIRect draw_area; - - FillRunCallback fill_run_callback; - - g_return_if_fail (pixbuf != NULL); - - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - pixels = gdk_pixbuf_get_pixels (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - has_alpha = gdk_pixbuf_get_has_alpha (pixbuf); - pixel_offset = has_alpha ? 4 : 3; - - r = NAUTILUS_RGBA_COLOR_GET_R (color); - g = NAUTILUS_RGBA_COLOR_GET_G (color); - b = NAUTILUS_RGBA_COLOR_GET_B (color); - opacity = NAUTILUS_RGBA_COLOR_GET_A (color); - - fill_run_callback = has_alpha ? rgba_run_alpha : art_rgb_run_alpha; - - if (rectangle != NULL) { - g_return_if_fail (rectangle->x1 > rectangle->x0); - g_return_if_fail (rectangle->y1 > rectangle->y0); - - rect_width = rectangle->x1 - rectangle->x0; - rect_height = rectangle->y1 - rectangle->y0; - - draw_area = *rectangle; - } - else { - rect_width = width; - rect_height = height; - - draw_area.x0 = 0; - draw_area.y0 = 0; - draw_area.x1 = width; - draw_area.y1 = height; - } - - if (filled) { - offset = pixels + (draw_area.y0 * rowstride) + (draw_area.x0 * pixel_offset); - - for (y = draw_area.y0; y < draw_area.y1; y++) { - (* fill_run_callback) (offset, r, g, b, opacity, rect_width); - offset += rowstride; - } - } - else { - /* top */ - offset = pixels + (draw_area.y0 * rowstride) + (draw_area.x0 * pixel_offset); - (* fill_run_callback) (offset, r, g, b, opacity, rect_width); - - /* bottom */ - offset += ((rect_height - 1) * rowstride); - (* fill_run_callback) (offset, r, g, b, opacity, rect_width); - - for (y = draw_area.y0 + 1; y < (draw_area.y1 - 1); y++) { - /* left */ - offset = pixels + (y * rowstride) + (draw_area.x0 * pixel_offset); - (* fill_run_callback) (offset, r, g, b, opacity, 1); - - /* right */ - offset += (rect_width - 1) * pixel_offset; - (* fill_run_callback) (offset, r, g, b, opacity, 1); - } - } -} - -void -test_pixbuf_draw_rectangle (GdkPixbuf *pixbuf, - int x0, - int y0, - int x1, - int y1, - int inset, - gboolean filled, - guint32 color, - int opacity) -{ - - g_return_if_fail (nautilus_gdk_pixbuf_is_valid (pixbuf)); - g_return_if_fail (opacity > NAUTILUS_OPACITY_FULLY_TRANSPARENT); - g_return_if_fail (opacity <= NAUTILUS_OPACITY_FULLY_OPAQUE); - - color = NAUTILUS_RGBA_COLOR_PACK (NAUTILUS_RGBA_COLOR_GET_R (color), - NAUTILUS_RGBA_COLOR_GET_G (color), - NAUTILUS_RGBA_COLOR_GET_B (color), - opacity); - - if (x0 == -1 && y0 == -1 && x1 == -1 && y1 == -1) { - pixbuf_draw_rectangle (pixbuf, NULL, color, filled); - } else { - ArtIRect rect; - - g_return_if_fail (x0 >= 0); - g_return_if_fail (y0 >= 0); - g_return_if_fail (x1 > x0); - g_return_if_fail (y1 > y0); - - rect.x0 = x0; - rect.y0 = y0; - rect.x1 = x1; - rect.y1 = y1; - - rect.x0 += inset; - rect.y0 += inset; - rect.x1 -= inset; - rect.y1 -= inset; - - g_return_if_fail (!art_irect_empty (&rect)); - - pixbuf_draw_rectangle (pixbuf, &rect, color, filled); - } -} - -void -test_pixbuf_draw_rectangle_tiled (GdkPixbuf *pixbuf, - const char *tile_name, - int x0, - int y0, - int x1, - int y1, - int opacity) -{ - ArtIRect area; - GdkPixbuf *tile_pixbuf; - - g_return_if_fail (nautilus_gdk_pixbuf_is_valid (pixbuf)); - g_return_if_fail (tile_name != NULL); - g_return_if_fail (opacity > NAUTILUS_OPACITY_FULLY_TRANSPARENT); - g_return_if_fail (opacity <= NAUTILUS_OPACITY_FULLY_OPAQUE); - - tile_pixbuf = test_pixbuf_new_named (tile_name, 1.0); - - g_return_if_fail (tile_pixbuf != NULL); - - if (x0 == -1 && y0 == -1 && x1 == -1 && y1 == -1) { - area = nautilus_gdk_pixbuf_get_frame (pixbuf); - } else { - g_return_if_fail (x0 >= 0); - g_return_if_fail (y0 >= 0); - g_return_if_fail (x1 > x0); - g_return_if_fail (y1 > y0); - - area.x0 = x0; - area.y0 = y0; - area.x1 = x1; - area.y1 = y1; - } - - nautilus_gdk_pixbuf_draw_to_pixbuf_tiled (tile_pixbuf, - pixbuf, - &area, - gdk_pixbuf_get_width (tile_pixbuf), - gdk_pixbuf_get_height (tile_pixbuf), - x0, - y0, - opacity, - GDK_INTERP_NEAREST); - - gdk_pixbuf_unref (tile_pixbuf); -} - /* Preferences hacks */ void test_text_caption_set_text_for_int_preferences (NautilusTextCaption *text_caption, @@ -521,3 +310,51 @@ test_window_set_title_with_pid (GtkWindow *window, gtk_window_set_title (GTK_WINDOW (window), tmp); g_free (tmp); } + +void +test_pixbuf_draw_rectangle_tiled (GdkPixbuf *pixbuf, + const char *tile_name, + int x0, + int y0, + int x1, + int y1, + int opacity) +{ + ArtIRect area; + GdkPixbuf *tile_pixbuf; + + g_return_if_fail (nautilus_gdk_pixbuf_is_valid (pixbuf)); + g_return_if_fail (tile_name != NULL); + g_return_if_fail (opacity > NAUTILUS_OPACITY_FULLY_TRANSPARENT); + g_return_if_fail (opacity <= NAUTILUS_OPACITY_FULLY_OPAQUE); + + tile_pixbuf = test_pixbuf_new_named (tile_name, 1.0); + + g_return_if_fail (tile_pixbuf != NULL); + + if (x0 == -1 && y0 == -1 && x1 == -1 && y1 == -1) { + area = nautilus_gdk_pixbuf_get_frame (pixbuf); + } else { + g_return_if_fail (x0 >= 0); + g_return_if_fail (y0 >= 0); + g_return_if_fail (x1 > x0); + g_return_if_fail (y1 > y0); + + area.x0 = x0; + area.y0 = y0; + area.x1 = x1; + area.y1 = y1; + } + + nautilus_gdk_pixbuf_draw_to_pixbuf_tiled (tile_pixbuf, + pixbuf, + &area, + gdk_pixbuf_get_width (tile_pixbuf), + gdk_pixbuf_get_height (tile_pixbuf), + x0, + y0, + opacity, + GDK_INTERP_NEAREST); + + gdk_pixbuf_unref (tile_pixbuf); +} |