Mercurial > molko
annotate libcore/core/texture.c @ 169:eb0a7ab71023
misc: extreme cleanup, closes #2506
While here, remove unneeded stuff.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 20 Oct 2020 17:39:13 +0200 |
parents | b9b826cd9832 |
children | 5d1b7d123401 |
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" |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "texture.h" |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "texture_p.h" |
39
9d1421c09dfb
core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
24 #include "util.h" |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
25 #include "window.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 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
28 bool |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
29 texture_new(struct texture *tex, unsigned int w, unsigned int h) |
26
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
30 { |
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
31 assert(tex); |
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
32 |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
33 tex->handle = SDL_CreateTexture(RENDERER(), |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
34 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h); |
47
f053a9f38c0e
core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents:
46
diff
changeset
|
35 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
36 if (!tex->handle) { |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
37 tex->w = tex->h = 0; |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
167
diff
changeset
|
38 return errorf("%s", SDL_GetError()); |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
39 } |
47
f053a9f38c0e
core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents:
46
diff
changeset
|
40 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
41 tex->w = w; |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
42 tex->h = h; |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
43 |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
44 return true; |
47
f053a9f38c0e
core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents:
46
diff
changeset
|
45 } |
26
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
46 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
47 bool |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
48 texture_ok(const struct texture *tex) |
47
f053a9f38c0e
core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents:
46
diff
changeset
|
49 { |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
50 return tex && tex->handle && tex->w && tex->h; |
26
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
51 } |
65398df5fb5c
core: add texture_get_size function
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
52 |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
53 bool |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 texture_draw(struct texture *tex, int x, int y) |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
56 assert(tex); |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
57 |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 SDL_Rect dst = { |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 .x = x, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 .y = y, |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
61 .w = tex->w, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
62 .h = tex->h |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 }; |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
65 if (SDL_RenderCopy(RENDERER(), tex->handle, NULL, &dst) < 0) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
167
diff
changeset
|
66 return errorf("%s", SDL_GetError()); |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
67 |
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
68 return true; |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 } |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
71 bool |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
72 texture_scale(struct texture *tex, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
73 int src_x, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
74 int src_y, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
75 unsigned src_w, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
76 unsigned src_h, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
77 int dst_x, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
78 int dst_y, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
79 unsigned dst_w, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
80 unsigned dst_h, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
81 double angle) |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 { |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 const SDL_Rect src = { |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 .x = src_x, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 .y = src_y, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 .w = src_w, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 .h = src_h |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 }; |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 const SDL_Rect dst = { |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 .x = dst_x, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 .y = dst_y, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 .w = dst_w, |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 .h = dst_h |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 }; |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
96 if (SDL_RenderCopyEx(RENDERER(), tex->handle, &src, &dst, angle, NULL, SDL_FLIP_NONE) < 0) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
167
diff
changeset
|
97 return errorf("%s", SDL_GetError()); |
167
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
98 |
b9b826cd9832
core: texture_(scale|draw) now return a bool
David Demelier <markand@malikania.fr>
parents:
126
diff
changeset
|
99 return true; |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 } |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 void |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
103 texture_finish(struct texture *tex) |
3
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 assert(tex); |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
107 if (tex->handle) |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
108 SDL_DestroyTexture(tex->handle); |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
109 |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
110 memset(tex, 0, sizeof (*tex)); |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 } |
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 /* private */ |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
115 bool |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
116 texture_from_surface(struct texture *tex, SDL_Surface *surface) |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
118 assert(tex); |
39
9d1421c09dfb
core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents:
28
diff
changeset
|
119 assert(surface); |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
121 if (!(tex->handle = SDL_CreateTextureFromSurface(RENDERER(), surface))) { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
122 tex->w = tex->h = 0; |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
167
diff
changeset
|
123 return errorf("%s", SDL_GetError()); |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 } |
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
126 tex->w = surface->w; |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
127 tex->h = surface->h; |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
128 |
126
52148edddcc6
core: fix leak in texture creation
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
129 SDL_FreeSurface(surface); |
52148edddcc6
core: fix leak in texture creation
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
130 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
131 return true; |
3
c013f41a72a5
core: implement basic textures, closes #2442
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 } |