X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=images%2Fio-main.c;h=c2975842c3e7076b2e4e8162250c865a39c4d660;hb=09e7fe5641b94148d998a1b620bf694f353cb17b;hp=0ed20129d6db1ec9fdc4681a0fd9ceb9729617d4;hpb=0a023d6e079bbfc4112347b6943bad80685e7265;p=libucw.git diff --git a/images/io-main.c b/images/io-main.c index 0ed20129..c2975842 100644 --- a/images/io-main.c +++ b/images/io-main.c @@ -9,18 +9,56 @@ #undef LOCAL_DEBUG -#include "lib/lib.h" +#include "ucw/lib.h" +#include "ucw/mempool.h" #include "images/images.h" +#include "images/error.h" #include "images/io-main.h" +#include "images/color.h" + #include -void -image_io_init(struct image_thread *it, struct image_io *io) +int +image_io_init(struct image_context *ctx, struct image_io *io) { DBG("image_io_init()"); bzero(io, sizeof(*io)); - io->thread = it; + io->context = ctx; +#ifdef CONFIG_IMAGES_LIBJPEG + if (!libjpeg_init(io)) + goto libjpeg_failed; +#endif +#ifdef CONFIG_IMAGES_LIBPNG + if (!libpng_init(io)) + goto libpng_failed; +#endif +#ifdef CONFIG_IMAGES_LIBUNGIF + if (!libungif_init(io)) + goto libungif_failed; +#endif +#ifdef CONFIG_IMAGES_LIBMAGICK + if (!libmagick_init(io)) + goto libmagick_failed; +#endif io->internal_pool = mp_new(1024); + return 1; +#ifdef CONFIG_IMAGES_LIBMAGICK + libmagick_cleanup(io); +libmagick_failed: +#endif +#ifdef CONFIG_IMAGES_LIBUNGIF + libungif_cleanup(io); +libungif_failed: +#endif +#ifdef CONFIG_IMAGES_LIBPNG + libpng_cleanup(io); +libpng_failed: +#endif +#ifdef CONFIG_IMAGES_LIBJPEG + libjpeg_cleanup(io); +libjpeg_failed: +#endif + return 0; } static inline void @@ -50,6 +88,18 @@ image_io_cleanup(struct image_io *io) DBG("image_io_cleanup()"); image_io_read_cancel(io); image_io_image_destroy(io); +#ifdef CONFIG_IMAGES_LIBMAGICK + libmagick_cleanup(io); +#endif +#ifdef CONFIG_IMAGES_LIBUNGIF + libungif_cleanup(io); +#endif +#ifdef CONFIG_IMAGES_LIBPNG + libpng_cleanup(io); +#endif +#ifdef CONFIG_IMAGES_LIBJPEG + libjpeg_cleanup(io); +#endif mp_delete(io->internal_pool); } @@ -60,9 +110,11 @@ image_io_reset(struct image_io *io) image_io_read_cancel(io); image_io_image_destroy(io); struct mempool *pool = io->internal_pool; + struct image_context *ctx = io->context; mp_flush(pool); bzero(io, sizeof(*io)); io->internal_pool = pool; + io->context = ctx; } int @@ -97,13 +149,15 @@ image_io_read_header(struct image_io *io) break; case IMAGE_FORMAT_UNDEFINED: - // FIXME: auto-detect +#if defined (CONFIG_IMAGES_LIBMAGICK) + return libmagick_read_header(io); +#endif break; default: ASSERT(0); } - image_thread_err(io->thread, IMAGE_ERR_INVALID_FILE_FORMAT, "Image format not supported."); + IMAGE_ERROR(io->context, IMAGE_ERROR_INVALID_FILE_FORMAT, "Image format not supported."); return 0; } @@ -145,6 +199,14 @@ image_io_read_data(struct image_io *io, int ref) #endif break; + case IMAGE_FORMAT_UNDEFINED: +#if defined(CONFIG_IMAGES_LIBMAGICK) + result = libmagick_read_data(io); +#else + ASSERT(0); +#endif + break; + default: ASSERT(0); } @@ -199,7 +261,7 @@ image_io_write(struct image_io *io) default: break; } - image_thread_err(io->thread, IMAGE_ERR_INVALID_FILE_FORMAT, "Image format not supported."); + IMAGE_ERROR(io->context, IMAGE_ERROR_INVALID_FILE_FORMAT, "Output format not supported."); return 0; } @@ -246,9 +308,9 @@ image_io_read_data_prepare(struct image_io_read_data_internals *rdi, struct imag DBG("image_io_read_data_prepare()"); if (rdi->need_transformations = io->cols != cols || io->rows != rows || ((io->flags ^ flags) & IMAGE_NEW_FLAGS)) - return rdi->image = image_new(io->thread, cols, rows, flags & IMAGE_IO_IMAGE_FLAGS, NULL); + return rdi->image = image_new(io->context, cols, rows, flags & IMAGE_IO_IMAGE_FLAGS, NULL); else - return rdi->image = image_new(io->thread, io->cols, io->rows, io->flags & IMAGE_IO_IMAGE_FLAGS, io->pool); + return rdi->image = image_new(io->context, io->cols, io->rows, io->flags & IMAGE_IO_IMAGE_FLAGS, io->pool); } int @@ -261,44 +323,45 @@ image_io_read_data_finish(struct image_io_read_data_internals *rdi, struct image if (io->cols != rdi->image->cols || io->rows != rdi->image->rows) { DBG("Scaling image"); - rdi->need_transformations = ((io->flags ^ rdi->image->flags) & IMAGE_NEW_FLAGS); - struct image *img = image_new(io->thread, io->cols, io->rows, rdi->image->flags, rdi->need_transformations ? NULL : io->pool); + uns flags = rdi->image->flags; + if (!(rdi->need_transformations = ((io->flags ^ rdi->image->flags) & (IMAGE_NEW_FLAGS & ~IMAGE_PIXELS_ALIGNED)))) + flags = io->flags; + struct image *img = image_new(io->context, io->cols, io->rows, flags, rdi->need_transformations ? NULL : io->pool); if (unlikely(!img)) { image_destroy(rdi->image); return 0; } - if (unlikely(!image_scale(io->thread, img, rdi->image))) + if (unlikely(!image_scale(io->context, img, rdi->image))) { image_destroy(rdi->image); image_destroy(img); return 0; } + image_destroy(rdi->image); rdi->image = img; } - /* Merge with background */ - if ((io->flags ^ rdi->image->flags) & IMAGE_ALPHA) + /* Convert pixel format */ + if (io->flags != rdi->image->flags) { - DBG("Aplying background"); - uns flags = rdi->image->flags & ~IMAGE_ALPHA; - rdi->need_transformations = (flags & io->flags) & IMAGE_NEW_FLAGS; - struct image *img = image_new(io->thread, io->cols, io->rows, flags, rdi->need_transformations ? NULL : io->pool); + struct image *img = image_new(io->context, io->cols, io->rows, io->flags, io->pool); if (unlikely(!img)) { image_destroy(rdi->image); return 0; } - if (unlikely(!image_apply_background(io->thread, img, rdi->image, &io->background_color))) + struct image_conv_options opt = image_conv_defaults; + opt.background = io->background_color; + if (unlikely(!image_conv(io->context, img, rdi->image, &opt))) { image_destroy(rdi->image); image_destroy(img); return 0; } + image_destroy(rdi->image); rdi->image = img; } - - ASSERT(!rdi->need_transformations); } /* Success */