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.

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, blit_table::dstB, blit_table::dstbpp, blit_table::dstG, blit_table::dstR, 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, SDL_BlitInfo::src_w, blit_table::srcB, blit_table::srcG, and blit_table::srcR.

Referenced by SDL_CalculateBlit().

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  }
84  if (flags & SDL_COPY_COLORKEY) {
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 
105  if (flags & SDL_COPY_MODULATE_COLOR) {
106  srcR = (srcR * modulateR) / 255;
107  srcG = (srcG * modulateG) / 255;
108  srcB = (srcB * modulateB) / 255;
109  }
110  if (flags & SDL_COPY_MODULATE_ALPHA) {
111  srcA = (srcA * modulateA) / 255;
112  }
113  if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) {
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  }
121  switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {
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 }
Uint8 r
Definition: SDL_blit.h:70
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
Uint32 srcG
Definition: SDL_blit_N.c:2471
Uint32 srcB
Definition: SDL_blit_N.c:2471
Uint8 b
Definition: SDL_blit.h:70
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
GLenum GLenum dst
Uint32 dstB
Definition: SDL_blit_N.c:2473
Uint32 dstR
Definition: SDL_blit_N.c:2473
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
Uint8 g
Definition: SDL_blit.h:70
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a)
Definition: SDL_blit.h:402
int dst_pitch
Definition: SDL_blit.h:63
uint32_t Uint32
Definition: SDL_stdinc.h:181
GLenum src
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
Uint32 colorkey
Definition: SDL_blit.h:69
Uint8 * dst
Definition: SDL_blit.h:61
Uint32 srcR
Definition: SDL_blit_N.c:2471
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a)
Definition: SDL_blit.h:353
Uint32 dstG
Definition: SDL_blit_N.c:2473
uint8_t Uint8
Definition: SDL_stdinc.h:157
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b)
Definition: SDL_blit.h:261
Uint8 * src
Definition: SDL_blit.h:57
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
int src_pitch
Definition: SDL_blit.h:59
GLbitfield flags
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
GLdouble n
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b)
Definition: SDL_blit.h:177
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
Uint8 a
Definition: SDL_blit.h:70