diff options
Diffstat (limited to 'src/ui/paint.c')
-rw-r--r-- | src/ui/paint.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/ui/paint.c b/src/ui/paint.c index 79adb7d1..af62f908 100644 --- a/src/ui/paint.c +++ b/src/ui/paint.c | |||
@@ -24,6 +24,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |||
24 | 24 | ||
25 | #include <SDL_version.h> | 25 | #include <SDL_version.h> |
26 | 26 | ||
27 | iInt2 origin_Paint; | ||
28 | |||
27 | iLocalDef SDL_Renderer *renderer_Paint_(const iPaint *d) { | 29 | iLocalDef SDL_Renderer *renderer_Paint_(const iPaint *d) { |
28 | iAssert(d->dst); | 30 | iAssert(d->dst); |
29 | return d->dst->render; | 31 | return d->dst->render; |
@@ -62,10 +64,11 @@ void endTarget_Paint(iPaint *d) { | |||
62 | } | 64 | } |
63 | 65 | ||
64 | void setClip_Paint(iPaint *d, iRect rect) { | 66 | void setClip_Paint(iPaint *d, iRect rect) { |
65 | rect = intersect_Rect(rect, rect_Root(get_Root())); | 67 | //rect = intersect_Rect(rect, rect_Root(get_Root())); |
66 | if (isEmpty_Rect(rect)) { | 68 | if (isEmpty_Rect(rect)) { |
67 | rect = init_Rect(0, 0, 1, 1); | 69 | rect = init_Rect(0, 0, 1, 1); |
68 | } | 70 | } |
71 | addv_I2(&rect.pos, origin_Paint); | ||
69 | SDL_RenderSetClipRect(renderer_Paint_(d), (const SDL_Rect *) &rect); | 72 | SDL_RenderSetClipRect(renderer_Paint_(d), (const SDL_Rect *) &rect); |
70 | } | 73 | } |
71 | 74 | ||
@@ -85,6 +88,7 @@ void unsetClip_Paint(iPaint *d) { | |||
85 | } | 88 | } |
86 | 89 | ||
87 | void drawRect_Paint(const iPaint *d, iRect rect, int color) { | 90 | void drawRect_Paint(const iPaint *d, iRect rect, int color) { |
91 | addv_I2(&rect.pos, origin_Paint); | ||
88 | iInt2 br = bottomRight_Rect(rect); | 92 | iInt2 br = bottomRight_Rect(rect); |
89 | /* Keep the right/bottom edge visible in the window. */ | 93 | /* Keep the right/bottom edge visible in the window. */ |
90 | if (br.x == d->dst->size.x) br.x--; | 94 | if (br.x == d->dst->size.x) br.x--; |
@@ -115,11 +119,14 @@ void drawRectThickness_Paint(const iPaint *d, iRect rect, int thickness, int col | |||
115 | } | 119 | } |
116 | 120 | ||
117 | void fillRect_Paint(const iPaint *d, iRect rect, int color) { | 121 | void fillRect_Paint(const iPaint *d, iRect rect, int color) { |
122 | addv_I2(&rect.pos, origin_Paint); | ||
118 | setColor_Paint_(d, color); | 123 | setColor_Paint_(d, color); |
124 | // printf("fillRect_Paint: %d,%d %dx%d\n", rect.pos.x, rect.pos.y, rect.size.x, rect.size.y); | ||
119 | SDL_RenderFillRect(renderer_Paint_(d), (SDL_Rect *) &rect); | 125 | SDL_RenderFillRect(renderer_Paint_(d), (SDL_Rect *) &rect); |
120 | } | 126 | } |
121 | 127 | ||
122 | void drawSoftShadow_Paint(const iPaint *d, iRect inner, int thickness, int color, int alpha) { | 128 | void drawSoftShadow_Paint(const iPaint *d, iRect inner, int thickness, int color, int alpha) { |
129 | addv_I2(&inner.pos, origin_Paint); | ||
123 | SDL_Renderer *render = renderer_Paint_(d); | 130 | SDL_Renderer *render = renderer_Paint_(d); |
124 | SDL_Texture *shadow = get_Window()->borderShadow; | 131 | SDL_Texture *shadow = get_Window()->borderShadow; |
125 | const iInt2 size = size_SDLTexture(shadow); | 132 | const iInt2 size = size_SDLTexture(shadow); |
@@ -146,9 +153,14 @@ void drawSoftShadow_Paint(const iPaint *d, iRect inner, int thickness, int color | |||
146 | &(SDL_Rect){ outer.pos.x, inner.pos.y, thickness, inner.size.y }); | 153 | &(SDL_Rect){ outer.pos.x, inner.pos.y, thickness, inner.size.y }); |
147 | } | 154 | } |
148 | 155 | ||
149 | void drawLines_Paint(const iPaint *d, const iInt2 *points, size_t count, int color) { | 156 | void drawLines_Paint(const iPaint *d, const iInt2 *points, size_t n, int color) { |
150 | setColor_Paint_(d, color); | 157 | setColor_Paint_(d, color); |
151 | SDL_RenderDrawLines(renderer_Paint_(d), (const SDL_Point *) points, count); | 158 | iInt2 *offsetPoints = malloc(sizeof(iInt2) * n); |
159 | for (size_t i = 0; i < n; i++) { | ||
160 | offsetPoints[i] = add_I2(points[i], origin_Paint); | ||
161 | } | ||
162 | SDL_RenderDrawLines(renderer_Paint_(d), (const SDL_Point *) offsetPoints, n); | ||
163 | free(offsetPoints); | ||
152 | } | 164 | } |
153 | 165 | ||
154 | iInt2 size_SDLTexture(SDL_Texture *d) { | 166 | iInt2 size_SDLTexture(SDL_Texture *d) { |