diff options
author | NRK <nrk@disroot.org> | 2021-11-06 20:58:50 +0600 |
---|---|---|
committer | N-R-K <79544946+N-R-K@users.noreply.github.com> | 2021-12-12 17:58:17 +0600 |
commit | eccd7de532b09fb738638095675eefc7be96ecc3 (patch) | |
tree | 696758307cd80ef8b4b0b274c175024601f17ed5 | |
parent | 7a94a5ecc65b4e2a80795853ac344f4ee735d359 (diff) |
remove unneeded animated-webp hacks
now that imlib2 (v1.7.5) is able to load the first frame of an
animated-webp file, we no longer need the `is_webp` check to bypass
imlib2.
ref: https://phab.enlightenment.org/T8964
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | image.c | 126 |
2 files changed, 44 insertions, 83 deletions
@@ -76,6 +76,7 @@ The following dependencies are optional. * libexif : Used for auto-orientation and exif thumbnails. Disable via `HAVE_LIBEXIF=0` * libwebp : Used for animated webp playback. + (NOTE: animated webp also requires Imlib2 v1.7.5 or above) Disabled via `HAVE_LIBWEBP=0`. Please make sure to install the corresponding development packages in case that @@ -298,28 +298,7 @@ static bool img_load_gif(img_t *img, const fileinfo_t *file) #if HAVE_LIBWEBP -static bool is_webp(const char *path) -{ - /* The size (in bytes) of the largest amount of data required to verify a WebP image. */ - enum { max = 30 }; - const unsigned char fmt[max]; - bool ret = false; - FILE *f; - - if ((f = fopen(path, "rb")) != NULL) { - if (fread((unsigned char *) fmt, 1, max, f) == max) - ret = WebPGetInfo(fmt, max, NULL, NULL); - fclose(f); - } - return ret; -} - -/* fframe img - * NULL NULL = do nothing - * x NULL = load the first frame as an Imlib_Image - * NULL x = load all frames into img->multi. - */ -static bool img_load_webp(const fileinfo_t *file, Imlib_Image *fframe, img_t *img) +static bool img_load_webp(img_t *img, const fileinfo_t *file) { FILE *webp_file; WebPData data; @@ -335,10 +314,8 @@ static bool img_load_webp(const fileinfo_t *file, Imlib_Image *fframe, img_t *im unsigned long flags; unsigned int delay; bool err = false; - data.bytes = NULL; - if ((err = fframe == NULL && img == NULL)) - goto fail; + data.bytes = NULL; if ((err = (webp_file = fopen(file->path, "rb")) == NULL)) { error(0, 0, "%s: Error opening webp image", file->name); @@ -368,61 +345,49 @@ static bool img_load_webp(const fileinfo_t *file, Imlib_Image *fframe, img_t *im } demux = WebPAnimDecoderGetDemuxer(dec); - if (img == NULL) { /* Only get the first frame and put it into fframe. */ - if ((err = !WebPAnimDecoderGetNext(dec, &buf, &ts))) { - error(0, 0, "%s: Error loading first frame", file->name); - goto fail; - } - *fframe = imlib_create_image_using_copied_data( - info.canvas_width, info.canvas_height, (DATA32*)buf); - imlib_context_set_image(*fframe); - imlib_image_set_has_alpha(WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS) & ALPHA_FLAG); - } else { - /* Get global information for the image */ - flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); - img->w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); - img->h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); - - if (img->multi.cap == 0) { - img->multi.cap = info.frame_count; - img->multi.frames = emalloc(img->multi.cap * sizeof(img_frame_t)); - } else if (info.frame_count > img->multi.cap) { - img->multi.cap = info.frame_count; - img->multi.frames = erealloc(img->multi.frames, - img->multi.cap * sizeof(img_frame_t)); - } + /* Get global information for the image */ + flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); + img->w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); + img->h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); - /* Load and decode frames (also works on images with only 1 frame) */ - img->multi.cnt = img->multi.sel = 0; - while (WebPAnimDecoderGetNext(dec, &buf, &ts)) { - im = imlib_create_image_using_copied_data( - info.canvas_width, info.canvas_height, (DATA32*)buf); - imlib_context_set_image(im); - imlib_image_set_format("webp"); - /* Get an iterator of this frame - used for frame info (duration, etc.) */ - WebPDemuxGetFrame(demux, img->multi.cnt+1, &iter); - imlib_image_set_has_alpha((flags & ALPHA_FLAG) == ALPHA_FLAG); - /* Store info for this frame */ - img->multi.frames[img->multi.cnt].im = im; - delay = iter.duration > 0 ? iter.duration : DEF_WEBP_DELAY; - img->multi.frames[img->multi.cnt].delay = delay; - img->multi.length += img->multi.frames[img->multi.cnt].delay; - img->multi.cnt++; - } - WebPDemuxReleaseIterator(&iter); + if (img->multi.cap == 0) { + img->multi.cap = info.frame_count; + img->multi.frames = emalloc(img->multi.cap * sizeof(img_frame_t)); + } else if (info.frame_count > img->multi.cap) { + img->multi.cap = info.frame_count; + img->multi.frames = erealloc(img->multi.frames, + img->multi.cap * sizeof(img_frame_t)); + } - if (img->multi.cnt > 1) { - imlib_context_set_image(img->im); - imlib_free_image(); - img->im = img->multi.frames[0].im; - } else if (img->multi.cnt == 1) { - imlib_context_set_image(img->multi.frames[0].im); - imlib_free_image(); - img->multi.cnt = 0; - } + /* Load and decode frames (also works on images with only 1 frame) */ + img->multi.cnt = img->multi.sel = 0; + while (WebPAnimDecoderGetNext(dec, &buf, &ts)) { + im = imlib_create_image_using_copied_data( + info.canvas_width, info.canvas_height, (DATA32*)buf); + imlib_context_set_image(im); + imlib_image_set_format("webp"); + /* Get an iterator of this frame - used for frame info (duration, etc.) */ + WebPDemuxGetFrame(demux, img->multi.cnt+1, &iter); + imlib_image_set_has_alpha((flags & ALPHA_FLAG) == ALPHA_FLAG); + /* Store info for this frame */ + img->multi.frames[img->multi.cnt].im = im; + delay = iter.duration > 0 ? iter.duration : DEF_WEBP_DELAY; + img->multi.frames[img->multi.cnt].delay = delay; + img->multi.length += img->multi.frames[img->multi.cnt].delay; + img->multi.cnt++; + } + WebPDemuxReleaseIterator(&iter); + + if (img->multi.cnt > 1) { imlib_context_set_image(img->im); + imlib_free_image(); + img->im = img->multi.frames[0].im; + } else if (img->multi.cnt == 1) { + imlib_context_set_image(img->multi.frames[0].im); + imlib_free_image(); + img->multi.cnt = 0; } - imlib_image_set_format("webp"); + imlib_context_set_image(img->im); fail: if (dec != NULL) WebPAnimDecoderDelete(dec); @@ -439,12 +404,7 @@ Imlib_Image img_open(const fileinfo_t *file) if (access(file->path, R_OK) == 0 && stat(file->path, &st) == 0 && S_ISREG(st.st_mode)) { -#if HAVE_LIBWEBP - if (is_webp(file->path)) - img_load_webp(file, &im, NULL); - else -#endif - im = imlib_load_image(file->path); + im = imlib_load_image(file->path); if (im != NULL) { imlib_context_set_image(im); if (imlib_image_get_data_for_reading_only() == NULL) { @@ -478,7 +438,7 @@ bool img_load(img_t *img, const fileinfo_t *file) #endif #if HAVE_LIBWEBP if (STREQ(fmt, "webp")) - img_load_webp(file, NULL, img); + img_load_webp(img, file); #endif } img->w = imlib_image_get_width(); |