1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include "paint.h"
#include <SDL_version.h>
iLocalDef SDL_Renderer *renderer_Paint_(const iPaint *d) {
iAssert(d->dst);
return d->dst->render;
}
static void setColor_Paint_(const iPaint *d, int color) {
const iColor clr = get_Color(color & mask_ColorId);
SDL_SetRenderDrawColor(renderer_Paint_(d), clr.r, clr.g, clr.b, clr.a);
}
void init_Paint(iPaint *d) {
d->dst = get_Window();
d->oldTarget = NULL;
}
void beginTarget_Paint(iPaint *d, SDL_Texture *target) {
SDL_Renderer *rend = renderer_Paint_(d);
d->oldTarget = SDL_GetRenderTarget(rend);
SDL_SetRenderTarget(rend, target);
}
void endTarget_Paint(iPaint *d) {
SDL_SetRenderTarget(renderer_Paint_(d), d->oldTarget);
d->oldTarget = NULL;
}
void setClip_Paint(iPaint *d, iRect rect) {
SDL_RenderSetClipRect(renderer_Paint_(d), (const SDL_Rect *) &rect);
}
void unsetClip_Paint(iPaint *d) {
#if SDL_VERSION_ATLEAST(2, 0, 12)
SDL_RenderSetClipRect(renderer_Paint_(d), NULL);
#else
const SDL_Rect winRect = { 0, 0, d->dst->root->rect.size.x, d->dst->root->rect.size.y };
SDL_RenderSetClipRect(renderer_Paint_(d), &winRect);
#endif
}
void drawRect_Paint(const iPaint *d, iRect rect, int color) {
iInt2 br = bottomRight_Rect(rect);
/* Keep the right/bottom edge visible in the window. */
if (br.x == d->dst->root->rect.size.x) br.x--;
if (br.y == d->dst->root->rect.size.y) br.y--;
const SDL_Point edges[] = {
{ left_Rect(rect), top_Rect(rect) },
{ br.x, top_Rect(rect) },
{ br.x, br.y },
{ left_Rect(rect), br.y },
{ left_Rect(rect), top_Rect(rect) }
};
setColor_Paint_(d, color);
SDL_RenderDrawLines(renderer_Paint_(d), edges, iElemCount(edges));
}
void drawRectThickness_Paint(const iPaint *d, iRect rect, int thickness, int color) {
thickness = iClamp(thickness, 1, 4);
while (thickness--) {
drawRect_Paint(d, rect, color);
shrink_Rect(&rect, one_I2());
}
}
void fillRect_Paint(const iPaint *d, iRect rect, int color) {
setColor_Paint_(d, color);
SDL_RenderFillRect(renderer_Paint_(d), (SDL_Rect *) &rect);
}
void drawLines_Paint(const iPaint *d, const iInt2 *points, size_t count, int color) {
setColor_Paint_(d, color);
SDL_RenderDrawLines(renderer_Paint_(d), (const SDL_Point *) points, count);
}
iInt2 size_SDLTexture(SDL_Texture *d) {
iInt2 size;
SDL_QueryTexture(d, NULL, NULL, &size.x, &size.y);
return size;
}
|