Blender V4.3
image_space_image.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include "image_private.hh"
12
14
16 SpaceImage *sima;
17
18 public:
19 SpaceImageAccessor(SpaceImage *sima) : sima(sima) {}
20
21 Image *get_image(Main * /*bmain*/) override
22 {
23 return ED_space_image(sima);
24 }
25
27 {
28 return &sima->iuser;
29 }
30
31 ImBuf *acquire_image_buffer(Image * /*image*/, void **lock) override
32 {
33 return ED_space_image_acquire_buffer(sima, lock, 0);
34 }
35
36 void release_buffer(Image * /*image*/, ImBuf *image_buffer, void *lock) override
37 {
38 ED_space_image_release_buffer(sima, image_buffer, lock);
39 }
40
41 void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *image_buffer) override
42 {
43 const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(image_buffer);
44 if ((sima_flag & SI_USE_ALPHA) != 0) {
45 /* Show RGBA */
47 }
48 else if ((sima_flag & SI_SHOW_ALPHA) != 0) {
49 r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
50 copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 0.0f, 1.0f);
51 }
52 else if ((sima_flag & SI_SHOW_ZBUF) != 0) {
54 copy_v4_fl4(r_shader_parameters.shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
55 }
56 else if ((sima_flag & SI_SHOW_R) != 0) {
57 r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
58 if (IMB_alpha_affects_rgb(image_buffer)) {
59 r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
60 }
61 copy_v4_fl4(r_shader_parameters.shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
62 }
63 else if ((sima_flag & SI_SHOW_G) != 0) {
64 r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
65 if (IMB_alpha_affects_rgb(image_buffer)) {
66 r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
67 }
68 copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 1.0f, 0.0f, 0.0f);
69 }
70 else if ((sima_flag & SI_SHOW_B) != 0) {
71 r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
72 if (IMB_alpha_affects_rgb(image_buffer)) {
73 r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
74 }
75 copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 1.0f, 0.0f);
76 }
77 else /* RGB */ {
78 if (IMB_alpha_affects_rgb(image_buffer)) {
79 r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
80 }
81 }
82 }
83
84 bool use_tile_drawing() const override
85 {
86 return (sima->flag & SI_DRAW_TILE) != 0;
87 }
88
90 const float image_offset[2],
91 const float image_resolution[2],
92 float r_uv_to_texture[4][4]) const override
93 {
94 unit_m4(r_uv_to_texture);
95 float scale_x = 1.0 / BLI_rctf_size_x(&region->v2d.cur);
96 float scale_y = 1.0 / BLI_rctf_size_y(&region->v2d.cur);
97
98 float display_offset_x = scale_x * image_offset[0] / image_resolution[0];
99 float display_offset_y = scale_y * image_offset[1] / image_resolution[1];
100
101 float translate_x = scale_x * -region->v2d.cur.xmin + display_offset_x;
102 float translate_y = scale_y * -region->v2d.cur.ymin + display_offset_y;
103
104 r_uv_to_texture[0][0] = scale_x;
105 r_uv_to_texture[1][1] = scale_y;
106 r_uv_to_texture[3][0] = translate_x;
107 r_uv_to_texture[3][1] = translate_y;
108 }
109};
110
111} // namespace blender::draw::image_engine
void unit_m4(float m[4][4])
Definition rct.c:1127
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:197
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:201
@ SI_DRAW_TILE
@ SI_SHOW_ZBUF
@ SI_SHOW_R
@ SI_USE_ALPHA
@ SI_SHOW_G
@ SI_SHOW_B
@ SI_SHOW_ALPHA
void ED_space_image_release_buffer(SpaceImage *sima, ImBuf *ibuf, void *lock)
int ED_space_image_get_display_channel_mask(ImBuf *ibuf)
ImBuf * ED_space_image_acquire_buffer(SpaceImage *sima, void **r_lock, int tile)
Image * ED_space_image(const SpaceImage *sima)
Definition image_edit.cc:40
bool IMB_alpha_affects_rgb(const ImBuf *ibuf)
Definition divers.cc:91
volatile int lock
void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *image_buffer) override
void init_ss_to_texture_matrix(const ARegion *region, const float image_offset[2], const float image_resolution[2], float r_uv_to_texture[4][4]) const override
Initialize r_uv_to_texture matrix to transform from normalized screen space coordinates (0....
ImBuf * acquire_image_buffer(Image *, void **lock) override
bool use_tile_drawing() const override
Is (wrap) repeat option enabled in the space.
void release_buffer(Image *, ImBuf *image_buffer, void *lock) override
struct ImageUser iuser