ObjectivelyMVC
Object oriented MVC framework for SDL3 and GNU C
Loading...
Searching...
No Matches
ImageView.c File Reference
#include <assert.h>
#include "ImageView.h"

Go to the source code of this file.

Macros

#define _Class   _ImageView
 

Functions

Class * _ImageView (void)
 
static void awakeWithDictionary (View *self, const Dictionary *dictionary)
 
static void dealloc (Object *self)
 
static Viewinit (View *self)
 
static void initialize (Class *clazz)
 
static ImageViewinitWithFrame (ImageView *self, const SDL_Rect *frame)
 
static ImageViewinitWithImage (ImageView *self, Image *image)
 
static void render (View *self, Renderer *renderer)
 
static void renderDeviceWillReset (View *self)
 
static void setImage (ImageView *self, Image *image)
 
static void setImageWithResource (ImageView *self, const Resource *resource)
 
static void setImageWithResourceName (ImageView *self, const char *name)
 
static void setImageWithSurface (ImageView *self, SDL_Surface *surface)
 

Variables

const EnumName SDLGPUBlendFactorNames []
 

Macro Definition Documentation

◆ _Class

#define _Class   _ImageView

Definition at line 44 of file ImageView.c.

Function Documentation

◆ _ImageView()

Class * _ImageView ( void  )

Definition at line 255 of file ImageView.c.

255 {
256 static Class *clazz;
257 static Once once;
258
259 do_once(&once, {
260 clazz = _initialize(&(const ClassDef) {
261 .name = "ImageView",
262 .superclass = _View(),
263 .instanceSize = sizeof(ImageView),
264 .interfaceOffset = offsetof(ImageView, interface),
265 .interfaceSize = sizeof(ImageViewInterface),
267 });
268 });
269
270 return clazz;
271}
static void initialize(Class *clazz)
Definition ImageView.c:234
Class * _View(void)
Definition View.c:2067
ImageViews render an Image in the context of a View hierarchy.
Definition ImageView.h:45

◆ awakeWithDictionary()

static void awakeWithDictionary ( View self,
const Dictionary *  dictionary 
)
static
See also
View::awakeWithDictionary(View *, const Dictionary *)

Definition at line 67 of file ImageView.c.

67 {
68
69 super(View, self, awakeWithDictionary, dictionary);
70
71 ImageView *this = (ImageView *) self;
72
73 const Inlet inlets[] = MakeInlets(
74 MakeInlet("blend.src", InletTypeEnum, &this->blend.src, (ident) SDLGPUBlendFactorNames),
75 MakeInlet("blend.dst", InletTypeEnum, &this->blend.dst, (ident) SDLGPUBlendFactorNames),
76 MakeInlet("color", InletTypeColor, &this->color, NULL),
77 MakeInlet("image", InletTypeImage, &this->image, NULL)
78 );
79
80 $(self, bind, inlets, dictionary);
81}
static void awakeWithDictionary(View *self, const Dictionary *dictionary)
Definition ImageView.c:67
const EnumName SDLGPUBlendFactorNames[]
Definition ImageView.c:28
@ InletTypeImage
Definition View+JSON.h:90
@ InletTypeEnum
Definition View+JSON.h:75
@ InletTypeColor
Definition View+JSON.h:62
#define MakeInlets(...)
Creates a null-termianted array of Inlets.
Definition View+JSON.h:221
#define MakeInlet(name, type, dest, data)
Creates an Inlet with the specified parameters.
Definition View+JSON.h:216
Inlets enable inbound data binding of View attributes through JSON.
Definition View+JSON.h:155
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
Definition View.h:134

◆ dealloc()

static void dealloc ( Object *  self)
static
See also
Object::dealloc(Object *)

Definition at line 51 of file ImageView.c.

51 {
52
53 ImageView *this = (ImageView *) self;
54
55 release(this->image);
56
57 this->texture = release(this->texture);
58
59 super(Object, self, dealloc);
60}
static void dealloc(Object *self)
Definition ImageView.c:51

