[gthumb/gthumb-3-2] jpeg loader: fixed possible multithread problem



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]