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.

{
switch (fmt->BytesPerPixel) {
case 1:
if (fmt->BitsPerPixel < 8) {
break;
}
return SDL_DrawLine1;
case 2:
return SDL_DrawLine2;
case 4:
return SDL_DrawLine4;
}
return NULL;
}

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.

{
DrawLineFunc func;
if (!dst) {
return SDL_SetError("SDL_DrawLine(): Passed NULL destination surface");
}
func = SDL_CalculateDrawLineFunc(dst->format);
if (!func) {
return SDL_SetError("SDL_DrawLine(): Unsupported surface format");
}
/* Perform clipping */
/* FIXME: We don't actually want to clip, as it may change line slope */
if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
return 0;
}
func(dst, x1, y1, x2, y2, color, SDL_TRUE);
return 0;
}

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.

{
if (y1 == y2) {
int length;
int pitch = (dst->pitch / dst->format->BytesPerPixel);
Uint8 *pixel;
if (x1 <= x2) {
pixel = (Uint8 *)dst->pixels + y1 * pitch + x1;
length = draw_end ? (x2-x1+1) : (x2-x1);
} else {
pixel = (Uint8 *)dst->pixels + y1 * pitch + x2;
if (!draw_end) {
++pixel;
}
length = draw_end ? (x1-x2+1) : (x1-x2);
}
SDL_memset(pixel, color, length);
} else if (x1 == x2) {
VLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
} else if (ABS(x1 - x2) == ABS(y1 - y2)) {
DLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
} else {
BLINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY1, draw_end);
}
}

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.

{
if (y1 == y2) {
HLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
} else if (x1 == x2) {
VLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
} else if (ABS(x1 - x2) == ABS(y1 - y2)) {
DLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
} else {
Uint8 _r, _g, _b, _a;
const SDL_PixelFormat * fmt = dst->format;
SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);
if (fmt->Rmask == 0x7C00) {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB555,
draw_end);
} else if (fmt->Rmask == 0xF800) {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB565,
draw_end);
} else {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY2_BLEND_RGB,
draw_end);
}
}
}

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.

{
if (y1 == y2) {
HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
} else if (x1 == x2) {
VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
} else if (ABS(x1 - x2) == ABS(y1 - y2)) {
DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
} else {
Uint8 _r, _g, _b, _a;
const SDL_PixelFormat * fmt = dst->format;
SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);
if (fmt->Rmask == 0x00FF0000) {
if (!fmt->Amask) {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_RGB888,
draw_end);
} else {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_ARGB8888,
draw_end);
}
} else {
AALINE(x1, y1, x2, y2,
DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB,
draw_end);
}
}
}

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.

{
int i;
int x1, y1;
int x2, y2;
SDL_bool draw_end;
DrawLineFunc func;
if (!dst) {
return SDL_SetError("SDL_DrawLines(): Passed NULL destination surface");
}
func = SDL_CalculateDrawLineFunc(dst->format);
if (!func) {
return SDL_SetError("SDL_DrawLines(): Unsupported surface format");
}
for (i = 1; i < count; ++i) {
x1 = points[i-1].x;
y1 = points[i-1].y;
x2 = points[i].x;
y2 = points[i].y;
/* Perform clipping */
/* FIXME: We don't actually want to clip, as it may change line slope */
if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
continue;
}
/* Draw the end if it was clipped */
draw_end = (x2 != points[i].x || y2 != points[i].y);
func(dst, x1, y1, x2, y2, color, draw_end);
}
if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) {
SDL_DrawPoint(dst, points[count-1].x, points[count-1].y, color);
}
return 0;
}

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

Referenced by SW_RunCommandQueue().

