diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2024-01-26 21:58:18 +0100 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2024-01-28 01:48:28 +0100 |
commit | 604594a8f1d048b516120ba98eba71302e2043b4 (patch) | |
tree | 22e2923cadd1413503d1527bb10efbaaf1c09d81 /fiv-io.h | |
parent | 9acab00bcc53d3adc52f1681d733e57dcb3c3f0d (diff) | |
download | fiv-604594a8f1d048b516120ba98eba71302e2043b4.tar.gz fiv-604594a8f1d048b516120ba98eba71302e2043b4.tar.xz fiv-604594a8f1d048b516120ba98eba71302e2043b4.zip |
Prepare for parallelized colour management
This rewrite is more or less necessary for:
- colour-managed browser thumbnails,
- asynchronous image loading,
- turning fiv-io into a reusable library.
Little CMS has a fairly terrible API in this regard.
Diffstat (limited to 'fiv-io.h')
-rw-r--r-- | fiv-io.h | 55 |
1 files changed, 33 insertions, 22 deletions
@@ -25,41 +25,50 @@ typedef enum _FivIoOrientation FivIoOrientation; typedef struct _FivIoRenderClosure FivIoRenderClosure; typedef struct _FivIoImage FivIoImage; +typedef struct _FivIoProfile FivIoProfile; // --- Colour management ------------------------------------------------------- +// Note that without a CMM, all FivIoCmm and FivIoProfile will be returned NULL. -void fiv_io_profile_init(void); - -// TODO(p): Make it also possible to use Skia's skcms. -typedef void *FivIoProfile; -FivIoProfile *fiv_io_profile_new(const void *data, size_t len); -FivIoProfile *fiv_io_profile_new_from_bytes(GBytes *bytes); -FivIoProfile *fiv_io_profile_new_sRGB(void); -FivIoProfile *fiv_io_profile_new_sRGB_gamma(double gamma); -FivIoProfile *fiv_io_profile_new_parametric( - double gamma, double whitepoint[2], double primaries[6]); GBytes *fiv_io_profile_to_bytes(FivIoProfile *profile); void fiv_io_profile_free(FivIoProfile *self); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +#define FIV_TYPE_IO_CMM (fiv_io_cmm_get_type()) +G_DECLARE_FINAL_TYPE(FivIoCmm, fiv_io_cmm, FIV, IO_CMM, GObject) + +FivIoCmm *fiv_io_cmm_get_default(void); + +FivIoProfile *fiv_io_cmm_get_profile( + FivIoCmm *self, const void *data, size_t len); +FivIoProfile *fiv_io_cmm_get_profile_from_bytes(FivIoCmm *self, GBytes *bytes); +FivIoProfile *fiv_io_cmm_get_profile_sRGB(FivIoCmm *self); +FivIoProfile *fiv_io_cmm_get_profile_sRGB_gamma(FivIoCmm *self, double gamma); +FivIoProfile *fiv_io_cmm_get_profile_parametric( + FivIoCmm *self, double gamma, double whitepoint[2], double primaries[6]); + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + void fiv_io_premultiply_argb32(FivIoImage *image); -void fiv_io_profile_cmyk( +void fiv_io_cmm_cmyk(FivIoCmm *self, FivIoImage *image, FivIoProfile *source, FivIoProfile *target); -void fiv_io_profile_4x16le_direct(unsigned char *data, +void fiv_io_cmm_4x16le_direct(FivIoCmm *self, unsigned char *data, int w, int h, FivIoProfile *source, FivIoProfile *target); -void fiv_io_profile_argb32_premultiply( - FivIoImage *image, FivIoProfile *source, FivIoProfile *target); -void fiv_io_profile_page(FivIoImage *page, FivIoProfile *target, - void (*frame_cb) (FivIoImage *, FivIoProfile *, FivIoProfile *)); -#define fiv_io_profile_argb32_premultiply_page(page, target) \ - fiv_io_profile_page((page), (target), fiv_io_profile_argb32_premultiply) +void fiv_io_cmm_argb32_premultiply(FivIoCmm *self, + FivIoImage *image, FivIoProfile *source, FivIoProfile *target); +#define fiv_io_cmm_argb32_premultiply_page(cmm, page, target) \ + fiv_io_cmm_page((cmm), (page), (target), fiv_io_cmm_argb32_premultiply) -void fiv_io_profile_any( +void fiv_io_cmm_page(FivIoCmm *self, FivIoImage *page, FivIoProfile *target, + void (*frame_cb) (FivIoCmm *, + FivIoImage *, FivIoProfile *, FivIoProfile *)); +void fiv_io_cmm_any(FivIoCmm *self, FivIoImage *image, FivIoProfile *source, FivIoProfile *target); -FivIoImage *fiv_io_profile_finalize(FivIoImage *image, FivIoProfile *target); +FivIoImage *fiv_io_cmm_finish(FivIoCmm *self, + FivIoImage *image, FivIoProfile *target); // --- Loading ----------------------------------------------------------------- @@ -84,7 +93,8 @@ enum _FivIoOrientation { // then loaders could store it in their closures. struct _FivIoRenderClosure { /// The rendering is allowed to fail, returning NULL. - FivIoImage *(*render)(FivIoRenderClosure *, FivIoProfile *, double scale); + FivIoImage *(*render)( + FivIoRenderClosure *, FivIoCmm *, FivIoProfile *, double scale); void (*destroy)(FivIoRenderClosure *); }; @@ -155,7 +165,8 @@ cairo_surface_t *fiv_io_image_to_surface_noref(const FivIoImage *image); typedef struct { const char *uri; ///< Source URI - FivIoProfile screen_profile; ///< Target colour space or NULL + FivIoCmm *cmm; ///< Colour management module or NULL + FivIoProfile *screen_profile; ///< Target colour space or NULL int screen_dpi; ///< Target DPI gboolean enhance; ///< Enhance JPEG (currently) gboolean first_frame_only; ///< Only interested in the 1st frame |