diff options
-rw-r--r-- | source/blender/blenkernel/BKE_colortools.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/SConscript | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 36 | ||||
-rw-r--r-- | source/blender/editors/space_image/SConscript | 7 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_draw.c | 21 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_header.c | 7 | ||||
-rw-r--r-- | source/blender/imbuf/IMB_imbuf_types.h | 1 | ||||
-rw-r--r-- | source/blender/imbuf/intern/allocimbuf.c | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_space_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 1 | ||||
-rw-r--r-- | tools/Blender.py | 3 | ||||
-rwxr-xr-x | tools/btools.py | 4 |
12 files changed, 87 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h index 555b467b1d6..6f6c4a834df 100644 --- a/source/blender/blenkernel/BKE_colortools.h +++ b/source/blender/blenkernel/BKE_colortools.h @@ -58,6 +58,7 @@ void curvemapping_premultiply(struct CurveMapping *cumap, int restore); int curvemapping_RGBA_does_something(struct CurveMapping *cumap); void curvemapping_initialize(struct CurveMapping *cumap); void curvemapping_table_RGBA(struct CurveMapping *cumap, float **array, int *size); +void colorcorrection_do_ibuf(struct ImBuf *ibuf, const char *profile); #endif diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index 19d150b34a8..dbc990d0613 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -55,6 +55,9 @@ if env['WITH_BF_BULLET']: if env['BF_NO_ELBEEM']: defs.append('DISABLE_ELBEEM') +if env['WITH_BF_LCMS']: + defs.append('WITH_LCMS') + if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index 1bc34aea9a1..e8716aba296 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -32,6 +32,10 @@ #include <stdlib.h> #include <float.h> +#ifdef WITH_LCMS +#include <lcms.h> +#endif + #include "MEM_guardedalloc.h" #include "DNA_color_types.h" @@ -650,6 +654,38 @@ void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float *vecout, const vecout[2]= curvemap_evaluateF(cumap->cm+2, fac); } +void colorcorrection_do_ibuf(ImBuf *ibuf, const char *profile) +{ + if (ibuf->crect == NULL) + { +#ifdef WITH_LCMS + cmsHPROFILE imageProfile, proofingProfile; + cmsHTRANSFORM hTransform; + + ibuf->crect = MEM_mallocN(ibuf->x*ibuf->y*sizeof(int), "imbuf crect"); + + imageProfile = cmsCreate_sRGBProfile(); + proofingProfile = cmsOpenProfileFromFile(profile, "r"); + + cmsErrorAction(LCMS_ERROR_SHOW); + + hTransform = cmsCreateProofingTransform(imageProfile, TYPE_RGBA_8, imageProfile, TYPE_RGBA_8, + proofingProfile, + INTENT_ABSOLUTE_COLORIMETRIC, + INTENT_ABSOLUTE_COLORIMETRIC, + cmsFLAGS_SOFTPROOFING); + + cmsDoTransform(hTransform, ibuf->rect, ibuf->crect, ibuf->x * ibuf->y); + + cmsDeleteTransform(hTransform); + cmsCloseProfile(imageProfile); + cmsCloseProfile(proofingProfile); +#else + ibuf->crect = ibuf->rect; +#endif + } +} + void curvemapping_do_ibuf(CurveMapping *cumap, ImBuf *ibuf) { diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript index 3ae638d344d..e7041ef0458 100644 --- a/source/blender/editors/space_image/SConscript +++ b/source/blender/editors/space_image/SConscript @@ -7,4 +7,9 @@ incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../render/extern/include ../../makesrna' -env.BlenderLib ( 'bf_editors_space_image', sources, Split(incs), [], libtype=['core'], priority=[40] ) +defs = [] + +if env['WITH_BF_LCMS']: + defs.append('WITH_LCMS') + +env.BlenderLib ( 'bf_editors_space_image', sources, Split(incs), defs, libtype=['core'], priority=[40] ) diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index b9407d26352..122e298baaa 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -117,10 +117,12 @@ static void image_verify_buffer_float(SpaceImage *sima, ImBuf *ibuf) if(ibuf->rect_float) { if(ibuf->rect==NULL) { - if(image_curves_active(sima)) + if(image_curves_active(sima)) { curvemapping_do_ibuf(sima->cumap, ibuf); - else + } + else { IMB_rect_from_float(ibuf); + } } } } @@ -309,6 +311,13 @@ static void sima_draw_alpha_pixelsf(float x1, float y1, int rectx, int recty, fl // glColorMask(1, 1, 1, 1); } +static void sima_draw_colorcorrected_pixels(float x1, float y1, ImBuf *ibuf) +{ + colorcorrection_do_ibuf(ibuf, "MONOSCNR.ICM"); /* path is hardcoded here, find some place better */ + + glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->crect); +} + static void sima_draw_zbuf_pixels(float x1, float y1, int rectx, int recty, int *recti) { /* zbuffer values are signed, so we need to shift color range */ @@ -386,6 +395,14 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, ImBuf else if(ibuf->channels==1) sima_draw_zbuffloat_pixels(scene, x, y, ibuf->x, ibuf->y, ibuf->rect_float); } +#ifdef WITH_LCMS + else if(sima->flag & SI_COLOR_CORRECTION) { + image_verify_buffer_float(sima, ibuf); + + sima_draw_colorcorrected_pixels(x, y, ibuf); + + } +#endif else { if(sima->flag & SI_USE_ALPHA) { sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy); diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index a584993005a..7a28499009b 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -907,8 +907,12 @@ void image_header_buttons(const bContext *C, ARegion *ar) xco+= XIC; } } +#ifdef WITH_LCMS + uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_COLOR_CORRECTION, 0, 0, NULL); + xco+= XIC; +#endif xco+= 8; - + /* record & play */ uiBlockBeginAlign(block); if(ima->type==IMA_TYPE_COMPOSITE) { @@ -921,6 +925,7 @@ void image_header_buttons(const bContext *C, ARegion *ar) } uiBlockEndAlign(block); xco+= 8; + } /* draw lock */ diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 3cc155af1ad..79da0cb1c41 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -83,6 +83,7 @@ typedef struct ImBuf { int ftype; /**< File type we are going to save as */ unsigned int *cmap; /**< Color map data. */ unsigned int *rect; /**< pixel values stored here */ + unsigned int *crect; /**< color corrected pixel values stored here */ unsigned int **planes; /**< bitplanes */ int flags; /**< Controls which components should exist. */ int mall; /**< what is malloced internal, and can be freed */ diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c index ad7b1dce2e0..b561f0a583d 100644 --- a/source/blender/imbuf/intern/allocimbuf.c +++ b/source/blender/imbuf/intern/allocimbuf.c @@ -93,6 +93,10 @@ void imb_freerectImBuf(struct ImBuf * ibuf) { if (ibuf==NULL) return; + if (ibuf->crect && ibuf->crect != ibuf->rect) { + MEM_freeN(ibuf->crect); + } + if (ibuf->rect) { if (ibuf->mall & IB_rect) { MEM_freeN(ibuf->rect); @@ -102,6 +106,7 @@ void imb_freerectImBuf(struct ImBuf * ibuf) imb_freemipmapImBuf(ibuf); ibuf->rect= NULL; + ibuf->crect= NULL; ibuf->mall &= ~IB_rect; } diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 0e19a6845da..0d88e3eb6e8 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -577,6 +577,8 @@ typedef struct SpaceImaSel { #define SI_DISPGP 1<<22 #define SI_DRAW_OTHER 1<<23 +#define SI_COLOR_CORRECTION 1<<24 + /* SpaceIpo->flag (Graph Editor Settings) */ #define SIPO_LOCK_VIEW (1<<0) #define SIPO_NOTRANSKEYCULL (1<<1) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 229a260efce..2b5c3a621b4 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -260,6 +260,7 @@ static void rna_def_space_image(BlenderRNA *brna) {SI_USE_ALPHA, "COLOR_ALPHA", "Color and Alpha", "Draw image with RGB colors and alpha transparency."}, {SI_SHOW_ALPHA, "ALPHA", "Alpha", "Draw alpha transparency channel."}, {SI_SHOW_ZBUF, "Z_BUFFER", "Z-Buffer", "Draw Z-buffer associated with image (mapped from camera clip start to end)."}, + {SI_COLOR_CORRECTION, "COLOR_CORRECTED", "Color Corrected", "Display color corrected image."}, {0, NULL, NULL, NULL}}; srna= RNA_def_struct(brna, "SpaceImageEditor", "Space"); diff --git a/tools/Blender.py b/tools/Blender.py index 6ffc0b8d76d..ce5570ebd45 100644 --- a/tools/Blender.py +++ b/tools/Blender.py @@ -188,6 +188,9 @@ def setup_syslibs(lenv): syslibs += Split(lenv['BF_OPENGL_LIB']) if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw','linuxcross', 'win64-vc'): syslibs += Split(lenv['BF_PTHREADS_LIB']) + if lenv['WITH_BF_LCMS']: + syslibs.append(lenv['BF_LCMS_LIB']) + syslibs += lenv['LLIBS'] diff --git a/tools/btools.py b/tools/btools.py index 2c9b564b8a1..bd646a2f3eb 100755 --- a/tools/btools.py +++ b/tools/btools.py @@ -61,6 +61,7 @@ def validate_arguments(args, bc): 'BF_FANCY', 'BF_QUIET', 'BF_X264_CONFIG', 'BF_XVIDCORE_CONFIG', + 'WITH_BF_LCMS', 'BF_LCMS_LIB', 'WITH_BF_DOCS', 'BF_NUMJOBS', ] @@ -353,6 +354,9 @@ def read_opts(cfg, args): (BoolVariable('BF_FANCY', 'Enable fancy output if true', True)), (BoolVariable('BF_QUIET', 'Enable silent output if true', True)), (BoolVariable('WITH_BF_BINRELOC', 'Enable relocatable binary (linux only)', False)), + + (BoolVariable('WITH_BF_LCMS', 'Enable color correction with lcms', False)), + ('BF_LCMS_LIB', 'LCMSlibrary', 'lcms'), ('BF_X264_CONFIG', 'configuration flags for x264', ''), ('BF_XVIDCORE_CONFIG', 'configuration flags for xvidcore', ''), |