1# Copyright 2014 Patrick Dawson <pat@dw.is>
2#
3# This software is provided 'as-is', without any express or implied
4# warranty.  In no event will the authors be held liable for any damages
5# arising from the use of this software.
6#
7# Permission is granted to anyone to use this software for any purpose,
8# including commercial applications, and to alter it and redistribute it
9# freely, subject to the following restrictions:
10#
11# 1. The origin of this software must not be misrepresented; you must not
12#    claim that you wrote the original software. If you use this software
13#    in a product, an acknowledgment in the product documentation would be
14#    appreciated but is not required.
15# 2. Altered source versions must be plainly marked as such, and must not be
16#    misrepresented as being the original software.
17# 3. This notice may not be removed or altered from any source distribution.
18
19from sdl2 cimport *
20from sdl2_gfx cimport *
21from libc.stdlib cimport malloc, free
22from pygame_sdl2.surface cimport Surface
23from pygame_sdl2.color cimport Color
24
25from pygame_sdl2.error import error
26from pygame_sdl2.rect import Rect
27
28
29def pixel(Surface surface, x, y, color):
30    cdef Color c = Color(color)
31    pixelRGBA(surface.surface, x, y, c.r, c.g, c.b, c.a)
32
33def hline(Surface surface, x1, x2, y, color):
34    cdef Color c = Color(color)
35    hlineRGBA(surface.surface, x1, x2, y, c.r, c.g, c.b, c.a)
36
37def vline(Surface surface, x, y1, y2, color):
38    cdef Color c = Color(color)
39    vlineRGBA(surface.surface, x, y1, y2, c.r, c.g, c.b, c.a)
40
41def rectangle(Surface surface, rect, color):
42    cdef Color c = Color(color)
43    if not isinstance(rect, Rect):
44        rect = Rect(rect)
45    rectangleRGBA(surface.surface, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h, c.r, c.g, c.b, c.a)
46
47def rounded_rectangle(Surface surface, rect, rad, color):
48    cdef Color c = Color(color)
49    if not isinstance(rect, Rect):
50        rect = Rect(rect)
51    roundedRectangleRGBA(surface.surface, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h, rad, c.r, c.g, c.b, c.a)
52
53def box(Surface surface, rect, color):
54    cdef Color c = Color(color)
55    if not isinstance(rect, Rect):
56        rect = Rect(rect)
57    boxRGBA(surface.surface, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h, c.r, c.g, c.b, c.a)
58
59def rounded_box(Surface surface, rect, rad, color):
60    cdef Color c = Color(color)
61    if not isinstance(rect, Rect):
62        rect = Rect(rect)
63    roundedBoxRGBA(surface.surface, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h, rad, c.r, c.g, c.b, c.a)
64
65def line(Surface surface, x1, y1, x2, y2, color):
66    cdef Color c = Color(color)
67    lineRGBA(surface.surface, x1, y1, x2, y2, c.r, c.g, c.b, c.a)
68
69def aaline(Surface surface, x1, y1, x2, y2, color):
70    cdef Color c = Color(color)
71    aalineRGBA(surface.surface, x1, y1, x2, y2, c.r, c.g, c.b, c.a)
72
73def thick_line(Surface surface, x1, y1, x2, y2, width, color):
74    cdef Color c = Color(color)
75
76    # This locks up in c code when trying to draw a zero-length line. So make
77    # sure that doesn't happen.
78    cdef int x1int, y1int, x2int, y2int
79    x1int = x1
80    y1int = y1
81    x2int = x2
82    y2int = y2
83
84
85    if x1int == x2int and y1int == y2int:
86        return
87
88    thickLineRGBA(surface.surface, x1int, y1int, x2int, y2int, width, c.r, c.g, c.b, c.a)
89
90def circle(Surface surface, x, y, r, color):
91    cdef Color c = Color(color)
92    circleRGBA(surface.surface, x, y, r, c.r, c.g, c.b, c.a)
93
94def arc(Surface surface, x, y, r, start, end, color):
95    cdef Color c = Color(color)
96    arcRGBA(surface.surface, x, y, r, start, end, c.r, c.g, c.b, c.a)
97
98def aacircle(Surface surface, x, y, r, color):
99    cdef Color c = Color(color)
100    aacircleRGBA(surface.surface, x, y, r, c.r, c.g, c.b, c.a)
101
102def filled_circle(Surface surface, x, y, r, color):
103    cdef Color c = Color(color)
104    filledCircleRGBA(surface.surface, x, y, r, c.r, c.g, c.b, c.a)
105
106def ellipse(Surface surface, x, y, rx, ry, color):
107    cdef Color c = Color(color)
108    ellipseRGBA(surface.surface, x, y, rx, ry, c.r, c.g, c.b, c.a)
109
110def aaellipse(Surface surface, x, y, rx, ry, color):
111    cdef Color c = Color(color)
112    aaellipseRGBA(surface.surface, x, y, rx, ry, c.r, c.g, c.b, c.a)
113
114def filled_ellipse(Surface surface, x, y, rx, ry, color):
115    cdef Color c = Color(color)
116    filledEllipseRGBA(surface.surface, x, y, rx, ry, c.r, c.g, c.b, c.a)
117
118def pie(Surface surface, x, y, r, start, end, color):
119    cdef Color c = Color(color)
120    pieRGBA(surface.surface, x, y, r, start, end, c.r, c.g, c.b, c.a)
121
122def filled_pie(Surface surface, x, y, r, start, end, color):
123    cdef Color c = Color(color)
124    filledPieRGBA(surface.surface, x, y, r, start, end, c.r, c.g, c.b, c.a)
125
126def trigon(Surface surface, x1, y1, x2, y2, x3, y3, color):
127    cdef Color c = Color(color)
128    trigonRGBA(surface.surface, x1, y1, x2, y2, x3, y3, c.r, c.g, c.b, c.a)
129
130def aatrigon(Surface surface, x1, y1, x2, y2, x3, y3, color):
131    cdef Color c = Color(color)
132    aatrigonRGBA(surface.surface, x1, y1, x2, y2, x3, y3, c.r, c.g, c.b, c.a)
133
134def filled_trigon(Surface surface, x1, y1, x2, y2, x3, y3, color):
135    cdef Color c = Color(color)
136    filledTrigonRGBA(surface.surface, x1, y1, x2, y2, x3, y3, c.r, c.g, c.b, c.a)
137
138def polygon(Surface surface, points, color):
139    cdef Color c = Color(color)
140    cdef Sint16 *vx
141    cdef Sint16 *vy
142    cdef size_t num_points = len(points)
143    vx = <Sint16*>malloc(num_points * sizeof(Sint16))
144    vy = <Sint16*>malloc(num_points * sizeof(Sint16))
145    for n, pt in zip(range(num_points), points):
146        vx[n], vy[n] = points[n]
147    polygonRGBA(surface.surface, vx, vy, num_points, c.r, c.g, c.b, c.a)
148    free(vx)
149    free(vy)
150
151def aapolygon(Surface surface, points, color):
152    cdef Color c = Color(color)
153    cdef Sint16 *vx
154    cdef Sint16 *vy
155    cdef size_t num_points = len(points)
156    vx = <Sint16*>malloc(num_points * sizeof(Sint16))
157    vy = <Sint16*>malloc(num_points * sizeof(Sint16))
158    for n, pt in zip(range(num_points), points):
159        vx[n], vy[n] = points[n]
160    aapolygonRGBA(surface.surface, vx, vy, num_points, c.r, c.g, c.b, c.a)
161    free(vx)
162    free(vy)
163
164def filled_polygon(Surface surface, points, color):
165    cdef Color c = Color(color)
166    cdef Sint16 *vx
167    cdef Sint16 *vy
168    cdef size_t num_points = len(points)
169    vx = <Sint16*>malloc(num_points * sizeof(Sint16))
170    vy = <Sint16*>malloc(num_points * sizeof(Sint16))
171    for n, pt in zip(range(num_points), points):
172        vx[n], vy[n] = points[n]
173    filledPolygonRGBA(surface.surface, vx, vy, num_points, c.r, c.g, c.b, c.a)
174    free(vx)
175    free(vy)
176
177def textured_polygon(Surface surface, points, Surface texture not None, tx, ty):
178    cdef Sint16 *vx
179    cdef Sint16 *vy
180    cdef size_t num_points = len(points)
181    vx = <Sint16*>malloc(num_points * sizeof(Sint16))
182    vy = <Sint16*>malloc(num_points * sizeof(Sint16))
183    for n, pt in zip(range(num_points), points):
184        vx[n], vy[n] = points[n]
185    texturedPolygon(surface.surface, vx, vy, num_points, texture.surface, tx, ty)
186    free(vx)
187    free(vy)
188
189def bezier(Surface surface, points, steps, color):
190    cdef Color c = Color(color)
191    cdef Sint16 *vx
192    cdef Sint16 *vy
193    cdef size_t num_points = len(points)
194    vx = <Sint16*>malloc(num_points * sizeof(Sint16))
195    vy = <Sint16*>malloc(num_points * sizeof(Sint16))
196    for n, pt in zip(range(num_points), points):
197        vx[n], vy[n] = points[n]
198    bezierRGBA(surface.surface, vx, vy, num_points, steps, c.r, c.g, c.b, c.a)
199    free(vx)
200    free(vy)
201