Colour-manage SVGs

This commit is contained in:
Přemysl Eric Janouch 2023-07-09 09:46:31 +02:00
parent 9b99de99bb
commit 840e7f172c
Signed by: p
GPG Key ID: A0420B94F92B9493
4 changed files with 17 additions and 9 deletions

View File

@ -2310,11 +2310,11 @@ load_resvg_render_internal(FivIoRenderClosureResvg *self,
} }
static FivIoImage * static FivIoImage *
load_resvg_render(FivIoRenderClosure *closure, double scale) load_resvg_render(
FivIoRenderClosure *closure, FivIoProfile target, double scale)
{ {
FivIoRenderClosureResvg *self = (FivIoRenderClosureResvg *) closure; FivIoRenderClosureResvg *self = (FivIoRenderClosureResvg *) closure;
// TODO(p): Somehow get the target colour management profile. return load_resvg_render_internal(self, scale, target, NULL);
return load_resvg_render_internal(self, scale, NULL, NULL);
} }
static const char * static const char *
@ -2434,11 +2434,11 @@ load_librsvg_render_internal(FivIoRenderClosureLibrsvg *self, double scale,
} }
static FivIoImage * static FivIoImage *
load_librsvg_render(FivIoRenderClosure *closure, double scale) load_librsvg_render(
FivIoRenderClosure *closure, FivIoProfile target, double scale)
{ {
FivIoRenderClosureLibrsvg *self = (FivIoRenderClosureLibrsvg *) closure; FivIoRenderClosureLibrsvg *self = (FivIoRenderClosureLibrsvg *) closure;
// TODO(p): Somehow get the target colour management profile. return load_librsvg_render_internal(self, scale, target, NULL);
return load_librsvg_render_internal(self, scale, NULL, NULL);
} }
static FivIoImage * static FivIoImage *

View File

@ -56,9 +56,11 @@ enum _FivIoOrientation {
FivIoOrientation270 = 8 FivIoOrientation270 = 8
}; };
// TODO(p): Maybe make FivIoProfile a referencable type,
// then loaders could store it in their closures.
struct _FivIoRenderClosure { struct _FivIoRenderClosure {
/// The rendering is allowed to fail, returning NULL. /// The rendering is allowed to fail, returning NULL.
FivIoImage *(*render)(FivIoRenderClosure *, double scale); FivIoImage *(*render)(FivIoRenderClosure *, FivIoProfile, double scale);
void (*destroy)(FivIoRenderClosure *); void (*destroy)(FivIoRenderClosure *);
}; };

View File

@ -139,6 +139,7 @@ render(GFile *target, GBytes *data, gboolean *color_managed, GError **error)
{ {
FivIoOpenContext ctx = { FivIoOpenContext ctx = {
.uri = g_file_get_uri(target), .uri = g_file_get_uri(target),
// Remember to synchronize changes with adjust_thumbnail().
.screen_profile = fiv_io_profile_new_sRGB(), .screen_profile = fiv_io_profile_new_sRGB(),
.screen_dpi = 96, .screen_dpi = 96,
.first_frame_only = TRUE, .first_frame_only = TRUE,
@ -180,8 +181,12 @@ adjust_thumbnail(FivIoImage *thumbnail, double row_height)
// Vector images should not have orientation, this should handle them all. // Vector images should not have orientation, this should handle them all.
FivIoRenderClosure *closure = thumbnail->render; FivIoRenderClosure *closure = thumbnail->render;
if (closure && orientation <= FivIoOrientation0) { if (closure && orientation <= FivIoOrientation0) {
// Remember to synchronize changes with render().
FivIoProfile screen_profile = fiv_io_profile_new_sRGB();
// This API doesn't accept non-uniform scaling; prefer a vertical fit. // This API doesn't accept non-uniform scaling; prefer a vertical fit.
FivIoImage *scaled = closure->render(closure, scale_y); FivIoImage *scaled = closure->render(closure, screen_profile, scale_y);
if (screen_profile)
fiv_io_profile_free(screen_profile);
if (scaled) if (scaled)
return scaled; return scaled;
} }

View File

@ -409,7 +409,8 @@ prescale_page(FivView *self)
// If it fails, the previous frame pointer may become invalid. // If it fails, the previous frame pointer may become invalid.
g_clear_pointer(&self->page_scaled, fiv_io_image_unref); g_clear_pointer(&self->page_scaled, fiv_io_image_unref);
self->frame = self->page_scaled = closure->render(closure, self->scale); self->frame = self->page_scaled = closure->render(closure,
self->enable_cms ? self->screen_cms_profile : NULL, self->scale);
if (!self->page_scaled) if (!self->page_scaled)
self->frame = self->page; self->frame = self->page;
} }