X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=images%2Fio-libmagick.c;h=543f3f8effc5b5787c5b6383deb3c8fb88f68533;hb=3efe6ce0837b7689943561fb4b5a4a0ba6943b4c;hp=d75f0a8938e7168856a5a73721ba507cf404a696;hpb=cc158370cbaee83cafb5965f20dc2df848a4faef;p=libucw.git diff --git a/images/io-libmagick.c b/images/io-libmagick.c index d75f0a89..543f3f8e 100644 --- a/images/io-libmagick.c +++ b/images/io-libmagick.c @@ -15,17 +15,21 @@ #include "images/images.h" #include "images/color.h" #include "images/io-main.h" + #include #include #include #include +#include #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;