[gthumb] cairo metadata: use a flag to check whether a value is valid
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] cairo metadata: use a flag to check whether a value is valid
- Date: Fri, 6 Feb 2015 09:58:52 +0000 (UTC)
commit 3a8d835bb74c5c24a26e5f3601a3e164d17010ac
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Feb 5 19:24:53 2015 +0100
cairo metadata: use a flag to check whether a value is valid
extensions/cairo_io/cairo-image-surface-jpeg.c | 5 +-
extensions/cairo_io/cairo-image-surface-png.c | 5 +-
extensions/cairo_io/cairo-image-surface-tiff.c | 5 +-
extensions/cairo_io/cairo-image-surface-webp.c | 2 +-
gthumb/cairo-scale.c | 6 +--
gthumb/cairo-utils.c | 66 ++++++++++++++++++++++--
gthumb/cairo-utils.h | 19 +++++++
gthumb/pixbuf-io.c | 5 +-
8 files changed, 92 insertions(+), 21 deletions(-)
---
diff --git a/extensions/cairo_io/cairo-image-surface-jpeg.c b/extensions/cairo_io/cairo-image-surface-jpeg.c
index a6d6630..6ea9ef8 100644
--- a/extensions/cairo_io/cairo-image-surface-jpeg.c
+++ b/extensions/cairo_io/cairo-image-surface-jpeg.c
@@ -283,7 +283,7 @@ _cairo_image_surface_create_from_jpeg (GInputStream *istream,
}
metadata = _cairo_image_surface_get_metadata (surface);
- metadata->has_alpha = FALSE;
+ _cairo_metadata_set_has_alpha (metadata, FALSE);
surface_data = _cairo_image_surface_flush_and_get_data (surface);
surface_row = surface_data + line_start;
@@ -554,8 +554,7 @@ _cairo_image_surface_create_from_jpeg (GInputStream *istream,
original_height = srcinfo.image_height;
}
- metadata->original_width = original_width;
- metadata->original_height = original_height;
+ _cairo_metadata_set_original_size (metadata, original_width, original_height);
if (original_width_p != NULL)
*original_width_p = original_width;
diff --git a/extensions/cairo_io/cairo-image-surface-png.c b/extensions/cairo_io/cairo-image-surface-png.c
index 2df3efd..038e092 100644
--- a/extensions/cairo_io/cairo-image-surface-png.c
+++ b/extensions/cairo_io/cairo-image-surface-png.c
@@ -204,9 +204,8 @@ _cairo_image_surface_create_from_png (GInputStream *istream,
}
metadata = _cairo_image_surface_get_metadata (cairo_png_data->surface);
- metadata->has_alpha = (color_type & PNG_COLOR_MASK_ALPHA);
- metadata->original_width = width;
- metadata->original_height = height;
+ _cairo_metadata_set_has_alpha (metadata, (color_type & PNG_COLOR_MASK_ALPHA));
+ _cairo_metadata_set_original_size (metadata, width, height);
/* Set the data transformations */
diff --git a/extensions/cairo_io/cairo-image-surface-tiff.c b/extensions/cairo_io/cairo-image-surface-tiff.c
index d61f6b9..2ffbfef 100644
--- a/extensions/cairo_io/cairo-image-surface-tiff.c
+++ b/extensions/cairo_io/cairo-image-surface-tiff.c
@@ -250,9 +250,8 @@ _cairo_image_surface_create_from_tiff (GInputStream *istream,
}
metadata = _cairo_image_surface_get_metadata (surface);
- metadata->has_alpha = (extrasamples == 1) || (spp == 4);
- metadata->original_width = max_width;
- metadata->original_width = max_height;
+ _cairo_metadata_set_has_alpha (metadata, (extrasamples == 1) || (spp == 4));
+ _cairo_metadata_set_original_size (metadata, max_width, max_height);
raster = (uint32*) _TIFFmalloc (image_width * image_height * sizeof (uint32));
if (raster == NULL) {
diff --git a/extensions/cairo_io/cairo-image-surface-webp.c b/extensions/cairo_io/cairo-image-surface-webp.c
index cfa6e80..b4a4d93 100644
--- a/extensions/cairo_io/cairo-image-surface-webp.c
+++ b/extensions/cairo_io/cairo-image-surface-webp.c
@@ -81,7 +81,7 @@ _cairo_image_surface_create_from_webp (GInputStream *istream,
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
metadata = _cairo_image_surface_get_metadata (surface);
- metadata->has_alpha = (config.input.has_alpha);
+ _cairo_metadata_set_has_alpha (metadata, config.input.has_alpha);
config.options.no_fancy_upsampling = 1;
diff --git a/gthumb/cairo-scale.c b/gthumb/cairo-scale.c
index e663864..5b5015e 100644
--- a/gthumb/cairo-scale.c
+++ b/gthumb/cairo-scale.c
@@ -533,10 +533,8 @@ _cairo_image_surface_scale (cairo_surface_t *image,
scaled_height);
_cairo_image_surface_copy_metadata (image, scaled);
metadata = _cairo_image_surface_get_metadata (scaled);
- if (metadata->original_width <= 0) {
- metadata->original_width = src_width;
- metadata->original_height = src_height;
- }
+ if (metadata->original_width <= 0)
+ _cairo_metadata_set_original_size (metadata, src_width, src_height);
if (scaled == NULL)
return NULL;
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index 304b336..2393264 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -100,6 +100,37 @@ _gdk_rgba_to_cairo_color_255 (GdkRGBA *g_color,
void
+_cairo_metadata_set_has_alpha (cairo_surface_metadata_t *metadata,
+ gboolean has_alpha)
+{
+ metadata->valid_data |= _CAIRO_METADATA_FLAG_HAS_ALPHA;
+ metadata->has_alpha = has_alpha;
+}
+
+
+void
+_cairo_metadata_set_original_size (cairo_surface_metadata_t *metadata,
+ int width,
+ int height)
+{
+ metadata->valid_data |= _CAIRO_METADATA_FLAG_ORIGINAL_SIZE;
+ metadata->original_width = width;
+ metadata->original_height = height;
+}
+
+
+void
+_cairo_metadata_set_thumbnail_size (cairo_surface_metadata_t *metadata,
+ int width,
+ int height)
+{
+ metadata->valid_data |= _CAIRO_METADATA_FLAG_THUMBNAIL_SIZE;
+ metadata->thumbnail.image_width = width;
+ metadata->thumbnail.image_height = height;
+}
+
+
+void
_cairo_clear_surface (cairo_surface_t **surface)
{
if (surface == NULL)
@@ -123,6 +154,7 @@ _cairo_image_surface_flush_and_get_data (cairo_surface_t *surface)
static void
_cairo_surface_metadata_init (cairo_surface_metadata_t *metadata)
{
+ metadata->valid_data = _CAIRO_METADATA_FLAG_NONE;
metadata->has_alpha = FALSE;
metadata->original_width = 0;
metadata->original_height = 0;
@@ -157,6 +189,7 @@ _cairo_image_surface_copy_metadata (cairo_surface_t *src,
src_metadata = _cairo_image_surface_get_metadata (src);
dest_metadata = _cairo_image_surface_get_metadata (dest);
+ dest_metadata->valid_data = src_metadata->valid_data;
dest_metadata->has_alpha = src_metadata->has_alpha;
dest_metadata->original_width = src_metadata->original_width;
dest_metadata->original_height = src_metadata->original_height;
@@ -180,15 +213,40 @@ gboolean
_cairo_image_surface_get_has_alpha (cairo_surface_t *surface)
{
cairo_surface_metadata_t *metadata;
+ int width;
+ int height;
+ int row_stride;
+ guchar *row;
+ int h, w;
if (surface == NULL)
return FALSE;
metadata = cairo_surface_get_user_data (surface, &surface_metadata_key);
- if (metadata != NULL)
+ if ((metadata != NULL) && (metadata->valid_data & _CAIRO_METADATA_FLAG_HAS_ALPHA))
return metadata->has_alpha;
- return cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32;
+ if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_ARGB32)
+ return FALSE;
+
+ /* search an alpha value lower than 255 */
+
+ width = cairo_image_surface_get_width (surface);
+ height = cairo_image_surface_get_height (surface);
+ row_stride = cairo_image_surface_get_stride (surface);
+ row = _cairo_image_surface_flush_and_get_data (surface);
+
+ for (h = 0; h < height; h++) {
+ guchar *pixel = row;
+ for (w = 0; w < width; w++) {
+ if (pixel[CAIRO_ALPHA] < 255)
+ return TRUE;
+ pixel += 4;
+ }
+ row += row_stride;
+ }
+
+ return FALSE;
}
@@ -206,7 +264,7 @@ _cairo_image_surface_get_original_size (cairo_surface_t *surface,
if (metadata == NULL)
return FALSE;
- if ((metadata->original_width <= 0) || (metadata->original_height <= 0))
+ if ((metadata->valid_data & _CAIRO_METADATA_FLAG_ORIGINAL_SIZE) == 0)
return FALSE;
if (original_width)
@@ -339,7 +397,7 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
s_pixels = _cairo_image_surface_flush_and_get_data (surface);
metadata = _cairo_image_surface_get_metadata (surface);
- metadata->has_alpha = (p_n_channels == 4);
+ _cairo_metadata_set_has_alpha (metadata, (p_n_channels == 4));
if (p_n_channels == 4) {
guchar *s_iter;
diff --git a/gthumb/cairo-utils.h b/gthumb/cairo-utils.h
index 84ca643..85efc31 100644
--- a/gthumb/cairo-utils.h
+++ b/gthumb/cairo-utils.h
@@ -135,7 +135,15 @@ typedef struct {
int image_height;
} thumbnail_metadata_t;
+typedef enum {
+ _CAIRO_METADATA_FLAG_NONE = 0,
+ _CAIRO_METADATA_FLAG_HAS_ALPHA = 1 << 0,
+ _CAIRO_METADATA_FLAG_ORIGINAL_SIZE = 1 << 1,
+ _CAIRO_METADATA_FLAG_THUMBNAIL_SIZE = 1 << 2
+} cairo_metadata_flags_t;
+
typedef struct {
+ cairo_metadata_flags_t valid_data;
gboolean has_alpha;
int original_width;
int original_height;
@@ -161,6 +169,17 @@ void _gdk_color_to_cairo_color_255 (GdkColor
void _gdk_rgba_to_cairo_color_255 (GdkRGBA *g_color,
cairo_color_255_t *c_color);
+/* metadata */
+
+void _cairo_metadata_set_has_alpha (cairo_surface_metadata_t *metadata,
+ gboolean has_alpha);
+void _cairo_metadata_set_original_size (cairo_surface_metadata_t *metadata,
+ int width,
+ int height);
+void _cairo_metadata_set_thumbnail_size (cairo_surface_metadata_t *metadata,
+ int width,
+ int height);
+
/* surface */
void _cairo_clear_surface (cairo_surface_t **surface);
diff --git a/gthumb/pixbuf-io.c b/gthumb/pixbuf-io.c
index d028700..5573461 100644
--- a/gthumb/pixbuf-io.c
+++ b/gthumb/pixbuf-io.c
@@ -214,9 +214,8 @@ gth_pixbuf_new_from_file (GInputStream *istream,
surface = _cairo_image_surface_create_from_pixbuf (pixbuf);
metadata = _cairo_image_surface_get_metadata (surface);
- metadata->original_width = scale_data.original_width;
- metadata->original_height = scale_data.original_height;
- metadata->has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
+ _cairo_metadata_set_has_alpha (metadata, gdk_pixbuf_get_has_alpha (pixbuf));
+ _cairo_metadata_set_original_size (metadata, scale_data.original_width,
scale_data.original_height);
gth_image_set_cairo_surface (image, surface);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]