◆ init()

static View * init ( View self)
static
See also
View::init(View *)

Definition at line 86 of file ImageView.c.

86 {
87 return (View *) $((ImageView *) self, initWithImage, NULL);
88}
static ImageView * initWithImage(ImageView *self, Image *image)
Definition ImageView.c:151

◆ initialize()

static void initialize ( Class *  clazz)
static

see Class::initialize(Class *)

Definition at line 234 of file ImageView.c.

234 {
235
236 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
237
238 ((ViewInterface *) clazz->interface)->awakeWithDictionary = awakeWithDictionary;
239 ((ViewInterface *) clazz->interface)->init = init;
240 ((ViewInterface *) clazz->interface)->render = render;
241 ((ViewInterface *) clazz->interface)->renderDeviceWillReset = renderDeviceWillReset;
242
243 ((ImageViewInterface *) clazz->interface)->initWithFrame = initWithFrame;
244 ((ImageViewInterface *) clazz->interface)->initWithImage = initWithImage;
245 ((ImageViewInterface *) clazz->interface)->setImage = setImage;
246 ((ImageViewInterface *) clazz->interface)->setImageWithResource = setImageWithResource;
247 ((ImageViewInterface *) clazz->interface)->setImageWithResourceName = setImageWithResourceName;
248 ((ImageViewInterface *) clazz->interface)->setImageWithSurface = setImageWithSurface;
249}
static void setImageWithResource(ImageView *self, const Resource *resource)
Definition ImageView.c:189
static void setImageWithSurface(ImageView *self, SDL_Surface *surface)
Definition ImageView.c:215
static View * init(View *self)
Definition ImageView.c:86
static ImageView * initWithFrame(ImageView *self, const SDL_Rect *frame)
Definition ImageView.c:134
static void setImageWithResourceName(ImageView *self, const char *name)
Definition ImageView.c:202
static void setImage(ImageView *self, Image *image)
Definition ImageView.c:165
static void render(View *self, Renderer *renderer)
Definition ImageView.c:93
static void renderDeviceWillReset(View *self)
Definition ImageView.c:119
void setImage(ImageView *self, Image *image)
Sets the Image for this ImageView.
Definition ImageView.c:165
ImageView * initWithImage(ImageView *self, const SDL_Rect *frame)
void render(View *self, Renderer *renderer)
Renders this View using the given renderer.
Definition Control.c:179

◆ initWithFrame()

static ImageView * initWithFrame ( ImageView self,
const SDL_Rect *  frame 
)
static

Definition at line 134 of file ImageView.c.

134 {
135
136 self = (ImageView *) super(View, self, initWithFrame, frame);
137 if (self) {
138 self->blend.src = SDL_GPU_BLENDFACTOR_SRC_ALPHA;
139 self->blend.dst = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA;
140
141 self->color = Colors.White;
142 }
143
144 return self;
145}
W3C Color constants.
Definition Colors.h:37
SDL_Color White
Definition Colors.h:185
SDL_GPUBlendFactor src
Definition ImageView.h:62
SDL_GPUBlendFactor dst
Definition ImageView.h:62
SDL_Color color
The drawing color.
Definition ImageView.h:68
struct ImageView::@0 blend
The blend factors (currently unused; reserved for future per-pipeline support).

◆ initWithImage()

static ImageView * initWithImage ( ImageView self,
Image image 
)
static

Definition at line 151 of file ImageView.c.

151 {
152
153 self = (ImageView *) $(self, initWithFrame, NULL);
154 if (self) {
155 $(self, setImage, image);
156 }
157
158 return self;
159}

◆ render()

static void render ( View self,
Renderer renderer 
)
static
See also
ViewInterface::render(View *, Renderer *)

Definition at line 93 of file ImageView.c.

