This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository legacy-imlib2.
View the commit online.
commit 5d1083858cf5225325771b6e91322de1badc1eed
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Fri Jan 13 11:36:06 2023 +0100
image: Let __imlib_CreateImage() allocate pixel data buffer
..and check dimensions.
Does simplify things nicely.
---
src/lib/api.c | 115 ++++++++++++++++++----------------------------------
src/lib/api_x11.c | 33 ++++-----------
src/lib/font_draw.c | 14 ++-----
src/lib/image.c | 31 ++++++++++++--
src/lib/image.h | 3 +-
src/lib/x11_rend.c | 6 +--
6 files changed, 81 insertions(+), 121 deletions(-)
diff --git a/src/lib/api.c b/src/lib/api.c
index 6625ca8..54c13d5 100644
--- a/src/lib/api.c
+++ b/src/lib/api.c
@@ -931,14 +931,11 @@ imlib_blend_image_onto_image(Imlib_Image src_image, char merge_alpha,
EAPI Imlib_Image
imlib_create_image(int width, int height)
{
- uint32_t *data;
+ ImlibImage *im;
- if (!IMAGE_DIMENSIONS_OK(width, height))
- return NULL;
- data = "" * height * sizeof(uint32_t));
- if (data)
- return __imlib_CreateImage(width, height, data);
- return NULL;
+ im = __imlib_CreateImage(width, height, NULL, 0);
+
+ return im;
}
EAPI Imlib_Image
@@ -947,11 +944,13 @@ imlib_create_image_using_data(int width, int height, uint32_t * data)
ImlibImage *im;
CHECK_PARAM_POINTER_RETURN("data", data, NULL);
- if (!IMAGE_DIMENSIONS_OK(width, height))
+
+ im = __imlib_CreateImage(width, height, data, 0);
+ if (!im)
return NULL;
- im = __imlib_CreateImage(width, height, data);
- if (im)
- IM_FLAG_SET(im, F_DONT_FREE_DATA);
+
+ IM_FLAG_SET(im, F_DONT_FREE_DATA);
+
return im;
}
@@ -962,11 +961,12 @@ EAPI Imlib_Image
ImlibImage *im;
CHECK_PARAM_POINTER_RETURN("data", data, NULL);
- if (!IMAGE_DIMENSIONS_OK(width, height))
+
+ im = __imlib_CreateImage(width, height, data, 0);
+ if (!im)
return NULL;
- im = __imlib_CreateImage(width, height, data);
- if (im)
- im->data_memory_func = func;
+
+ im->data_memory_func = func;
return im;
}
@@ -977,20 +977,14 @@ imlib_create_image_using_copied_data(int width, int height, uint32_t * data)
ImlibImage *im;
CHECK_PARAM_POINTER_RETURN("data", data, NULL);
- if (!IMAGE_DIMENSIONS_OK(width, height))
- return NULL;
- im = __imlib_CreateImage(width, height, NULL);
+
+ im = __imlib_CreateImage(width, height, NULL, 0);
if (!im)
return NULL;
- im->data = "" * height * sizeof(uint32_t));
- if (data)
- {
- memcpy(im->data, data, width * height * sizeof(uint32_t));
- return im;
- }
- else
- __imlib_FreeImage(im);
- return NULL;
+
+ memcpy(im->data, data, width * height * sizeof(uint32_t));
+
+ return im;
}
EAPI Imlib_Image
@@ -1000,21 +994,14 @@ imlib_clone_image(void)
CHECK_PARAM_POINTER_RETURN("image", ctx->image, NULL);
CAST_IMAGE(im_old, ctx->image);
+
if (__imlib_LoadImageData(im_old))
return NULL;
- /* Note: below check should've ensured by original image allocation,
- * but better safe than sorry. */
- if (!IMAGE_DIMENSIONS_OK(im_old->w, im_old->h))
- return NULL;
- im = __imlib_CreateImage(im_old->w, im_old->h, NULL);
- if (!(im))
+
+ im = __imlib_CreateImage(im_old->w, im_old->h, NULL, 0);
+ if (!im)
return NULL;
- im->data = "" * im->h * sizeof(uint32_t));
- if (!(im->data))
- {
- __imlib_FreeImage(im);
- return NULL;
- }
+
memcpy(im->data, im_old->data, im->w * im->h * sizeof(uint32_t));
im->flags = im_old->flags;
IM_FLAG_SET(im, F_UNCACHEABLE);
@@ -1025,6 +1012,7 @@ imlib_clone_image(void)
im->format = strdup(im_old->format);
if (im_old->file)
im->file = strdup(im_old->file);
+
return im;
}
@@ -1034,18 +1022,14 @@ imlib_create_cropped_image(int x, int y, int width, int height)
ImlibImage *im, *im_old;
CHECK_PARAM_POINTER_RETURN("image", ctx->image, NULL);
- if (!IMAGE_DIMENSIONS_OK(abs(width), abs(height)))
- return NULL;
CAST_IMAGE(im_old, ctx->image);
+
if (__imlib_LoadImageData(im_old))
return NULL;
- im = __imlib_CreateImage(abs(width), abs(height), NULL);
- im->data = "" * height) * sizeof(uint32_t));
- if (!(im->data))
- {
- __imlib_FreeImage(im);
- return NULL;
- }
+
+ im = __imlib_CreateImage(abs(width), abs(height), NULL, 0);
+ if (!im)
+ return NULL;
im->has_alpha = im_old->has_alpha;
__imlib_BlendImageToImage(im_old, im, 0, 0, im->has_alpha,
@@ -1065,18 +1049,14 @@ imlib_create_cropped_scaled_image(int src_x, int src_y,
ImlibImage *im, *im_old;
CHECK_PARAM_POINTER_RETURN("image", ctx->image, NULL);
- if (!IMAGE_DIMENSIONS_OK(abs(dst_width), abs(dst_height)))
- return NULL;
CAST_IMAGE(im_old, ctx->image);
+
if (__imlib_LoadImageData(im_old))
return NULL;
- im = __imlib_CreateImage(abs(dst_width), abs(dst_height), NULL);
- im->data = "" * dst_height) * sizeof(uint32_t));
- if (!(im->data))
- {
- __imlib_FreeImage(im);
- return NULL;
- }
+
+ im = __imlib_CreateImage(abs(dst_width), abs(dst_height), NULL, 0);
+ if (!im)
+ return NULL;
im->has_alpha = im_old->has_alpha;
__imlib_BlendImageToImage(im_old, im, ctx->anti_alias, 0, im->has_alpha,
@@ -1938,17 +1918,10 @@ imlib_create_rotated_image(double angle)
dx = (int)(cos(angle) * _ROTATE_PREC_MAX);
dy = -(int)(sin(angle) * _ROTATE_PREC_MAX);
- if (!IMAGE_DIMENSIONS_OK(sz, sz))
+ im = __imlib_CreateImage(sz, sz, NULL, 1);
+ if (!im)
return NULL;
- im = __imlib_CreateImage(sz, sz, NULL);
- im->data = "" * sz, sizeof(uint32_t));
- if (!(im->data))
- {
- __imlib_FreeImage(im);
- return NULL;
- }
-
if (ctx->anti_alias)
{
__imlib_RotateAA(im_old->data, im->data, im_old->w, im_old->w,
@@ -1998,16 +1971,6 @@ imlib_rotate_image_from_buffer(double angle, Imlib_Image src_image)
else
sz = im->w; // update sz with real width
-#if 0 /* Not necessary 'cause destination is context */
- im = __imlib_CreateImage(sz, sz, NULL);
- im->data = "" * sz, sizeof(uint32_t));
- if (!(im->data))
- {
- __imlib_FreeImage(im);
- return;
- }
-#endif
-
if (ctx->anti_alias)
{
__imlib_RotateAA(im_old->data, im->data, im_old->w, im_old->w,
diff --git a/src/lib/api_x11.c b/src/lib/api_x11.c
index efc2ff7..2078871 100644
--- a/src/lib/api_x11.c
+++ b/src/lib/api_x11.c
@@ -292,21 +292,18 @@ imlib_create_image_from_drawable(Pixmap mask, int x, int y, int width,
ImlibImage *im;
char domask = 0;
- if (!IMAGE_DIMENSIONS_OK(width, height))
- return NULL;
if (mask)
{
domask = 1;
if (mask == (Pixmap) 1)
mask = None;
}
- im = __imlib_CreateImage(width, height, NULL);
+
+ im = __imlib_CreateImage(width, height, NULL, 0);
if (!im)
return NULL;
- im->data = "" * height * sizeof(uint32_t));
- if (!im->data ||
- !__imlib_GrabDrawableToRGBA(im->data, 0, 0, width, height, ctx->display,
+ if (!__imlib_GrabDrawableToRGBA(im->data, 0, 0, width, height, ctx->display,
ctx->drawable, mask, ctx->visual,
ctx->colormap, ctx->depth, x, y, width,
height, &domask, need_to_grab_x))
@@ -326,17 +323,10 @@ imlib_create_image_from_ximage(XImage * image, XImage * mask, int x, int y,
{
ImlibImage *im;
- if (!IMAGE_DIMENSIONS_OK(width, height))
- return NULL;
- im = __imlib_CreateImage(width, height, NULL);
+ im = __imlib_CreateImage(width, height, NULL, 0);
if (!im)
return NULL;
- im->data = "" * height * sizeof(uint32_t));
- if (!im->data)
- {
- __imlib_FreeImage(im);
- return NULL;
- }
+
__imlib_GrabXImageToRGBA(im->data, 0, 0, width, height,
ctx->display, image, mask, ctx->visual,
ctx->depth, x, y, width, height, need_to_grab_x);
@@ -355,23 +345,14 @@ imlib_create_scaled_image_from_drawable(Pixmap mask, int src_x, int src_y,
if (!IMAGE_DIMENSIONS_OK(src_width, src_height))
return NULL;
- if (!IMAGE_DIMENSIONS_OK(dst_width, dst_height))
- return NULL;
- im = __imlib_CreateImage(dst_width, dst_height, NULL);
+ im = __imlib_CreateImage(dst_width, dst_height, NULL, 0);
if (!im)
return NULL;
- im->data = "" * dst_height * sizeof(uint32_t));
- if (!im->data)
- {
- __imlib_FreeImage(im);
- return NULL;
- }
domask = mask != 0 || get_mask_from_shape;
- if (!im->data ||
- !__imlib_GrabDrawableScaledToRGBA(im->data, 0, 0, dst_width, dst_height,
+ if (!__imlib_GrabDrawableScaledToRGBA(im->data, 0, 0, dst_width, dst_height,
ctx->display, ctx->drawable, mask,
ctx->visual, ctx->colormap, ctx->depth,
src_x, src_y, src_width, src_height,
diff --git a/src/lib/font_draw.c b/src/lib/font_draw.c
index 54762bd..f69cd29 100644
--- a/src/lib/font_draw.c
+++ b/src/lib/font_draw.c
@@ -71,24 +71,16 @@ __imlib_render_str(ImlibImage * im, ImlibFont * fn, int drx, int dry,
{
int w, h, ascent;
ImlibImage *im2;
- uint32_t *data;
int nx, ny;
__imlib_font_query_advance(fn, text, &w, NULL);
h = __imlib_font_max_ascent_get(fn) - __imlib_font_max_descent_get(fn);
- if (!IMAGE_DIMENSIONS_OK(w, h))
- return;
- data = "" * h, sizeof(uint32_t));
- if (!data)
- return;
/* TODO check if this is the right way of rendering. Esp for huge sizes */
- im2 = __imlib_CreateImage(w, h, data);
+ im2 = __imlib_CreateImage(w, h, NULL, 1);
if (!im2)
- {
- free(data);
- return;
- }
+ return;
+
im2->has_alpha = 1;
ascent = __imlib_font_max_ascent_get(fn);
diff --git a/src/lib/image.c b/src/lib/image.c
index 436f517..cc366cd 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -362,19 +362,42 @@ __imlib_GetCacheSize(void)
return cache_size;
}
-/* create a new image struct from data passed that is wize w x h then return */
-/* a pointer to that image sturct */
+/* Create a new image struct
+ * If data is non-zero use it for pixel data, otherwise allocate the
+ * pixel data buffer.
+ * If zero is set the pixel data buffer is zeroed. */
ImlibImage *
-__imlib_CreateImage(int w, int h, uint32_t * data)
+__imlib_CreateImage(int w, int h, uint32_t * data, int zero)
{
ImlibImage *im;
+ uint32_t *dptr = data;
+
+ if (!IMAGE_DIMENSIONS_OK(w, h))
+ return NULL;
+
+ if (!dptr)
+ {
+ if (zero)
+ dptr = calloc(w * h, sizeof(uint32_t));
+ else
+ dptr = malloc(w * h * sizeof(uint32_t));
+ }
+ if (!dptr)
+ return NULL;
im = __imlib_ProduceImage();
+ if (!im)
+ {
+ if (!data)
+ free(dptr);
+ return NULL;
+ }
im->w = w;
im->h = h;
- im->data = ""
+ im->data = ""
im->references = 1;
IM_FLAG_SET(im, F_UNCACHEABLE);
+
return im;
}
diff --git a/src/lib/image.h b/src/lib/image.h
index 8d3e9f1..be52169 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -98,7 +98,8 @@ typedef struct {
ImlibLoader *__imlib_FindBestLoader(const char *file, const char *format,
int for_save);
-ImlibImage *__imlib_CreateImage(int w, int h, uint32_t * data);
+ImlibImage *__imlib_CreateImage(int w, int h, uint32_t * data,
+ int zero);
ImlibImage *__imlib_LoadImage(const char *file, ImlibLoadArgs * ila);
int __imlib_LoadEmbedded(ImlibLoader * l, ImlibImage * im,
int load_data, const char *file);
diff --git a/src/lib/x11_rend.c b/src/lib/x11_rend.c
index 7852235..e1fd58e 100644
--- a/src/lib/x11_rend.c
+++ b/src/lib/x11_rend.c
@@ -559,13 +559,12 @@ __imlib_RenderImageSkewed(Display * d, ImlibImage * im, Drawable w, Drawable m,
dy1 = 0;
}
- if (!IMAGE_DIMENSIONS_OK(dw, dh))
+ back = __imlib_CreateImage(dw, dh, NULL, 1);
+ if (!back)
return;
__imlib_GetContext(d, v, cm, depth);
- back = __imlib_CreateImage(dw, dh, NULL);
- back->data = "" * dh, sizeof(uint32_t));
__imlib_GrabDrawableToRGBA(back->data, 0, 0, dw, dh, d, w, 0, v, cm,
depth, dx1, dy1, dw, dh, 0, 1);
@@ -576,5 +575,6 @@ __imlib_RenderImageSkewed(Display * d, ImlibImage * im, Drawable w, Drawable m,
__imlib_RenderImage(d, back, w, m, v, cm, depth, 0, 0, dw, dh,
dx1, dy1, dw, dh, 0, hiq, 0, dither_mask, mat, 0,
OP_COPY);
+
__imlib_FreeImage(back);
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.