summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/utils/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'winpr/libwinpr/utils/image.c')
-rw-r--r--winpr/libwinpr/utils/image.c60
1 files changed, 32 insertions, 28 deletions
diff --git a/winpr/libwinpr/utils/image.c b/winpr/libwinpr/utils/image.c
index cc2e2ad..c609825 100644
--- a/winpr/libwinpr/utils/image.c
+++ b/winpr/libwinpr/utils/image.c
@@ -52,12 +52,12 @@
#include "../log.h"
#define TAG WINPR_TAG("utils.image")
-static SSIZE_T winpr_convert_from_jpeg(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data);
-static SSIZE_T winpr_convert_from_png(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data);
-static SSIZE_T winpr_convert_from_webp(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data);
+static SSIZE_T winpr_convert_from_jpeg(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data);
+static SSIZE_T winpr_convert_from_png(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data);
+static SSIZE_T winpr_convert_from_webp(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data);
static BOOL writeBitmapFileHeader(wStream* s, const WINPR_BITMAP_FILE_HEADER* bf)
{
@@ -484,7 +484,7 @@ int winpr_image_read(wImage* image, const char* filename)
if (pos > 0)
{
- char* buffer = malloc((size_t)pos);
+ BYTE* buffer = malloc((size_t)pos);
if (buffer)
{
size_t r = fread(buffer, 1, (size_t)pos, fp);
@@ -518,9 +518,8 @@ int winpr_image_read_buffer(wImage* image, const BYTE* buffer, size_t size)
(sig[8] == 'W') && (sig[9] == 'E') && (sig[10] == 'B') && (sig[11] == 'P'))
{
image->type = WINPR_IMAGE_WEBP;
- const SSIZE_T rc =
- winpr_convert_from_webp((const char*)buffer, size, &image->width, &image->height,
- &image->bitsPerPixel, ((char**)&image->data));
+ const SSIZE_T rc = winpr_convert_from_webp(buffer, size, &image->width, &image->height,
+ &image->bitsPerPixel, &image->data);
if (rc >= 0)
{
image->bytesPerPixel = (image->bitsPerPixel + 7) / 8;
@@ -533,9 +532,8 @@ int winpr_image_read_buffer(wImage* image, const BYTE* buffer, size_t size)
(sig[10] == 0x00))
{
image->type = WINPR_IMAGE_JPEG;
- const SSIZE_T rc =
- winpr_convert_from_jpeg((const char*)buffer, size, &image->width, &image->height,
- &image->bitsPerPixel, ((char**)&image->data));
+ const SSIZE_T rc = winpr_convert_from_jpeg(buffer, size, &image->width, &image->height,
+ &image->bitsPerPixel, &image->data);
if (rc >= 0)
{
image->bytesPerPixel = (image->bitsPerPixel + 7) / 8;
@@ -547,9 +545,8 @@ int winpr_image_read_buffer(wImage* image, const BYTE* buffer, size_t size)
(sig[4] == '\r') && (sig[5] == '\n') && (sig[6] == 0x1A) && (sig[7] == '\n'))
{
image->type = WINPR_IMAGE_PNG;
- const SSIZE_T rc =
- winpr_convert_from_png((const char*)buffer, size, &image->width, &image->height,
- &image->bitsPerPixel, ((char**)&image->data));
+ const SSIZE_T rc = winpr_convert_from_png(buffer, size, &image->width, &image->height,
+ &image->bitsPerPixel, &image->data);
if (rc >= 0)
{
image->bytesPerPixel = (image->bitsPerPixel + 7) / 8;
@@ -625,11 +622,11 @@ void* winpr_convert_to_jpeg(const void* data, size_t size, UINT32 width, UINT32
jpeg_start_compress(&cinfo, TRUE);
- const unsigned char* cdata = data;
+ const JSAMPLE* cdata = data;
for (size_t x = 0; x < height; x++)
{
const JDIMENSION offset = x * stride;
- const JSAMPROW coffset = &cdata[offset];
+ const JSAMPLE* coffset = &cdata[offset];
if (jpeg_write_scanlines(&cinfo, &coffset, 1) != 1)
goto fail;
}
@@ -643,8 +640,8 @@ fail:
#endif
}
-SSIZE_T winpr_convert_from_jpeg(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data)
+SSIZE_T winpr_convert_from_jpeg(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data)
{
WINPR_ASSERT(comp_data || (comp_data_bytes == 0));
WINPR_ASSERT(width);
@@ -658,7 +655,7 @@ SSIZE_T winpr_convert_from_jpeg(const char* comp_data, size_t comp_data_bytes, U
struct jpeg_decompress_struct cinfo = { 0 };
struct jpeg_error_mgr jerr;
SSIZE_T size = -1;
- char* decomp_data = NULL;
+ BYTE* decomp_data = NULL;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
@@ -734,8 +731,8 @@ void* winpr_convert_to_webp(const void* data, size_t size, UINT32 width, UINT32
#endif
}
-SSIZE_T winpr_convert_from_webp(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data)
+SSIZE_T winpr_convert_from_webp(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data)
{
WINPR_ASSERT(comp_data || (comp_data_bytes == 0));
WINPR_ASSERT(width);
@@ -751,13 +748,20 @@ SSIZE_T winpr_convert_from_webp(const char* comp_data, size_t comp_data_bytes, U
return -1;
#else
- uint8_t* dst = WebPDecodeBGRA(comp_data, comp_data_bytes, width, height);
- if (!dst)
+ int w = 0;
+ int h = 0;
+ uint8_t* dst = WebPDecodeBGRA(comp_data, comp_data_bytes, &w, &h);
+ if (!dst || (w < 0) || (h < 0))
+ {
+ free(dst);
return -1;
+ }
+ *width = w;
+ *height = h;
*bpp = 32;
*ppdecomp_data = dst;
- return (*width) * (*height) * 4;
+ return 4ll * w * h;
#endif
}
@@ -1006,8 +1010,8 @@ void* winpr_convert_to_png(const void* data, size_t size, UINT32 width, UINT32 h
#endif
}
-SSIZE_T winpr_convert_from_png(const char* comp_data, size_t comp_data_bytes, UINT32* width,
- UINT32* height, UINT32* bpp, char** ppdecomp_data)
+SSIZE_T winpr_convert_from_png(const BYTE* comp_data, size_t comp_data_bytes, UINT32* width,
+ UINT32* height, UINT32* bpp, BYTE** ppdecomp_data)
{
#if defined(WINPR_UTILS_IMAGE_PNG)
size_t len = 0;