SDL 2.0
SDL_blit_slow.h File Reference
#include "../SDL_internal.h"
+ Include dependency graph for SDL_blit_slow.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void SDL_Blit_Slow (SDL_BlitInfo *info)
 

Function Documentation

◆ SDL_Blit_Slow()

void SDL_Blit_Slow ( SDL_BlitInfo info)

Definition at line 31 of file SDL_blit_slow.c.

32{
33 const int flags = info->flags;
34 const Uint32 modulateR = info->r;
35 const Uint32 modulateG = info->g;
36 const Uint32 modulateB = info->b;
37 const Uint32 modulateA = info->a;
38 Uint32 srcpixel;
39 Uint32 srcR, srcG, srcB, srcA;
40 Uint32 dstpixel;
41 Uint32 dstR, dstG, dstB, dstA;
42 int srcy, srcx;
43 int posy, posx;
44 int incy, incx;
45 SDL_PixelFormat *src_fmt = info->src_fmt;
46 SDL_PixelFormat *dst_fmt = info->dst_fmt;
47 int srcbpp = src_fmt->BytesPerPixel;
48 int dstbpp = dst_fmt->BytesPerPixel;
49 Uint32 rgbmask = ~src_fmt->Amask;
50 Uint32 ckey = info->colorkey & rgbmask;
51
52 srcy = 0;
53 posy = 0;
54 incy = (info->src_h << 16) / info->dst_h;
55 incx = (info->src_w << 16) / info->dst_w;
56
57 while (info->dst_h--) {
58 Uint8 *src = 0;
59 Uint8 *dst = (Uint8 *) info->dst;
60 int n = info->dst_w;
61 srcx = -1;
62 posx = 0x10000L;
63 while (posy >= 0x10000L) {
64 ++srcy;
65 posy -= 0x10000L;
66 }
67 while (n--) {
68 if (posx >= 0x10000L) {
69 while (posx >= 0x10000L) {
70 ++srcx;
71 posx -= 0x10000L;
72 }
73 src =
74 (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
75 }
76 if (src_fmt->Amask) {
77 DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
78 srcB, srcA);
79 } else {
80 DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
81 srcB);
82 srcA = 0xFF;
83 }
85 /* srcpixel isn't set for 24 bpp */
86 if (srcbpp == 3) {
87 srcpixel = (srcR << src_fmt->Rshift) |
88 (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);
89 }
90 if ((srcpixel & rgbmask) == ckey) {
91 posx += incx;
92 dst += dstbpp;
93 continue;
94 }
95 }
96 if (dst_fmt->Amask) {
97 DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
98 dstB, dstA);
99 } else {
100 DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
101 dstB);
102 dstA = 0xFF;
103 }
104
106 srcR = (srcR * modulateR) / 255;
107 srcG = (srcG * modulateG) / 255;
108 srcB = (srcB * modulateB) / 255;
109 }
111 srcA = (srcA * modulateA) / 255;
112 }
114 /* This goes away if we ever use premultiplied alpha */
115 if (srcA < 255) {
116 srcR = (srcR * srcA) / 255;
117 srcG = (srcG * srcA) / 255;
118 srcB = (srcB * srcA) / 255;
119 }
120 }
122 case 0:
123 dstR = srcR;
124 dstG = srcG;
125 dstB = srcB;
126 dstA = srcA;
127 break;
128 case SDL_COPY_BLEND:
129 dstR = srcR + ((255 - srcA) * dstR) / 255;
130 dstG = srcG + ((255 - srcA) * dstG) / 255;
131 dstB = srcB + ((255 - srcA) * dstB) / 255;
132 dstA = srcA + ((255 - srcA) * dstA) / 255;
133 break;
134 case SDL_COPY_ADD:
135 dstR = srcR + dstR;
136 if (dstR > 255)
137 dstR = 255;
138 dstG = srcG + dstG;
139 if (dstG > 255)
140 dstG = 255;
141 dstB = srcB + dstB;
142 if (dstB > 255)
143 dstB = 255;
144 break;
145 case SDL_COPY_MOD:
146 dstR = (srcR * dstR) / 255;
147 dstG = (srcG * dstG) / 255;
148 dstB = (srcB * dstB) / 255;
149 break;
150 }
151 if (dst_fmt->Amask) {
152 ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);
153 } else {
154 ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);
155 }
156 posx += incx;
157 dst += dstbpp;
158 }
159 posy += incy;
160 info->dst += info->dst_pitch;
161 }
162}
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a)
Definition: SDL_blit.h:402
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b)
Definition: SDL_blit.h:177
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a)
Definition: SDL_blit.h:353
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b)
Definition: SDL_blit.h:261
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
GLenum src
GLenum GLenum dst
GLbitfield flags
GLdouble n
uint32_t Uint32
Definition: SDL_stdinc.h:203
uint8_t Uint8
Definition: SDL_stdinc.h:179
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
Uint8 r
Definition: SDL_blit.h:70
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
int src_pitch
Definition: SDL_blit.h:59
int dst_pitch
Definition: SDL_blit.h:63
Uint8 a
Definition: SDL_blit.h:70
Uint8 * src
Definition: SDL_blit.h:57
Uint32 colorkey
Definition: SDL_blit.h:69
Uint8 g
Definition: SDL_blit.h:70
Uint8 * dst
Definition: SDL_blit.h:61
Uint8 b
Definition: SDL_blit.h:70
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320

References SDL_BlitInfo::a, SDL_PixelFormat::Amask, ASSEMBLE_RGB, ASSEMBLE_RGBA, SDL_BlitInfo::b, SDL_PixelFormat::Bshift, SDL_PixelFormat::BytesPerPixel, SDL_BlitInfo::colorkey, DISEMBLE_RGB, DISEMBLE_RGBA, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_pitch, SDL_BlitInfo::dst_w, SDL_BlitInfo::flags, SDL_BlitInfo::g, SDL_PixelFormat::Gshift, SDL_BlitInfo::r, SDL_PixelFormat::Rshift, SDL_COPY_ADD, SDL_COPY_BLEND, SDL_COPY_COLORKEY, SDL_COPY_MOD, SDL_COPY_MODULATE_ALPHA, SDL_COPY_MODULATE_COLOR, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, SDL_BlitInfo::src_h, SDL_BlitInfo::src_pitch, and SDL_BlitInfo::src_w.

Referenced by SDL_CalculateBlit().