X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=images%2Fimages.h;h=fbe7e072421d4490aa91323d97fde8c125bdcb8a;hb=0db6e10eac28f38bfc3b325b13ad95107c58ce1e;hp=dbaa055c5af5e6cdbfd02d7f897e75c34001ee10;hpb=0e5c5828c3f3e1abd14bd012827e6b467075290b;p=libucw.git diff --git a/images/images.h b/images/images.h index dbaa055c..fbe7e072 100644 --- a/images/images.h +++ b/images/images.h @@ -10,7 +10,38 @@ #ifndef _IMAGES_IMAGES_H #define _IMAGES_IMAGES_H -#include "lib/bbuf.h" +#include + +#ifdef CONFIG_UCW_CLEAN_ABI +#define image_channels_format_to_name ucw_image_channels_format_to_name +#define image_clear ucw_image_clear +#define image_clone ucw_image_clone +#define image_context_cleanup ucw_image_context_cleanup +#define image_context_init ucw_image_context_init +#define image_context_msg ucw_image_context_msg +#define image_context_msg_default ucw_image_context_msg_default +#define image_context_msg_silent ucw_image_context_msg_silent +#define image_context_vmsg ucw_image_context_vmsg +#define image_destroy ucw_image_destroy +#define image_dimensions_fit_to_box ucw_image_dimensions_fit_to_box +#define image_extension_to_format ucw_image_extension_to_format +#define image_file_name_to_format ucw_image_file_name_to_format +#define image_format_to_extension ucw_image_format_to_extension +#define image_init_matrix ucw_image_init_matrix +#define image_init_subimage ucw_image_init_subimage +#define image_io_cleanup ucw_image_io_cleanup +#define image_io_init ucw_image_io_init +#define image_io_read ucw_image_io_read +#define image_io_read_data ucw_image_io_read_data +#define image_io_read_header ucw_image_io_read_header +#define image_io_reset ucw_image_io_reset +#define image_io_write ucw_image_io_write +#define image_max_bytes ucw_image_max_bytes +#define image_max_dim ucw_image_max_dim +#define image_name_to_channels_format ucw_image_name_to_channels_format +#define image_new ucw_image_new +#define image_scale ucw_image_scale +#endif struct mempool; struct fastbuf; @@ -55,12 +86,12 @@ extern uns image_max_bytes; /* ImageLib.ImageMaxBytes */ #define IMAGE_SSE_ALIGN_SIZE 16 enum image_flag { - IMAGE_COLOR_SPACE = 0x7, /* mask for enum color_space */ - IMAGE_ALPHA = 0x8, /* alpha channel */ - IMAGE_PIXELS_ALIGNED = 0x10, /* align pixel size to the nearest power of two */ - IMAGE_SSE_ALIGNED = 0x20, /* align scanlines to multiples of 16 bytes (both start and size) */ - IMAGE_NEED_DESTROY = 0x40, /* image is allocated with xmalloc */ - IMAGE_GAPS_PROTECTED = 0x80, /* cannot access gaps between rows */ + IMAGE_COLOR_SPACE = 0xf, /* mask for enum color_space */ + IMAGE_ALPHA = 0x10, /* alpha channel */ + IMAGE_PIXELS_ALIGNED = 0x20, /* align pixel size to the nearest power of two */ + IMAGE_SSE_ALIGNED = 0x40, /* align scanlines to multiples of 16 bytes (both start and size) */ + IMAGE_NEED_DESTROY = 0x80, /* image is allocated with xmalloc */ + IMAGE_GAPS_PROTECTED = 0x100, /* cannot access gaps between rows */ IMAGE_CHANNELS_FORMAT = IMAGE_COLOR_SPACE | IMAGE_ALPHA, IMAGE_PIXEL_FORMAT = IMAGE_CHANNELS_FORMAT | IMAGE_PIXELS_ALIGNED, IMAGE_ALIGNED = IMAGE_PIXELS_ALIGNED | IMAGE_SSE_ALIGNED, @@ -68,11 +99,22 @@ enum image_flag { IMAGE_INTERNAL_FLAGS = IMAGE_NEED_DESTROY | IMAGE_GAPS_PROTECTED, }; +#define IMAGE_MAX_CHANNELS 4 +#define IMAGE_CHANNELS_FORMAT_MAX_SIZE 128 +byte *image_channels_format_to_name(uns format, byte *buf); +uns image_name_to_channels_format(byte *name); + +struct color { + byte c[IMAGE_MAX_CHANNELS]; + byte color_space; +}; + struct image { byte *pixels; /* aligned top left pixel, there are at least sizeof(uns) unused bytes after the buffer (possible optimizations) */ uns cols; /* number of columns */ uns rows; /* number of rows */ + uns channels; /* number of color channels including the alpha channel */ uns pixel_size; /* size of pixel in bytes (1, 2, 3 or 4) */ uns row_size; /* scanline size in bytes */ uns row_pixels_size; /* scanline size in bytes excluding rows gaps */ @@ -87,30 +129,15 @@ void image_clear(struct image_context *ctx, struct image *img); struct image *image_init_matrix(struct image_context *ctx, struct image *img, byte *pixels, uns cols, uns rows, uns row_size, uns flags); struct image *image_init_subimage(struct image_context *ctx, struct image *img, struct image *src, uns left, uns top, uns cols, uns rows); -static inline int -image_dimensions_valid(uns cols, uns rows) +static inline int image_dimensions_valid(uns cols, uns rows) { return cols && rows && cols <= image_max_dim && rows <= image_max_dim; } - -byte *color_space_to_name(uns cs); -byte *image_channels_format_to_name(uns format); -uns image_name_to_channels_format(byte *name); - -struct color { - byte c[3]; - byte color_space; -} PACKED; - /* scale.c */ int image_scale(struct image_context *ctx, struct image *dest, struct image *src); void image_dimensions_fit_to_box(uns *cols, uns *rows, uns max_cols, uns max_rows, uns upsample); -/* alpha.c */ - -int image_apply_background(struct image_context *ctx, struct image *dest, struct image *src, struct color *background); - /* image-io.c */ enum image_format { @@ -122,15 +149,15 @@ enum image_format { }; struct image_io { - /* R - read_header input */ - /* H - read_header output */ - /* I - read_data input */ - /* O - read_data output */ - /* W - write input */ + /* R - read_header input */ + /* H - read_header output */ + /* I - read_data input */ + /* O - read_data output */ + /* W - write input */ struct image *image; /* [ OW] - image data */ enum image_format format; /* [R W] - file format (IMAGE_FORMAT_x) */ - struct fastbuf *fastbuf; /* [R W] - source/destination stream */ + struct fastbuf *fastbuf; /* [R W] - source/destination stream */ struct mempool *pool; /* [ I ] - parameter to image_new */ uns cols; /* [ HI ] - number of columns, parameter to image_new */ uns rows; /* [ HI ] - number of rows, parameter to image_new */