DRAW_FASTSETPIXELXY1
#define DRAW_FASTSETPIXELXY1(x, y)
Definition: SDL_draw.h:42
DLINE
#define DLINE(type, op, draw_end)
Definition: SDL_draw.h:340
points
GLfixed GLfixed GLint GLint GLfixed points
Definition: SDL_opengl_glext.h:4558
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386
ABS
#define ABS(_x)
Definition: SDL_draw.h:293
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
SDL_PixelFormat::BitsPerPixel
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319
SDL_PixelFormat::BytesPerPixel
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
SDL_DrawPoint
int SDL_DrawPoint(SDL_Surface *dst, int x, int y, Uint32 color)
Definition: SDL_drawpoint.c:30
NULL
#define NULL
Definition: begin_code.h:167
SDL_PixelFormat::format
Uint32 format
Definition: SDL_pixels.h:317
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_DrawLine1
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_PixelFormat::Rmask
Uint32 Rmask
Definition: SDL_pixels.h:322
x1
GLuint GLfloat GLfloat GLfloat x1
Definition: SDL_opengl_glext.h:8583
func
GLenum func
Definition: SDL_opengl_glext.h:657
length
GLuint GLsizei GLsizei * length
Definition: SDL_opengl_glext.h:669
DRAW_FASTSETPIXEL4
#define DRAW_FASTSETPIXEL4
Definition: SDL_draw.h:36
SDL_CalculateDrawLineFunc
static DrawLineFunc SDL_CalculateDrawLineFunc(const SDL_PixelFormat *fmt)
Definition: SDL_drawline.c:125
DRAW_FASTSETPIXEL2
#define DRAW_FASTSETPIXEL2
Definition: SDL_draw.h:35
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1737
SDL_DrawLine4
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
BLINE
#define BLINE(x1, y1, x2, y2, op, draw_end)
Definition: SDL_draw.h:375
DRAW_FASTSETPIXELXY2
#define DRAW_FASTSETPIXELXY2(x, y)
Definition: SDL_draw.h:43
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
color
GLuint color
Definition: SDL_opengl_glext.h:1148
VLINE
#define VLINE(type, op, draw_end)
Definition: SDL_draw.h:318
AALINE
#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)
Definition: SDL_draw.h:537
DrawLineFunc
void(* DrawLineFunc)(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end)
Definition: SDL_drawline.c:120
DRAW_FASTSETPIXELXY4
#define DRAW_FASTSETPIXELXY4(x, y)
Definition: SDL_draw.h:44
Uint16
uint16_t Uint16
Definition: SDL_stdinc.h:191
DRAW_SETPIXELXY_BLEND_ARGB8888
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y)
Definition: SDL_draw.h:205
SDL_PixelFormat::Amask
Uint32 Amask
Definition: SDL_pixels.h:325
SDL_GetRGBA
#define SDL_GetRGBA
Definition: SDL_dynapi_overrides.h:289
DRAW_SETPIXELXY_BLEND_RGB565
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y)
Definition: SDL_draw.h:143
SDL_PixelFormat
Definition: SDL_pixels.h:315
SDL_DrawLine2
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
DRAW_SETPIXELXY2_BLEND_RGB
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y)
Definition: SDL_draw.h:239
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
x2
GLfixed GLfixed x2
Definition: SDL_opengl_glext.h:4583
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
DRAW_SETPIXELXY_BLEND_RGB888
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y)
Definition: SDL_draw.h:174
DRAW_SETPIXELXY4_BLEND_RGB
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y)
Definition: SDL_draw.h:242
DRAW_SETPIXELXY_BLEND_RGB555
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y)
Definition: SDL_draw.h:112
y1
GLfixed y1
Definition: SDL_opengl_glext.h:4583
DRAW_FASTSETPIXEL1
#define DRAW_FASTSETPIXEL1
Definition: SDL_draw.h:34
y2
GLfixed GLfixed GLfixed y2
Definition: SDL_opengl_glext.h:4583
HLINE
#define HLINE(type, op, draw_end)
Definition: SDL_draw.h:296
SDL_IntersectRectAndLine
#define SDL_IntersectRectAndLine
Definition: SDL_dynapi_overrides.h:297
i
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
SDL_bool
Definition: SDL_stdinc.h:161
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179