aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2019-08-14 19:10:40 +0100
committerHarry Jeffery <harry@exec64.co.uk>2019-08-14 19:10:40 +0100
commitff2e28f250cc2aaba39d56e817c337d2e11b520b (patch)
tree7283ac2fd0fa5074f30b6ddf2cd46e812ae8312d /src
parent77e59235feb6cd13754cc720a48db9459b8726a6 (diff)
downloadimv-ff2e28f250cc2aaba39d56e817c337d2e11b520b.tar.gz
freeimage: Fix 16-bit greyscale images and add logging
Diffstat (limited to 'src')
-rw-r--r--src/backend_freeimage.c56
1 files changed, 49 insertions, 7 deletions
diff --git a/src/backend_freeimage.c b/src/backend_freeimage.c
index 1c3cb24..40a204b 100644
--- a/src/backend_freeimage.c
+++ b/src/backend_freeimage.c
@@ -1,6 +1,7 @@
#include "backend_freeimage.h"
#include "backend.h"
#include "source.h"
+#include "log.h"
#include <assert.h>
#include <stdlib.h>
@@ -60,15 +61,52 @@ static struct imv_image *to_image(FIBITMAP *in_bmp)
return image;
}
-static void report_error(struct imv_source *src)
+static FIBITMAP *normalise_bitmap(FIBITMAP *input)
{
+ FIBITMAP *output = NULL;
+
+ switch (FreeImage_GetImageType(input)) {
+ case FIT_RGB16:
+ case FIT_RGBA16:
+ case FIT_RGBF:
+ case FIT_RGBAF:
+ output = FreeImage_ConvertTo32Bits(input);
+ FreeImage_Unload(input);
+ break;
+
+ case FIT_UINT16:
+ case FIT_INT16:
+ case FIT_UINT32:
+ case FIT_INT32:
+ case FIT_FLOAT:
+ case FIT_DOUBLE:
+ case FIT_COMPLEX:
+ output = FreeImage_ConvertTo8Bits(input);
+ FreeImage_Unload(input);
+ break;
+
+ case FIT_BITMAP:
+ default:
+ output = input;
+ }
+
+ imv_log(IMV_DEBUG,
+ "freeimage: bitmap normalised to 32 bits: before=%p after=%p\n",
+ input, output);
+ return output;
+}
+
+static void report_error(struct imv_source *src, const char *error)
+{
+ imv_log(IMV_ERROR, "freeimage: %s\n", error);
+
assert(src->callback);
struct imv_source_message msg;
msg.source = src;
msg.user_data = src->user_data;
msg.image = NULL;
- msg.error = "Internal error";
+ msg.error = error;
pthread_mutex_unlock(&src->busy);
src->callback(&msg);
@@ -76,6 +114,7 @@ static void report_error(struct imv_source *src)
static void send_bitmap(struct imv_source *src, FIBITMAP *fibitmap, int frametime)
{
+ imv_log(IMV_DEBUG, "freeimage: returning bitmap\n");
assert(src->callback);
struct imv_source_message msg;
@@ -95,6 +134,7 @@ static void *first_frame(struct imv_source *src)
if (pthread_mutex_trylock(&src->busy)) {
return NULL;
}
+ imv_log(IMV_DEBUG, "freeimage: first_frame called\n");
FIBITMAP *bmp = NULL;
@@ -114,12 +154,12 @@ static void *first_frame(struct imv_source *src)
private->memory,
/* flags */ GIF_LOAD256);
} else {
- report_error(src);
+ report_error(src, "src->name and private->memory both NULL");
return NULL;
}
if (!private->multibitmap) {
- report_error(src);
+ report_error(src, "first frame already loaded");
return NULL;
}
@@ -148,11 +188,11 @@ static void *first_frame(struct imv_source *src)
fibitmap = FreeImage_LoadFromMemory(private->format, private->memory, flags);
}
if (!fibitmap) {
- report_error(src);
+ report_error(src, "FreeImage_Load returned NULL");
return NULL;
}
- bmp = FreeImage_ConvertTo32Bits(fibitmap);
- FreeImage_Unload(fibitmap);
+
+ bmp = normalise_bitmap(fibitmap);
}
src->width = FreeImage_GetWidth(bmp);
@@ -263,9 +303,11 @@ static void *next_frame(struct imv_source *src)
static enum backend_result open_path(const char *path, struct imv_source **src)
{
+ imv_log(IMV_DEBUG, "freeimage: open_path(%s)\n", path);
FREE_IMAGE_FORMAT fmt = FreeImage_GetFileType(path, 0);
if (fmt == FIF_UNKNOWN) {
+ imv_log(IMV_DEBUG, "freeimage: unknown file format\n");
return BACKEND_UNSUPPORTED;
}