annotate src/texture.c @ 39:9d1421c09dfb

core: add more utilities to improve code simplicity
author David Demelier <markand@malikania.fr>
date Tue, 14 Jan 2020 13:05:45 +0100
parents 783841af4033
children b815621df3e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * texture.c -- basic texture management
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
21 #include "error.h"
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
22 #include "error_p.h"
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "texture.h"
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "texture_p.h"
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
25 #include "util.h"
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "window_p.h"
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
28 struct texture *
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
29 texture_new(uint16_t w, uint16_t h)
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
30 {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
31 struct texture *tex = emalloc(sizeof (struct texture));
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
32
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
33 if (!(tex->handle = SDL_CreateTexture(win.renderer,
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
34 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h))) {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
35 error_sdl();
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
36 free(tex);
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
37 return NULL;
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
38 }
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
39
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
40 return tex;
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
41 }
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
42
26
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
43 bool
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
44 texture_get_size(struct texture *tex, uint16_t *w, uint16_t *h)
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
45 {
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
46 assert(tex);
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
47
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
48 int rw, rh;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
49
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
50 if (SDL_QueryTexture(tex->handle, NULL, NULL, &rw, &rh) < 0) {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
51 error_sdl();
26
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
52 *w = 0;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
53 *h = 0;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
54 return false;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
55 }
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
56
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
57 *w = rw;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
58 *h = rh;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
59
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
60 return true;
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
61 }
65398df5fb5c core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
62
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 void
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 texture_draw(struct texture *tex, int x, int y)
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 SDL_Rect dst = {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 .x = x,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 .y = y,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 .w = 0,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 .h = 0
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 };
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 assert(tex);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 /* We need to determine size */
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 SDL_QueryTexture(tex->handle, NULL, NULL, &dst.w, &dst.h);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 SDL_RenderCopy(win.renderer, tex->handle, NULL, &dst);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 void
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 texture_draw_ex(struct texture *tex,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 int src_x,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 int src_y,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 unsigned src_w,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 unsigned src_h,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 int dst_x,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 int dst_y,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 unsigned dst_w,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 unsigned dst_h,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 double angle)
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 const SDL_Rect src = {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 .x = src_x,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 .y = src_y,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 .w = src_w,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 .h = src_h
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 };
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 const SDL_Rect dst = {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 .x = dst_x,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 .y = dst_y,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 .w = dst_w,
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 .h = dst_h
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 };
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 SDL_RenderCopyEx(win.renderer, tex->handle, &src, &dst, angle, NULL, SDL_FLIP_NONE);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 void
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 texture_close(struct texture *tex)
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 assert(tex);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 SDL_DestroyTexture(tex->handle);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 free(tex);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 /* private */
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 struct texture *
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 texture_from_surface(SDL_Surface *surface)
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
122 assert(surface);
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
124 struct texture *texture = ecalloc(1, sizeof (struct texture));
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
125
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 if (!(texture->handle = SDL_CreateTextureFromSurface(win.renderer, surface))) {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
127 error_sdl();
3
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 free(texture);
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 return NULL;
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 return texture;
c013f41a72a5 core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 }