diff options
Diffstat (limited to 'source/blender/editors/space_image/image_draw.c')
-rw-r--r-- | source/blender/editors/space_image/image_draw.c | 478 |
1 files changed, 189 insertions, 289 deletions
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 8cb23c9e021..23c4fbbe45e 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -60,9 +60,12 @@ #include "BKE_image.h" #include "BKE_paint.h" -#include "BIF_gl.h" #include "BIF_glutil.h" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" + #include "BLF_api.h" #include "ED_gpencil.h" @@ -87,7 +90,6 @@ static void draw_render_info(const bContext *C, float zoomx, float zoomy) { - RenderResult *rr; Render *re = RE_GetSceneRender(scene); RenderData *rd = RE_engine_get_render_data(re); Scene *stats_scene = ED_render_job_get_scene(C); @@ -95,7 +97,7 @@ static void draw_render_info(const bContext *C, stats_scene = CTX_data_scene(C); } - rr = BKE_image_acquire_renderresult(stats_scene, ima); + RenderResult *rr = BKE_image_acquire_renderresult(stats_scene, ima); if (rr && rr->text) { float fill_color[4] = {0.0f, 0.0f, 0.0f, 0.25f}; @@ -107,39 +109,41 @@ static void draw_render_info(const bContext *C, if (re) { int total_tiles; bool need_free_tiles; - rcti *tiles; - - tiles = RE_engine_get_current_tiles(re, &total_tiles, &need_free_tiles); + rcti *tiles = RE_engine_get_current_tiles(re, &total_tiles, &need_free_tiles); if (total_tiles) { - int i, x, y; - rcti *tile; - /* find window pixel coordinates of origin */ + int x, y; UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &x, &y); - glPushMatrix(); - glTranslatef(x, y, 0.0f); - glScalef(zoomx, zoomy, 1.0f); + gpuPushMatrix(); + gpuTranslate2f(x, y); + gpuScale2f(zoomx, zoomy); if (rd->mode & R_BORDER) { - glTranslatef((int)(-rd->border.xmin * rd->xsch * rd->size / 100.0f), - (int)(-rd->border.ymin * rd->ysch * rd->size / 100.0f), - 0.0f); + /* TODO: round or floor instead of casting to int */ + gpuTranslate2f((int)(-rd->border.xmin * rd->xsch * rd->size * 0.01f), + (int)(-rd->border.ymin * rd->ysch * rd->size * 0.01f)); } - UI_ThemeColor(TH_FACE_SELECT); + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immUniformThemeColor(TH_FACE_SELECT); glLineWidth(1.0f); - for (i = 0, tile = tiles; i < total_tiles; i++, tile++) { - glaDrawBorderCorners(tile, zoomx, zoomy); + + rcti *tile = tiles; + for (int i = 0; i < total_tiles; i++, tile++) { + immDrawBorderCorners(pos, tile, zoomx, zoomy); } + immUnbindProgram(); + if (need_free_tiles) { MEM_freeN(tiles); } - glPopMatrix(); + gpuPopMatrix(); } } } @@ -169,28 +173,34 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + /* noisy, high contrast make impossible to read if lower alpha is used. */ - glColor4ub(0, 0, 0, 190); - glRecti(0.0, 0.0, BLI_rcti_size_x(&ar->winrct) + 1, UI_UNIT_Y); + immUniformColor4ub(0, 0, 0, 190); + immRecti(pos, 0, 0, BLI_rcti_size_x(&ar->winrct) + 1, UI_UNIT_Y); + + immUnbindProgram(); + glDisable(GL_BLEND); BLF_size(blf_mono_font, 11 * U.pixelsize, U.dpi); - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); BLI_snprintf(str, sizeof(str), "X:%-4d Y:%-4d |", x, y); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str, sizeof(str)); if (zp) { - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); BLI_snprintf(str, sizeof(str), " Z:%-.4f |", 0.5f + 0.5f * (((float)*zp) / (float)0x7fffffff)); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str, sizeof(str)); } if (zpf) { - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); BLI_snprintf(str, sizeof(str), " Z:%-.3f |", *zpf); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); @@ -204,14 +214,14 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d else if (cp != NULL) { BLI_snprintf(str, sizeof(str), " Val:%-.3f |", cp[0] / 255.0f); } - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str, sizeof(str)); } if (channels >= 3) { - glColor3ubv(red); + BLF_color3ubv(blf_mono_font, red); if (fp) BLI_snprintf(str, sizeof(str), " R:%-.5f", fp[0]); else if (cp) @@ -222,7 +232,7 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str, sizeof(str)); - glColor3ubv(green); + BLF_color3ubv(blf_mono_font, green); if (fp) BLI_snprintf(str, sizeof(str), " G:%-.5f", fp[1]); else if (cp) @@ -233,7 +243,7 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str, sizeof(str)); - glColor3ubv(blue); + BLF_color3ubv(blf_mono_font, blue); if (fp) BLI_snprintf(str, sizeof(str), " B:%-.5f", fp[2]); else if (cp) @@ -245,7 +255,7 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d dx += BLF_width(blf_mono_font, str, sizeof(str)); if (channels == 4) { - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); if (fp) BLI_snprintf(str, sizeof(str), " A:%-.4f", fp[3]); else if (cp) @@ -267,9 +277,9 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d rgba[3] = linearcol[3]; if (use_default_view) - IMB_colormanagement_pixel_to_display_space_v4(rgba, rgba, NULL, &scene->display_settings); + IMB_colormanagement_pixel_to_display_space_v4(rgba, rgba, NULL, &scene->display_settings); else - IMB_colormanagement_pixel_to_display_space_v4(rgba, rgba, &scene->view_settings, &scene->display_settings); + IMB_colormanagement_pixel_to_display_space_v4(rgba, rgba, &scene->view_settings, &scene->display_settings); BLI_snprintf(str, sizeof(str), " | CM R:%-.4f G:%-.4f B:%-.4f", rgba[0], rgba[1], rgba[2]); BLF_position(blf_mono_font, dx, dy, 0); @@ -305,9 +315,9 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d if (color_manage) { if (use_default_view) - IMB_colormanagement_pixel_to_display_space_v4(finalcol, col, NULL, &scene->display_settings); + IMB_colormanagement_pixel_to_display_space_v4(finalcol, col, NULL, &scene->display_settings); else - IMB_colormanagement_pixel_to_display_space_v4(finalcol, col, &scene->view_settings, &scene->display_settings); + IMB_colormanagement_pixel_to_display_space_v4(finalcol, col, &scene->view_settings, &scene->display_settings); } else { copy_v4_v4(finalcol, col); @@ -318,13 +328,18 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d BLI_rcti_init(&color_rect, dx, dx + (1.5f * UI_UNIT_X), 0.15f * UI_UNIT_Y, 0.85f * UI_UNIT_Y); + /* BLF uses immediate mode too, so we must reset our vertex format */ + pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + if (channels == 4) { rcti color_rect_half; int color_quater_x, color_quater_y; color_rect_half = color_rect; color_rect_half.xmax = BLI_rcti_cent_x(&color_rect); - glRecti(color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); + /* what color ??? */ + immRecti(pos, color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); color_rect_half = color_rect; color_rect_half.xmin = BLI_rcti_cent_x(&color_rect); @@ -332,31 +347,34 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d color_quater_x = BLI_rcti_cent_x(&color_rect_half); color_quater_y = BLI_rcti_cent_y(&color_rect_half); - glColor4ub(UI_ALPHA_CHECKER_DARK, UI_ALPHA_CHECKER_DARK, UI_ALPHA_CHECKER_DARK, 255); - glRecti(color_rect_half.xmin, color_rect_half.ymin, color_rect_half.xmax, color_rect_half.ymax); + immUniformColor3ub(UI_ALPHA_CHECKER_DARK, UI_ALPHA_CHECKER_DARK, UI_ALPHA_CHECKER_DARK); + immRecti(pos, color_rect_half.xmin, color_rect_half.ymin, color_rect_half.xmax, color_rect_half.ymax); - glColor4ub(UI_ALPHA_CHECKER_LIGHT, UI_ALPHA_CHECKER_LIGHT, UI_ALPHA_CHECKER_LIGHT, 255); - glRecti(color_quater_x, color_quater_y, color_rect_half.xmax, color_rect_half.ymax); - glRecti(color_rect_half.xmin, color_rect_half.ymin, color_quater_x, color_quater_y); + immUniformColor3ub(UI_ALPHA_CHECKER_LIGHT, UI_ALPHA_CHECKER_LIGHT, UI_ALPHA_CHECKER_LIGHT); + immRecti(pos, color_quater_x, color_quater_y, color_rect_half.xmax, color_rect_half.ymax); + immRecti(pos, color_rect_half.xmin, color_rect_half.ymin, color_quater_x, color_quater_y); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4f(UNPACK3(finalcol), fp ? fp[3] : (cp[3] / 255.0f)); - glRecti(color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); + immUniformColor3fvAlpha(finalcol, fp ? fp[3] : (cp[3] / 255.0f)); + immRecti(pos, color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); glDisable(GL_BLEND); } else { - glColor3fv(finalcol); - glRecti(color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); + immUniformColor3fv(finalcol); + immRecti(pos, color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); } + immUnbindProgram(); /* draw outline */ - glColor3ub(128, 128, 128); - sdrawbox(color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); + pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immUniformColor3ub(128, 128, 128); + imm_draw_box_wire_2d(pos, color_rect.xmin, color_rect.ymin, color_rect.xmax, color_rect.ymax); + immUnbindProgram(); dx += 1.75f * UI_UNIT_X; - glColor3ub(255, 255, 255); + BLF_color3ub(blf_mono_font, 255, 255, 255); if (channels == 1) { if (fp) { rgb_to_hsv(fp[0], fp[0], fp[0], &hue, &sat, &val); @@ -375,7 +393,6 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d BLI_snprintf(str, sizeof(str), " L:%-.4f", lum); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); - dx += BLF_width(blf_mono_font, str, sizeof(str)); } else if (channels >= 3) { rgb_to_hsv(finalcol[0], finalcol[1], finalcol[2], &hue, &sat, &val); @@ -399,70 +416,37 @@ void ED_image_draw_info(Scene *scene, ARegion *ar, bool color_manage, bool use_d BLI_snprintf(str, sizeof(str), " L:%-.4f", lum); BLF_position(blf_mono_font, dx, dy, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); - dx += BLF_width(blf_mono_font, str, sizeof(str)); } - - (void)dx; } /* image drawing */ - -static void sima_draw_alpha_pixels(float x1, float y1, int rectx, int recty, unsigned int *recti) +static void sima_draw_zbuf_pixels(float x1, float y1, int rectx, int recty, int *rect, + float zoomx, float zoomy) { - - /* swap bytes, so alpha is most significant one, then just draw it as luminance int */ - if (ENDIAN_ORDER == B_ENDIAN) - glPixelStorei(GL_UNPACK_SWAP_BYTES, 1); + float red[4] = {1.0f, 0.0f, 0.0f, 0.0f}; - glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_LUMINANCE, GL_UNSIGNED_INT, recti); - glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); -} + /* Slowwww */ + int *recti = MEM_mallocN(rectx * recty * sizeof(int), "temp"); + for (int a = rectx * recty - 1; a >= 0; a--) { + /* zbuffer values are signed, so we need to shift color range */ + recti[a] = rect[a] * 0.5f + 0.5f; + } -static void sima_draw_alpha_pixelsf(float x1, float y1, int rectx, int recty, float *rectf) -{ - float *trectf = MEM_mallocN(rectx * recty * 4, "temp"); - int a, b; - - for (a = rectx * recty - 1, b = 4 * a + 3; a >= 0; a--, b -= 4) - trectf[a] = rectf[b]; - - glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_LUMINANCE, GL_FLOAT, trectf); - MEM_freeN(trectf); - /* ogl trick below is slower... (on ATI 9600) */ -// glColorMask(1, 0, 0, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 3); -// glColorMask(0, 1, 0, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 2); -// glColorMask(0, 0, 1, 0); -// glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_RGBA, GL_FLOAT, rectf + 1); -// glColorMask(1, 1, 1, 1); -} + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); + GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red); -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 */ - glPixelTransferf(GL_RED_SCALE, 0.5f); - glPixelTransferf(GL_GREEN_SCALE, 0.5f); - glPixelTransferf(GL_BLUE_SCALE, 0.5f); - glPixelTransferf(GL_RED_BIAS, 0.5f); - glPixelTransferf(GL_GREEN_BIAS, 0.5f); - glPixelTransferf(GL_BLUE_BIAS, 0.5f); - - glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_LUMINANCE, GL_INT, recti); - - glPixelTransferf(GL_RED_SCALE, 1.0f); - glPixelTransferf(GL_GREEN_SCALE, 1.0f); - glPixelTransferf(GL_BLUE_SCALE, 1.0f); - glPixelTransferf(GL_RED_BIAS, 0.0f); - glPixelTransferf(GL_GREEN_BIAS, 0.0f); - glPixelTransferf(GL_BLUE_BIAS, 0.0f); + immDrawPixelsTex(&state, x1, y1, rectx, recty, GL_RED, GL_INT, GL_NEAREST, recti, zoomx, zoomy, NULL); + + MEM_freeN(recti); } -static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rectx, int recty, float *rect_float) +static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rectx, int recty, + float *rect_float, float zoomx, float zoomy) { float bias, scale, *rectf, clipend; int a; - + float red[4] = {1.0f, 0.0f, 0.0f, 0.0f}; + if (scene->camera && scene->camera->type == OB_CAMERA) { bias = ((Camera *)scene->camera->data)->clipsta; clipend = ((Camera *)scene->camera->data)->clipend; @@ -473,8 +457,8 @@ static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rec scale = 0.01f; clipend = 100.0f; } - - rectf = MEM_mallocN(rectx * recty * 4, "temp"); + + rectf = MEM_mallocN(rectx * recty * sizeof(float), "temp"); for (a = rectx * recty - 1; a >= 0; a--) { if (rect_float[a] > clipend) rectf[a] = 0.0f; @@ -485,92 +469,85 @@ static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rec rectf[a] *= rectf[a]; } } - glaDrawPixelsSafe(x1, y1, rectx, recty, rectx, GL_LUMINANCE, GL_FLOAT, rectf); - - MEM_freeN(rectf); -} -static int draw_image_channel_offset(SpaceImage *sima) -{ -#ifdef __BIG_ENDIAN__ - if (sima->flag & SI_SHOW_R) return 0; - else if (sima->flag & SI_SHOW_G) return 1; - else return 2; -#else - if (sima->flag & SI_SHOW_R) return 1; - else if (sima->flag & SI_SHOW_G) return 2; - else return 3; -#endif + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); + GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red); + + immDrawPixelsTex(&state, x1, y1, rectx, recty, GL_RED, GL_FLOAT, GL_NEAREST, rectf, zoomx, zoomy, NULL); + + MEM_freeN(rectf); } static void draw_image_buffer(const bContext *C, SpaceImage *sima, ARegion *ar, Scene *scene, ImBuf *ibuf, float fx, float fy, float zoomx, float zoomy) { int x, y; - /* set zoom */ - glPixelZoom(zoomx, zoomy); - glaDefine2DArea(&ar->winrct); /* find window pixel coordinates of origin */ UI_view2d_view_to_region(&ar->v2d, fx, fy, &x, &y); /* this part is generic image display */ - if (sima->flag & SI_SHOW_ALPHA) { - if (ibuf->rect) - sima_draw_alpha_pixels(x, y, ibuf->x, ibuf->y, ibuf->rect); - else if (ibuf->rect_float && ibuf->channels == 4) - sima_draw_alpha_pixelsf(x, y, ibuf->x, ibuf->y, ibuf->rect_float); - } - else if (sima->flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { + if (sima->flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { if (ibuf->zbuf) - sima_draw_zbuf_pixels(x, y, ibuf->x, ibuf->y, ibuf->zbuf); + sima_draw_zbuf_pixels(x, y, ibuf->x, ibuf->y, ibuf->zbuf, zoomx, zoomy); else if (ibuf->zbuf_float) - sima_draw_zbuffloat_pixels(scene, x, y, ibuf->x, ibuf->y, ibuf->zbuf_float); + sima_draw_zbuffloat_pixels(scene, x, y, ibuf->x, ibuf->y, ibuf->zbuf_float, zoomx, zoomy); else if (ibuf->channels == 1) - sima_draw_zbuffloat_pixels(scene, x, y, ibuf->x, ibuf->y, ibuf->rect_float); + sima_draw_zbuffloat_pixels(scene, x, y, ibuf->x, ibuf->y, ibuf->rect_float, zoomx, zoomy); } else { + int clip_max_x, clip_max_y; + UI_view2d_view_to_region(&ar->v2d, + ar->v2d.cur.xmax, ar->v2d.cur.ymax, + &clip_max_x, &clip_max_y); + if (sima->flag & SI_USE_ALPHA) { + imm_draw_box_checker_2d(x, y, x + ibuf->x * zoomx, y + ibuf->y * zoomy); + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - fdrawcheckerboard(x, y, x + ibuf->x * zoomx, y + ibuf->y * zoomy); } - if ((sima->flag & (SI_SHOW_R | SI_SHOW_G | SI_SHOW_B)) == 0) { - int clip_max_x, clip_max_y; - UI_view2d_view_to_region(&ar->v2d, - ar->v2d.cur.xmax, ar->v2d.cur.ymax, - &clip_max_x, &clip_max_y); + /* If RGBA display with color management */ + if ((sima->flag & (SI_SHOW_R | SI_SHOW_G | SI_SHOW_B | SI_SHOW_ALPHA)) == 0) { + glaDrawImBuf_glsl_ctx_clipping(C, ibuf, x, y, GL_NEAREST, - 0, 0, clip_max_x, clip_max_y); + 0, 0, clip_max_x, clip_max_y, zoomx, zoomy); } else { + float shuffle[4] = {0.0f, 0.0f, 0.0f, 0.0f}; unsigned char *display_buffer; void *cache_handle; - - /* TODO(sergey): Ideally GLSL shading should be capable of either - * disabling some channels or displaying buffer with custom offset. - */ - display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); - - if (display_buffer != NULL) { - int channel_offset = draw_image_channel_offset(sima); - glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_LUMINANCE, GL_UNSIGNED_INT, - display_buffer - (4 - channel_offset)); - } - if (cache_handle != NULL) { - IMB_display_buffer_release(cache_handle); + ColorManagedViewSettings *view_settings; + ColorManagedDisplaySettings *display_settings; + + if (sima->flag & SI_SHOW_R) + shuffle[0] = 1.0f; + else if (sima->flag & SI_SHOW_G) + shuffle[1] = 1.0f; + else if (sima->flag & SI_SHOW_B) + shuffle[2] = 1.0f; + else if (sima->flag & SI_SHOW_ALPHA) + shuffle[3] = 1.0f; + + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); + GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, shuffle); + + IMB_colormanagement_display_settings_from_ctx(C, &view_settings, &display_settings); + display_buffer = IMB_display_buffer_acquire(ibuf, view_settings, display_settings, &cache_handle); + + if (display_buffer) { + immDrawPixelsTex_clipping(&state, x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, display_buffer, + 0, 0, clip_max_x, clip_max_y, zoomx, zoomy, NULL); } + + IMB_display_buffer_release(cache_handle); } if (sima->flag & SI_USE_ALPHA) glDisable(GL_BLEND); } - - /* reset zoom */ - glPixelZoom(1.0f, 1.0f); } static unsigned int *get_part_from_buffer(unsigned int *buffer, int width, short startx, short starty, short endx, short endy) @@ -601,7 +578,7 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene, unsigned int *rect; int dx, dy, sx, sy, x, y; void *cache_handle; - int channel_offset = -1; + float shuffle[4] = {0.0f, 0.0f, 0.0f, 0.0f}; /* verify valid values, just leave this a while */ if (ima->xrep < 1) return; @@ -615,8 +592,6 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene, if (!display_buffer) return; - glPixelZoom(zoomx, zoomy); - if (sima->curtile >= ima->xrep * ima->yrep) sima->curtile = ima->xrep * ima->yrep - 1; @@ -628,24 +603,34 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene, rect = get_part_from_buffer((unsigned int *)display_buffer, ibuf->x, sx, sy, sx + dx, sy + dy); /* draw repeated */ - if ((sima->flag & (SI_SHOW_R | SI_SHOW_G | SI_SHOW_B)) != 0) { - channel_offset = draw_image_channel_offset(sima); + if ((sima->flag & (SI_SHOW_R | SI_SHOW_G | SI_SHOW_B | SI_SHOW_ALPHA)) != 0) { + if (sima->flag & SI_SHOW_R) + shuffle[0] = 1.0f; + else if (sima->flag & SI_SHOW_G) + shuffle[1] = 1.0f; + else if (sima->flag & SI_SHOW_B) + shuffle[2] = 1.0f; + else if (sima->flag & SI_SHOW_ALPHA) + shuffle[3] = 1.0f; } + for (sy = 0; sy + dy <= ibuf->y; sy += dy) { for (sx = 0; sx + dx <= ibuf->x; sx += dx) { UI_view2d_view_to_region(&ar->v2d, fx + (float)sx / (float)ibuf->x, fy + (float)sy / (float)ibuf->y, &x, &y); - if (channel_offset == -1) { - glaDrawPixelsSafe(x, y, dx, dy, dx, GL_RGBA, GL_UNSIGNED_BYTE, rect); + + if ((sima->flag & (SI_SHOW_R | SI_SHOW_G | SI_SHOW_B | SI_SHOW_ALPHA)) == 0) { + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR); + immDrawPixelsTex(&state, x, y, dx, dy, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, rect, zoomx, zoomy, NULL); } else { - glaDrawPixelsSafe(x, y, dx, dy, dx, GL_LUMINANCE, GL_UNSIGNED_INT, - (unsigned char *)rect - (4 - channel_offset)); + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); + GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, shuffle); + + immDrawPixelsTex(&state, x, y, dx, dy, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, rect, zoomx, zoomy, NULL); } } } - glPixelZoom(1.0f, 1.0f); - IMB_display_buffer_release(cache_handle); MEM_freeN(rect); @@ -701,134 +686,62 @@ void draw_image_sample_line(SpaceImage *sima) if (sima->sample_line_hist.flag & HISTO_FLAG_SAMPLELINE) { Histogram *hist = &sima->sample_line_hist; - glBegin(GL_LINES); - glColor3ub(0, 0, 0); - glVertex2fv(hist->co[0]); - glVertex2fv(hist->co[1]); - glEnd(); - - setlinestyle(1); - glBegin(GL_LINES); - glColor3ub(255, 255, 255); - glVertex2fv(hist->co[0]); - glVertex2fv(hist->co[1]); - glEnd(); - setlinestyle(0); - - } -} - -/* XXX becomes WM paint cursor */ -#if 0 -static void draw_image_view_tool(Scene *scene) -{ - ToolSettings *settings = scene->toolsettings; - Brush *brush = settings->imapaint.brush; - int mval[2]; - float radius; - int draw = 0; - - if (brush) { - if (settings->imapaint.flag & IMAGEPAINT_DRAWING) { - if (settings->imapaint.flag & IMAGEPAINT_DRAW_TOOL_DRAWING) - draw = 1; - } - else if (settings->imapaint.flag & IMAGEPAINT_DRAW_TOOL) - draw = 1; - - if (draw) { - getmouseco_areawin(mval); - - radius = BKE_brush_size_get(brush) * G.sima->zoom; - fdrawXORcirc(mval[0], mval[1], radius); - - if (brush->innerradius != 1.0) { - radius *= brush->innerradius; - fdrawXORcirc(mval[0], mval[1], radius); - } - } - } -} -#endif - -static unsigned char *get_alpha_clone_image(const bContext *C, Scene *scene, int *width, int *height) -{ - Brush *brush = BKE_paint_brush(&scene->toolsettings->imapaint.paint); - ImBuf *ibuf; - unsigned int size, alpha; - unsigned char *display_buffer; - unsigned char *rect, *cp; - void *cache_handle; - - if (!brush || !brush->clone.image) - return NULL; - - ibuf = BKE_image_acquire_ibuf(brush->clone.image, NULL, NULL); - - if (!ibuf) - return NULL; - - display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); + Gwn_VertFormat *format = immVertexFormat(); + unsigned int shdr_dashed_pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); - if (!display_buffer) { - BKE_image_release_ibuf(brush->clone.image, ibuf, NULL); - IMB_display_buffer_release(cache_handle); + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); - return NULL; - } + float viewport_size[4]; + glGetFloatv(GL_VIEWPORT, viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); - rect = MEM_dupallocN(display_buffer); + immUniform1i("num_colors", 2); /* Advanced dashes. */ + immUniformArray4fv("colors", (float *)(float[][4]){{1.0f, 1.0f, 1.0f, 1.0f}, {0.0f, 0.0f, 0.0f, 1.0f}}, 2); + immUniform1f("dash_width", 2.0f); - IMB_display_buffer_release(cache_handle); + immBegin(GWN_PRIM_LINES, 2); + immVertex2fv(shdr_dashed_pos, hist->co[0]); + immVertex2fv(shdr_dashed_pos, hist->co[1]); + immEnd(); - if (!rect) { - BKE_image_release_ibuf(brush->clone.image, ibuf, NULL); - return NULL; + immUnbindProgram(); } - - *width = ibuf->x; - *height = ibuf->y; - - size = (*width) * (*height); - alpha = (unsigned char)255 * brush->clone.alpha; - cp = rect; - - while (size-- > 0) { - cp[3] = alpha; - cp += 4; - } - - BKE_image_release_ibuf(brush->clone.image, ibuf, NULL); - - return rect; } static void draw_image_paint_helpers(const bContext *C, ARegion *ar, Scene *scene, float zoomx, float zoomy) { Brush *brush; - int x, y, w, h; - unsigned char *clonerect; + int x, y; + ImBuf *ibuf; brush = BKE_paint_brush(&scene->toolsettings->imapaint.paint); - if (brush && (brush->imagepaint_tool == PAINT_TOOL_CLONE)) { - /* this is not very efficient, but glDrawPixels doesn't allow - * drawing with alpha */ - clonerect = get_alpha_clone_image(C, scene, &w, &h); + if (brush && (brush->imagepaint_tool == PAINT_TOOL_CLONE) && brush->clone.image) { + ibuf = BKE_image_acquire_ibuf(brush->clone.image, NULL, NULL); - if (clonerect) { + if (ibuf) { + void *cache_handle = NULL; + float col[4] = {1.0f, 1.0f, 1.0f, brush->clone.alpha}; UI_view2d_view_to_region(&ar->v2d, brush->clone.offset[0], brush->clone.offset[1], &x, &y); - glPixelZoom(zoomx, zoomy); + unsigned char *display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); + + if (!display_buffer) { + BKE_image_release_ibuf(brush->clone.image, ibuf, NULL); + IMB_display_buffer_release(cache_handle); + return; + } glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glaDrawPixelsSafe(x, y, w, h, w, GL_RGBA, GL_UNSIGNED_BYTE, clonerect); - glDisable(GL_BLEND); - glPixelZoom(1.0, 1.0); + IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR); + immDrawPixelsTex(&state, x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, display_buffer, zoomx, zoomy, col); - MEM_freeN(clonerect); + glDisable(GL_BLEND); + + BKE_image_release_ibuf(brush->clone.image, ibuf, NULL); + IMB_display_buffer_release(cache_handle); } } } @@ -924,23 +837,6 @@ void draw_image_main(const bContext *C, ARegion *ar) if (show_paint) draw_image_paint_helpers(C, ar, scene, zoomx, zoomy); - /* XXX integrate this code */ -#if 0 - if (ibuf) { - float xoffs = 0.0f, yoffs = 0.0f; - - if (image_preview_active(sa, &xim, &yim)) { - xoffs = scene->r.disprect.xmin; - yoffs = scene->r.disprect.ymin; - glColor3ub(0, 0, 0); - calc_image_view(sima, 'f'); - myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); - glRectf(0.0f, 0.0f, 1.0f, 1.0f); - glLoadIdentity(); - } - } -#endif - if (show_viewer) { BLI_unlock_thread(LOCK_DRAW_IMAGE); } @@ -1002,8 +898,12 @@ void draw_image_cache(const bContext *C, ARegion *ar) /* Draw current frame. */ x = (cfra - sfra) / (efra - sfra + 1) * ar->winx; - UI_ThemeColor(TH_CFRAME); - glRecti(x, 0, x + ceilf(framelen), 8 * UI_DPI_FAC); + unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immUniformThemeColor(TH_CFRAME); + immRecti(pos, x, 0, x + ceilf(framelen), 8 * UI_DPI_FAC); + immUnbindProgram(); + ED_region_cache_draw_curfra_label(cfra, x, 8.0f * UI_DPI_FAC); if (mask != NULL) { |