]> mj.ucw.cz Git - libucw.git/blobdiff - images/io-libmagick.c
reverted invalid usage of GET*/PUT* macros
[libucw.git] / images / io-libmagick.c
index d75f0a8938e7168856a5a73721ba507cf404a696..543f3f8effc5b5787c5b6383deb3c8fb88f68533 100644 (file)
 #include "images/images.h"
 #include "images/color.h"
 #include "images/io-main.h"
+
 #include <sys/types.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <magick/api.h>
+#include <pthread.h>
 
 #define MAX_FILE_SIZE (1 << 30)
 #define QUANTUM_SCALE (QuantumDepth - 8)
 #define QUANTUM_TO_BYTE(x) ((uns)(x) >> QUANTUM_SCALE)
 #define BYTE_TO_QUANTUM(x) ((uns)(x) << QUANTUM_SCALE)
-#define OPACITY_MAX ((1 << QuantumDepth) - 1)
+#define ALPHA_TO_BYTE(x) (255 - QUANTUM_TO_BYTE(x))
+#define BYTE_TO_ALPHA(x) (BYTE_TO_QUANTUM(255 - (x)))
 
+static pthread_mutex_t libmagick_mutex = PTHREAD_MUTEX_INITIALIZER;
 static uns libmagick_counter;
 
 struct magick_read_data {
@@ -37,18 +41,20 @@ struct magick_read_data {
 int
 libmagick_init(struct image_io *io UNUSED)
 {
-  // FIXME: lock
+  pthread_mutex_lock(&libmagick_mutex);
   if (!libmagick_counter++)
     InitializeMagick(NULL);
+  pthread_mutex_unlock(&libmagick_mutex);
   return 1;
 }
 
 void
 libmagick_cleanup(struct image_io *io UNUSED)
 {
-  // FIXME: lock
+  pthread_mutex_lock(&libmagick_mutex);
   if (!--libmagick_counter)
     DestroyMagick();
+  pthread_mutex_unlock(&libmagick_mutex);
 }
 
 static void
@@ -204,7 +210,7 @@ libmagick_read_data(struct image_io *io)
 #       define IMAGE_WALK_COL_STEP 2
 #       define IMAGE_WALK_DO_STEP do{ \
          walk_pos[0] = libmagick_pixel_to_gray(src); \
-         walk_pos[1] = QUANTUM_TO_BYTE(src->opacity); \
+         walk_pos[1] = ALPHA_TO_BYTE(src->opacity); \
          src++; }while(0)
 #       include "images/image-walk.h"
        break;
@@ -233,7 +239,7 @@ libmagick_read_data(struct image_io *io)
          walk_pos[0] = QUANTUM_TO_BYTE(src->red); \
          walk_pos[1] = QUANTUM_TO_BYTE(src->green); \
          walk_pos[2] = QUANTUM_TO_BYTE(src->blue); \
-         walk_pos[3] = QUANTUM_TO_BYTE(src->opacity); \
+         walk_pos[3] = ALPHA_TO_BYTE(src->opacity); \
          src++; }while(0)
 #       include "images/image-walk.h"
        break;
@@ -320,7 +326,7 @@ libmagick_write(struct image_io *io)
          dest->red = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->green = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->blue = BYTE_TO_QUANTUM(walk_pos[0]); \
-         dest->opacity = OPACITY_MAX; \
+         dest->opacity = 0; \
          dest++; }while(0)
 #       include "images/image-walk.h"
        break;
@@ -335,7 +341,7 @@ libmagick_write(struct image_io *io)
          dest->red = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->green = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->blue = BYTE_TO_QUANTUM(walk_pos[0]); \
-         dest->opacity = BYTE_TO_QUANTUM(walk_pos[1]); \
+         dest->opacity = BYTE_TO_ALPHA(walk_pos[1]); \
          dest++; }while(0)
 #       include "images/image-walk.h"
        break;
@@ -350,7 +356,7 @@ libmagick_write(struct image_io *io)
          dest->red = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->green = BYTE_TO_QUANTUM(walk_pos[1]); \
          dest->blue = BYTE_TO_QUANTUM(walk_pos[2]); \
-         dest->opacity = OPACITY_MAX; \
+         dest->opacity = 0; \
          dest++; }while(0)
 #       include "images/image-walk.h"
        break;
@@ -365,7 +371,7 @@ libmagick_write(struct image_io *io)
          dest->red = BYTE_TO_QUANTUM(walk_pos[0]); \
          dest->green = BYTE_TO_QUANTUM(walk_pos[1]); \
          dest->blue = BYTE_TO_QUANTUM(walk_pos[2]); \
-         dest->opacity = BYTE_TO_QUANTUM(walk_pos[3]); \
+         dest->opacity = BYTE_TO_ALPHA(walk_pos[3]); \
          dest++; }while(0)
 #       include "images/image-walk.h"
        break;