comparison src/video/SDL_blit_slow.c @ 2824:4dba7aa7ea77

Added slow but complete blit fallback Don't try to RLE encode surfaces that have alpha channel and alpha modulation Don't turn on blending when converting an RGB surface to RGBA format Do turn on blending when converting colorkey to alpha channel
author Sam Lantinga <slouken@libsdl.org>
date Tue, 02 Dec 2008 17:14:04 +0000
parents e893d24ad8db
children 99210400e8b9
comparison
equal deleted inserted replaced
2823:15e1dd1fff78 2824:4dba7aa7ea77
25 #include "SDL_blit.h" 25 #include "SDL_blit.h"
26 26
27 /* The ONE TRUE BLITTER 27 /* The ONE TRUE BLITTER
28 * This puppy has to handle all the unoptimized cases - yes, it's slow. 28 * This puppy has to handle all the unoptimized cases - yes, it's slow.
29 */ 29 */
30 void
31 SDL_Blit_Slow(SDL_BlitInfo * info)
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
50 srcy = 0;
51 posy = 0;
52 incy = (info->src_h << 16) / info->dst_h;
53 incx = (info->src_w << 16) / info->dst_w;
54
55 while (info->dst_h--) {
56 Uint8 *src;
57 Uint8 *dst = (Uint8 *) info->dst;
58 int n = info->dst_w;
59 srcx = -1;
60 posx = 0x10000L;
61 while (posy >= 0x10000L) {
62 ++srcy;
63 posy -= 0x10000L;
64 }
65 while (n--) {
66 if (posx >= 0x10000L) {
67 while (posx >= 0x10000L) {
68 ++srcx;
69 posx -= 0x10000L;
70 }
71 src =
72 (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
73 }
74 if (src_fmt->Amask) {
75 DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
76 srcB, srcA);
77 } else {
78 DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
79 srcB);
80 srcA = 0xFF;
81 }
82 if (flags & SDL_COPY_COLORKEY) {
83 /* srcpixel isn't set for 24 bpp */
84 if (srcbpp == 24) {
85 srcpixel = (srcR << src_fmt->Rshift) |
86 (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);
87 }
88 if (srcpixel == info->colorkey) {
89 posx += incx;
90 dst += dstbpp;
91 continue;
92 }
93 }
94 if (dst_fmt->Amask) {
95 DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
96 dstB, dstA);
97 } else {
98 DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
99 dstB);
100 dstA = 0xFF;
101 }
102
103 if (flags & SDL_COPY_MODULATE_COLOR) {
104 srcR = (srcR * modulateR) / 255;
105 srcG = (srcG * modulateG) / 255;
106 srcB = (srcB * modulateB) / 255;
107 }
108 if (flags & SDL_COPY_MODULATE_ALPHA) {
109 srcA = (srcA * modulateA) / 255;
110 }
111 if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) {
112 /* This goes away if we ever use premultiplied alpha */
113 if (srcA < 255) {
114 srcR = (srcR * srcA) / 255;
115 srcG = (srcG * srcA) / 255;
116 srcB = (srcB * srcA) / 255;
117 }
118 }
119 switch (flags &
120 (SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD |
121 SDL_COPY_MOD)) {
122 case 0:
123 dstR = srcR;
124 dstG = srcG;
125 dstB = srcB;
126 dstA = srcA;
127 break;
128 case SDL_COPY_MASK:
129 if (srcA) {
130 dstR = srcR;
131 dstG = srcG;
132 dstB = srcB;
133 }
134 break;
135 case SDL_COPY_BLEND:
136 dstR = srcR + ((255 - srcA) * dstR) / 255;
137 dstG = srcG + ((255 - srcA) * dstG) / 255;
138 dstB = srcB + ((255 - srcA) * dstB) / 255;
139 break;
140 case SDL_COPY_ADD:
141 dstR = srcR + dstR;
142 if (dstR > 255)
143 dstR = 255;
144 dstG = srcG + dstG;
145 if (dstG > 255)
146 dstG = 255;
147 dstB = srcB + dstB;
148 if (dstB > 255)
149 dstB = 255;
150 break;
151 case SDL_COPY_MOD:
152 dstR = (srcR * dstR) / 255;
153 dstG = (srcG * dstG) / 255;
154 dstB = (srcB * dstB) / 255;
155 break;
156 }
157 if (dst_fmt->Amask) {
158 ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);
159 } else {
160 ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);
161 }
162 posx += incx;
163 dst += dstbpp;
164 }
165 posy += incy;
166 info->dst += info->dst_pitch;
167 }
168 }
30 169
31 /* vi: set ts=4 sw=4 expandtab: */ 170 /* vi: set ts=4 sw=4 expandtab: */