93 {
94
95 super(View, self, render, renderer);
96
97 ImageView *this = (ImageView *) self;
98
99 if (this->texture == NULL) {
100 if (this->image) {
101 this->texture = $(renderer->device, createTextureFromSurface,
102 this->image->surface, SDL_GPU_TEXTUREUSAGE_SAMPLER, false);
103 assert(this->texture);
104 }
105 }
106
107 if (this->texture) {
108
109 // TODO: Actually use self->blend
110
111 const SDL_Rect frame = $(self, renderFrame);
112 $(renderer, drawTexture, this->texture, &frame, &this->color);
113 }
114}
static void drawTexture(const Renderer *self, Texture *texture, const SDL_Rect *rect, const SDL_Color *color)
Definition Renderer.c:211
static SDL_Rect renderFrame(const View *self)
Definition View.c:1455
RenderDevice * device
The backing RenderDevice.
Definition Renderer.h:92

◆ renderDeviceWillReset()

static void renderDeviceWillReset ( View self)
static
See also
View::renderDeviceWillReset(View *)

Definition at line 119 of file ImageView.c.

119 {
120
121 ImageView *this = (ImageView *) self;
122
123 this->texture = release(this->texture);
124
125 super(View, self, renderDeviceWillReset);
126}

◆ setImage()

static void setImage ( ImageView self,
Image image 
)
static

Definition at line 165 of file ImageView.c.

165 {
166
167 release(self->image);
168
169 if (image) {
170 self->image = retain(image);
171
172 const SDL_Size size = $((View *) self, size);
173 const SDL_Size imageSize = $(image, size);
174
175 if (size.w == 0 && size.h == 0) {
176 $((View *) self, resize, &imageSize);
177 }
178 } else {
179 self->image = NULL;
180 }
181
182 self->texture = release(self->texture);
183}
static SDL_Size size(const Image *self)
Definition Image.c:181
static void resize(View *self, const SDL_Size *size)
Definition View.c:1527
Image * image
The image.
Definition ImageView.h:73
Texture * texture
The GPU texture.
Definition ImageView.h:78

◆ setImageWithResource()

static void setImageWithResource ( ImageView self,
const Resource *  resource 
)
static

Definition at line 189 of file ImageView.c.

189 {
190
191 Image *image = $$(Image, imageWithResource, resource);
192
193 $(self, setImage, image);
194
195 release(image);
196}
static Image * imageWithResource(const Resource *resource)
Definition Image.c:64
Image loading.
Definition Image.h:38

◆ setImageWithResourceName()

static void setImageWithResourceName ( ImageView self,
const char *  name 
)
static

Definition at line 202 of file ImageView.c.

202 {
203
204 Resource *resource = $$(Resource, resourceWithName, name);
205
206 $(self, setImageWithResource, resource);
207
208 release(resource);
209}

◆ setImageWithSurface()

static void setImageWithSurface ( ImageView self,
SDL_Surface *  surface 
)
static

Definition at line 215 of file ImageView.c.

215 {
216
217 $(self, setImage, NULL);
218
219 if (surface) {
220 Image *image = $(alloc(Image), initWithSurface, surface);
221 assert(image);
222
223 $(self, setImage, image);
224
225 release(image);
226 }
227}
static Image * initWithSurface(Image *self, SDL_Surface *surface)
Definition Image.c:157

Variable Documentation

◆ SDLGPUBlendFactorNames

const EnumName SDLGPUBlendFactorNames[]
Initial value:
= MakeEnumNames(
MakeEnumName(SDL_GPU_BLENDFACTOR_ZERO),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE),
MakeEnumName(SDL_GPU_BLENDFACTOR_SRC_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_DST_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_SRC_ALPHA),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA),
MakeEnumName(SDL_GPU_BLENDFACTOR_DST_ALPHA),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA),
MakeEnumName(SDL_GPU_BLENDFACTOR_CONSTANT_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR),
MakeEnumName(SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE)
)

Definition at line 28 of file ImageView.c.