SDL 2.0
SDL_drawline.c File Reference
#include "../../SDL_internal.h"
#include "SDL_draw.h"
#include "SDL_drawline.h"
#include "SDL_drawpoint.h"
+ Include dependency graph for SDL_drawline.c:

Go to the source code of this file.

Typedefs

typedef void(* DrawLineFunc) (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
 

Functions

static void SDL_DrawLine1 (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
 
static void SDL_DrawLine2 (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
 
static void SDL_DrawLine4 (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
 
static DrawLineFunc SDL_CalculateDrawLineFunc (const SDL_PixelFormat *fmt)
 
int SDL_DrawLine (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color)
 
int SDL_DrawLines (SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
 

Typedef Documentation

◆ DrawLineFunc

typedef void(* DrawLineFunc) (SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)

Definition at line 120 of file SDL_drawline.c.

Function Documentation

◆ SDL_CalculateDrawLineFunc()

static DrawLineFunc SDL_CalculateDrawLineFunc ( const SDL_PixelFormat fmt)
static

Definition at line 125 of file SDL_drawline.c.

126{
127 switch (fmt->BytesPerPixel) {
128 case 1:
129 if (fmt->BitsPerPixel < 8) {
130 break;
131 }
132 return SDL_DrawLine1;
133 case 2:
134 return SDL_DrawLine2;
135 case 4:
136 return SDL_DrawLine4;
137 }
138 return NULL;
139}
static void SDL_DrawLine2(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:59
static void SDL_DrawLine4(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:89
static void SDL_DrawLine1(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:31
#define NULL
Definition: begin_code.h:167
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319

References SDL_PixelFormat::BitsPerPixel, SDL_PixelFormat::BytesPerPixel, NULL, SDL_DrawLine1(), SDL_DrawLine2(), and SDL_DrawLine4().

Referenced by SDL_DrawLine(), and SDL_DrawLines().

◆ SDL_DrawLine()

int SDL_DrawLine ( SDL_Surface dst,
int  x1,
int  y1,
int  x2,
int  y2,
Uint32  color 
)

Definition at line 142 of file SDL_drawline.c.

143{
145
146 if (!dst) {
147 return SDL_SetError("SDL_DrawLine(): Passed NULL destination surface");
148 }
149
151 if (!func) {
152 return SDL_SetError("SDL_DrawLine(): Unsupported surface format");
153 }
154
155 /* Perform clipping */
156 /* FIXME: We don't actually want to clip, as it may change line slope */
157 if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
158 return 0;
159 }
160
161 func(dst, x1, y1, x2, y2, color, SDL_TRUE);
162 return 0;
163}
static DrawLineFunc SDL_CalculateDrawLineFunc(const SDL_PixelFormat *fmt)
Definition: SDL_drawline.c:125
void(* DrawLineFunc)(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:120
#define SDL_SetError
#define SDL_IntersectRectAndLine
GLenum func
GLfixed GLfixed GLfixed y2
GLfixed y1
GLuint color
GLuint GLfloat GLfloat GLfloat x1
GLfixed GLfixed x2
GLenum GLenum dst
@ SDL_TRUE
Definition: SDL_stdinc.h:164

References SDL_CalculateDrawLineFunc(), SDL_IntersectRectAndLine, SDL_SetError, and SDL_TRUE.

◆ SDL_DrawLine1()

static void SDL_DrawLine1 ( SDL_Surface dst,
int  x1,
int  y1,
int  x2,
int  y2,
Uint32  color,
SDL_bool  draw_end 
)
static

Definition at line 31 of file SDL_drawline.c.

33{
34 if (y1 == y2) {
35 int length;
36 int pitch = (dst->pitch / dst->format->BytesPerPixel);
37 Uint8 *pixel;
38 if (x1 <= x2) {
39 pixel = (Uint8 *)dst->pixels + y1 * pitch + x1;
40 length = draw_end ? (x2-x1+1) : (x2-x1);
41 } else {
42 pixel = (Uint8 *)dst->pixels + y1 * pitch + x2;
43 if (!draw_end) {
44 ++pixel;
45 }
46 length = draw_end ? (x1-x2+1) : (x1-x2);
47 }
48 SDL_memset(pixel, color, length);
49 } else if (x1 == x2) {
50 VLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
51 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
52 DLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
53 } else {
54 BLINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY1, draw_end);
55 }
56}
#define BLINE(x1, y1, x2, y2, op, draw_end)
Definition: SDL_draw.h:375
#define ABS(_x)
Definition: SDL_draw.h:293
#define DLINE(type, op, draw_end)
Definition: SDL_draw.h:340
#define DRAW_FASTSETPIXEL1
Definition: SDL_draw.h:34
#define DRAW_FASTSETPIXELXY1(x, y)
Definition: SDL_draw.h:42
#define VLINE(type, op, draw_end)
Definition: SDL_draw.h:318
#define SDL_memset
GLuint GLsizei GLsizei * length
uint8_t Uint8
Definition: SDL_stdinc.h:179

References ABS, BLINE, DLINE, DRAW_FASTSETPIXEL1, DRAW_FASTSETPIXELXY1, SDL_memset, and VLINE.

Referenced by SDL_CalculateDrawLineFunc().

◆ SDL_DrawLine2()

static void SDL_DrawLine2 ( SDL_Surface dst,
int  x1,
int  y1,
int  x2,
int  y2,
Uint32  color,
SDL_bool  draw_end 
)
static

Definition at line 59 of file SDL_drawline.c.

61{
62 if (y1 == y2) {
64 } else if (x1 == x2) {
66 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
68 } else {
69 Uint8 _r, _g, _b, _a;
70 const SDL_PixelFormat * fmt = dst->format;
71 SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);
72 if (fmt->Rmask == 0x7C00) {
73 AALINE(x1, y1, x2, y2,
75 draw_end);
76 } else if (fmt->Rmask == 0xF800) {
77 AALINE(x1, y1, x2, y2,
79 draw_end);
80 } else {
81 AALINE(x1, y1, x2, y2,
83 draw_end);
84 }
85 }
86}
#define HLINE(type, op, draw_end)
Definition: SDL_draw.h:296
#define DRAW_FASTSETPIXEL2
Definition: SDL_draw.h:35
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y)
Definition: SDL_draw.h:239
#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)
Definition: SDL_draw.h:537
#define DRAW_FASTSETPIXELXY2(x, y)
Definition: SDL_draw.h:43
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y)
Definition: SDL_draw.h:143
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y)
Definition: SDL_draw.h:112
#define SDL_GetRGBA
uint16_t Uint16
Definition: SDL_stdinc.h:191

References AALINE, ABS, DLINE, DRAW_FASTSETPIXEL2, DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB565, SDL_PixelFormat::format, HLINE, SDL_PixelFormat::Rmask, SDL_GetRGBA, and VLINE.

Referenced by SDL_CalculateDrawLineFunc().

◆ SDL_DrawLine4()

static void SDL_DrawLine4 ( SDL_Surface dst,
int  x1,
int  y1,
int  x2,
int  y2,
Uint32  color,
SDL_bool  draw_end 
)
static

Definition at line 89 of file SDL_drawline.c.

91{
92 if (y1 == y2) {
94 } else if (x1 == x2) {
96 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
98 } else {
99 Uint8 _r, _g, _b, _a;
100 const SDL_PixelFormat * fmt = dst->format;
101 SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);
102 if (fmt->Rmask == 0x00FF0000) {
103 if (!fmt->Amask) {
104 AALINE(x1, y1, x2, y2,
106 draw_end);
107 } else {
108 AALINE(x1, y1, x2, y2,
110 draw_end);
111 }
112 } else {
113 AALINE(x1, y1, x2, y2,
115 draw_end);
116 }
117 }
118}
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y)
Definition: SDL_draw.h:174
#define DRAW_FASTSETPIXELXY4(x, y)
Definition: SDL_draw.h:44
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y)
Definition: SDL_draw.h:205
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y)
Definition: SDL_draw.h:242
#define DRAW_FASTSETPIXEL4
Definition: SDL_draw.h:36
uint32_t Uint32
Definition: SDL_stdinc.h:203

