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.

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

Referenced by SDL_DrawLine(), and SDL_DrawLines().

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_DrawLine4(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:89
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
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
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319
#define NULL
Definition: begin_code.h:164
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

◆ 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.

References SDL_Surface::clip_rect, SDL_Surface::format, SDL_CalculateDrawLineFunc(), SDL_IntersectRectAndLine, SDL_SetError, and SDL_TRUE.

143 {
145 
146  if (!dst) {
147  return SDL_SetError("SDL_DrawLine(): Passed NULL destination surface");
148  }
149 
150  func = SDL_CalculateDrawLineFunc(dst->format);
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 }
GLuint GLfloat GLfloat GLfloat x1
GLfixed GLfixed GLfixed y2
GLfixed GLfixed x2
void(* DrawLineFunc)(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:120
GLfixed y1
SDL_Rect clip_rect
Definition: SDL_surface.h:85
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
GLenum func
GLuint color
static DrawLineFunc SDL_CalculateDrawLineFunc(const SDL_PixelFormat *fmt)
Definition: SDL_drawline.c:125
#define SDL_IntersectRectAndLine

◆ 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.

References ABS, BLINE, SDL_PixelFormat::BytesPerPixel, DLINE, DRAW_FASTSETPIXEL1, DRAW_FASTSETPIXELXY1, SDL_Surface::format, SDL_Surface::pitch, SDL_Surface::pixels, SDL_memset, and VLINE.

Referenced by SDL_CalculateDrawLineFunc().

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 }
GLuint GLfloat GLfloat GLfloat x1
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
#define BLINE(x1, y1, x2, y2, op, draw_end)
Definition: SDL_draw.h:375
#define DRAW_FASTSETPIXELXY1(x, y)
Definition: SDL_draw.h:42
GLfixed GLfixed GLfixed y2
#define VLINE(type, op, draw_end)
Definition: SDL_draw.h:318
#define DLINE(type, op, draw_end)
Definition: SDL_draw.h:340
GLfixed GLfixed x2
GLfixed y1
#define DRAW_FASTSETPIXEL1
Definition: SDL_draw.h:34
void * pixels
Definition: SDL_surface.h:75
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_PixelFormat * format
Definition: SDL_surface.h:72
GLuint color
#define ABS(_x)
Definition: SDL_draw.h:293
GLuint GLsizei GLsizei * length
#define SDL_memset

◆ 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.

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

Referenced by SDL_CalculateDrawLineFunc().

61 {
62  if (y1 == y2) {
63  HLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
64  } else if (x1 == x2) {
65  VLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
66  } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
67  DLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
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 }
GLuint GLfloat GLfloat GLfloat x1
GLfixed GLfixed GLfixed y2
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y)
Definition: SDL_draw.h:239
#define VLINE(type, op, draw_end)
Definition: SDL_draw.h:318
#define DLINE(type, op, draw_end)
Definition: SDL_draw.h:340
#define HLINE(type, op, draw_end)
Definition: SDL_draw.h:296
GLfixed GLfixed x2
GLfixed y1
uint8_t Uint8
Definition: SDL_stdinc.h:157
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y)
Definition: SDL_draw.h:112
#define SDL_GetRGBA
#define DRAW_FASTSETPIXELXY2(x, y)
Definition: SDL_draw.h:43
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)
Definition: SDL_draw.h:547
GLuint color
uint16_t Uint16
Definition: SDL_stdinc.h:169
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y)
Definition: SDL_draw.h:143
#define ABS(_x)
Definition: SDL_draw.h:293
#define DRAW_FASTSETPIXEL2
Definition: SDL_draw.h:35

◆ 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.

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

Referenced by SDL_CalculateDrawLineFunc().

91 {
92  if (y1 == y2) {
93  HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
94  } else if (x1 == x2) {
95  VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
96  } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
97  DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
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 }
GLuint GLfloat GLfloat GLfloat x1
#define DRAW_FASTSETPIXELXY4(x, y)
Definition: SDL_draw.h:44
GLfixed GLfixed GLfixed y2
#define VLINE(type, op, draw_end)
Definition: SDL_draw.h:318
#define DLINE(type, op, draw_end)
Definition: SDL_draw.h:340
#define HLINE(type, op, draw_end)
Definition: SDL_draw.h:296
uint32_t Uint32
Definition: SDL_stdinc.h:181
GLfixed GLfixed x2
GLfixed y1
uint8_t Uint8
Definition: SDL_stdinc.h:157
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y)
Definition: SDL_draw.h:174
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y)
Definition: SDL_draw.h:242
#define SDL_GetRGBA
#define DRAW_FASTSETPIXEL4
Definition: SDL_draw.h:36
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)
Definition: SDL_draw.h:547
GLuint color
#define ABS(_x)
Definition: SDL_draw.h:293
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y)
Definition: SDL_draw.h:205

◆ 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.

References SDL_Surface::clip_rect, SDL_Surface::format, i, SDL_CalculateDrawLineFunc(), SDL_DrawPoint(), SDL_IntersectRectAndLine, SDL_SetError, SDL_Point::x, and SDL_Point::y.

Referenced by SW_RenderDrawLines().

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 
179  func = SDL_CalculateDrawLineFunc(dst->format);
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) {
202  SDL_DrawPoint(dst, points[count-1].x, points[count-1].y, color);
203  }
204  return 0;
205 }
GLuint GLfloat GLfloat GLfloat x1
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLfixed GLfixed GLfixed y2
GLfixed GLfixed x2
void(* DrawLineFunc)(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:120
GLfixed y1
int x
Definition: SDL_rect.h:50
int y
Definition: SDL_rect.h:51
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_Rect clip_rect
Definition: SDL_surface.h:85
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
SDL_bool
Definition: SDL_stdinc.h:139
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
GLenum func
GLuint color
static DrawLineFunc SDL_CalculateDrawLineFunc(const SDL_PixelFormat *fmt)
Definition: SDL_drawline.c:125
#define SDL_IntersectRectAndLine
int SDL_DrawPoint(SDL_Surface *dst, int x, int y, Uint32 color)
Definition: SDL_drawpoint.c:30