Mercurial > molko
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 |
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 } |