References AALINE, ABS, SDL_PixelFormat::Amask, DLINE, DRAW_FASTSETPIXEL4, DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_RGB888, SDL_PixelFormat::format, HLINE, SDL_PixelFormat::Rmask, SDL_GetRGBA, and VLINE.

Referenced by SDL_CalculateDrawLineFunc().

◆ SDL_DrawLines()

int SDL_DrawLines ( SDL_Surface dst,
const SDL_Point points,
int  count,
Uint32  color 
)

Definition at line 166 of file SDL_drawline.c.

168{
169 int i;
170 int x1, y1;
171 int x2, y2;
172 SDL_bool draw_end;
174
175 if (!dst) {
176 return SDL_SetError("SDL_DrawLines(): Passed NULL destination surface");
177 }
178
180 if (!func) {
181 return SDL_SetError("SDL_DrawLines(): Unsupported surface format");
182 }
183
184 for (i = 1; i < count; ++i) {
185 x1 = points[i-1].x;
186 y1 = points[i-1].y;
187 x2 = points[i].x;
188 y2 = points[i].y;
189
190 /* Perform clipping */
191 /* FIXME: We don't actually want to clip, as it may change line slope */
192 if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
193 continue;
194 }
195
196 /* Draw the end if it was clipped */
197 draw_end = (x2 != points[i].x || y2 != points[i].y);
198
199 func(dst, x1, y1, x2, y2, color, draw_end);
200 }
201 if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) {
203 }
204 return 0;
205}
int SDL_DrawPoint(SDL_Surface *dst, int x, int y, Uint32 color)
Definition: SDL_drawpoint.c:30
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLfixed GLfixed GLint GLint GLfixed points
SDL_bool
Definition: SDL_stdinc.h:162
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50

References i, SDL_CalculateDrawLineFunc(), SDL_DrawPoint(), SDL_IntersectRectAndLine, and SDL_SetError.

Referenced by SW_RunCommandQueue().