[gthumb/gthumb-3-2] jpeg loader: fixed possible multithread problem
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb/gthumb-3-2] jpeg loader: fixed possible multithread problem
- Date: Fri, 28 Jun 2013 15:56:28 +0000 (UTC)
commit 3686fef47ae4ad634f3e1bfea9eba3301993356d
Author: Paolo Bacchilega <paobac src gnome org>
Date: Fri Jun 28 16:03:05 2013 +0200
jpeg loader: fixed possible multithread problem
initialize the tables inside a mutex lock
extensions/cairo_io/cairo-image-surface-jpeg.c | 13 +++++++++++--
gthumb/cairo-scale.c | 8 ++++----
2 files changed, 15 insertions(+), 6 deletions(-)
---
diff --git a/extensions/cairo_io/cairo-image-surface-jpeg.c b/extensions/cairo_io/cairo-image-surface-jpeg.c
index 66f12d3..84413bf 100644
--- a/extensions/cairo_io/cairo-image-surface-jpeg.c
+++ b/extensions/cairo_io/cairo-image-surface-jpeg.c
@@ -85,6 +85,7 @@ static int *YCbCr_R_Cr_Tab = NULL;
static int *YCbCr_G_Cb_Tab = NULL;
static int *YCbCr_G_Cr_Tab = NULL;
static int *YCbCr_B_Cb_Tab = NULL;
+static GStaticMutex Tables_Mutex = G_STATIC_MUTEX_INIT;
#define SCALE_FACTOR 16
@@ -96,6 +97,8 @@ static int *YCbCr_B_Cb_Tab = NULL;
static void
CMYK_table_init (void)
{
+ g_static_mutex_lock (&Tables_Mutex);
+
if (CMYK_Tab == NULL) {
int v, k, i;
double k1;
@@ -110,12 +113,16 @@ CMYK_table_init (void)
CMYK_Tab[i++] = (double) v * k1;
}
}
+
+ g_static_mutex_unlock (&Tables_Mutex);
}
static void
YCbCr_tables_init (void)
{
+ g_static_mutex_lock (&Tables_Mutex);
+
if (YCbCr_R_Cr_Tab == NULL) {
int i, v;
@@ -125,12 +132,14 @@ YCbCr_tables_init (void)
YCbCr_B_Cb_Tab = g_new (int, 256);
for (i = 0, v = -128; i <= 255; i++, v++) {
- YCbCr_R_Cr_Tab[i] = SCALE_DOWN (SCALE_UP(1.402) * v + ONE_HALF);
+ YCbCr_R_Cr_Tab[i] = SCALE_DOWN (SCALE_UP (1.402) * v + ONE_HALF);
YCbCr_G_Cb_Tab[i] = - SCALE_UP (0.34414) * v;
YCbCr_G_Cr_Tab[i] = - SCALE_UP (0.71414) * v + ONE_HALF;
- YCbCr_B_Cb_Tab[i] = SCALE_DOWN (SCALE_UP(1.77200) * v + ONE_HALF);
+ YCbCr_B_Cb_Tab[i] = SCALE_DOWN (SCALE_UP (1.77200) * v + ONE_HALF);
}
}
+
+ g_static_mutex_unlock (&Tables_Mutex);
}
diff --git a/gthumb/cairo-scale.c b/gthumb/cairo-scale.c
index f47a089..0e0ff9f 100644
--- a/gthumb/cairo-scale.c
+++ b/gthumb/cairo-scale.c
@@ -341,10 +341,10 @@ horizontal_scale_transpose (cairo_surface_t *image,
p_src_pixel += 4;
}
- r = GFIXED_TO_INT (r);
- g = GFIXED_TO_INT (g);
- b = GFIXED_TO_INT (b);
- a = GFIXED_TO_INT (a);
+ r = GFIXED_ROUND_TO_INT (r);
+ g = GFIXED_ROUND_TO_INT (g);
+ b = GFIXED_ROUND_TO_INT (b);
+ a = GFIXED_ROUND_TO_INT (a);
p_dest_pixel[CAIRO_RED] = CLAMP_PIXEL (r);
p_dest_pixel[CAIRO_GREEN] = CLAMP_PIXEL (g);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]