Blender V5.0
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
8
9#pragma once
10
11#include "ED_image.hh"
12
13#include "DNA_screen_types.h"
14
15#include "image_private.hh"
16
17namespace blender::image_engine {
18
20 SpaceImage *sima;
21
22 public:
23 SpaceImageAccessor(SpaceImage *sima) : sima(sima) {}
24
25 ::Image *get_image(Main * /*bmain*/) override
26 {
27 return ED_space_image(sima);
28 }
29
31 {
32 return &sima->iuser;
33 }
34
35 ImBuf *acquire_image_buffer(::Image * /*image*/, void **lock) override
36 {
37 return ED_space_image_acquire_buffer(sima, lock, 0);
38 }
39
40 void release_buffer(::Image * /*image*/, ImBuf *image_buffer, void *lock) override
41 {
42 ED_space_image_release_buffer(sima, image_buffer, lock);
43 }
44
45 void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *image_buffer) override
46 {
47 const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(image_buffer);
48 if ((sima_flag & SI_USE_ALPHA) != 0) {
49 /* Show RGBA */
51 }
52 else if ((sima_flag & SI_SHOW_ALPHA) != 0) {
53 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
54 r_shader_parameters.shuffle = float4(0.0f, 0.0f, 0.0f, 1.0f);
55 }
56 else if ((sima_flag & SI_SHOW_ZBUF) != 0) {
58 r_shader_parameters.shuffle = float4(1.0f, 0.0f, 0.0f, 0.0f);
59 }
60 else if ((sima_flag & SI_SHOW_R) != 0) {
61 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
62 if (IMB_alpha_affects_rgb(image_buffer)) {
63 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
64 }
65 r_shader_parameters.shuffle = float4(1.0f, 0.0f, 0.0f, 0.0f);
66 }
67 else if ((sima_flag & SI_SHOW_G) != 0) {
68 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
69 if (IMB_alpha_affects_rgb(image_buffer)) {
70 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
71 }
72 r_shader_parameters.shuffle = float4(0.0f, 1.0f, 0.0f, 0.0f);
73 }
74 else if ((sima_flag & SI_SHOW_B) != 0) {
75 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
76 if (IMB_alpha_affects_rgb(image_buffer)) {
77 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
78 }
79 r_shader_parameters.shuffle = float4(0.0f, 0.0f, 1.0f, 0.0f);
80 }
81 else /* RGB */ {
82 if (IMB_alpha_affects_rgb(image_buffer)) {
83 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
84 }
85 }
86 }
87
88 bool use_tile_drawing() const override
89 {
90 return (sima->flag & SI_DRAW_TILE) != 0;
91 }
92
94 const float image_offset[2],
95 const float image_resolution[2],
96 float r_uv_to_texture[4][4]) const override
97 {
98 unit_m4(r_uv_to_texture);
99 float scale_x = 1.0 / BLI_rctf_size_x(&region->v2d.cur);
100 float scale_y = 1.0 / BLI_rctf_size_y(&region->v2d.cur);
101
102 float display_offset_x = scale_x * image_offset[0] / image_resolution[0];
103 float display_offset_y = scale_y * image_offset[1] / image_resolution[1];
104
105 float translate_x = scale_x * -region->v2d.cur.xmin + display_offset_x;
106 float translate_y = scale_y * -region->v2d.cur.ymin + display_offset_y;
107
108 r_uv_to_texture[0][0] = scale_x;
109 r_uv_to_texture[1][1] = scale_y;
110 r_uv_to_texture[3][0] = translate_x;
111 r_uv_to_texture[3][1] = translate_y;
112 }
113};
114
115} // namespace blender::image_engine
void unit_m4(float m[4][4])
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:202
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:206
@ 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 conversion.cc:66
volatile int lock
void release_buffer(::Image *, ImBuf *image_buffer, void *lock) override
void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *image_buffer) override
ImBuf * acquire_image_buffer(::Image *, void **lock) override
bool use_tile_drawing() const override
Is (wrap) repeat option enabled in the space.
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....
VecBase< float, 4 > float4
float xmin
float ymin