annotate src/scale2x.c @ 3172:d1b367fc08bc tests-returncode

Use a return code of 1 when the tests fail.
author Thomas Kluyver <takowl@gmail.com>
date Wed, 09 Jan 2013 10:13:57 +0000
parents e047f852b925
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
432
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
1 /*
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
2 pygame - Python Game Library
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
3 Copyright (C) 2000-2001 Pete Shinners
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
4
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
6 modify it under the terms of the GNU Library General Public
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
7 License as published by the Free Software Foundation; either
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
8 version 2 of the License, or (at your option) any later version.
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
9
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
13 Library General Public License for more details.
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
14
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
15 You should have received a copy of the GNU Library General Public
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
16 License along with this library; if not, write to the Free
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
18
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
19 Pete Shinners
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
20 pete@shinners.org
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
21 */
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
22
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
23 /*
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
24 This implements the AdvanceMAME Scale2x feature found on this page,
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
25 http://advancemame.sourceforge.net/scale2x.html
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
26
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
27 It is an incredibly simple and powerful image doubling routine that does
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
28 an astonishing job of doubling game graphic data while interpolating out
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
29 the jaggies. Congrats to the AdvanceMAME team, I'm very impressed and
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
30 surprised with this code!
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
31 */
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
32
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
33
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
34
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
35 #include <SDL.h>
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
36 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
37 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
38
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
39
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
40 #define READINT24(x) ((x)[0]<<16 | (x)[1]<<8 | (x)[2])
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
41 #define WRITEINT24(x, i) {(x)[0]=i>>16; (x)[1]=(i>>8)&0xff; x[2]=i&0xff; }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
42
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
43 /*
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
44 this requires a destination surface already setup to be twice as
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
45 large as the source. oh, and formats must match too. this will just
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
46 blindly assume you didn't flounder.
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
47 */
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
48
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
49 void scale2x(SDL_Surface *src, SDL_Surface *dst)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
50 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
51 int looph, loopw;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
52
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
53 Uint8* srcpix = (Uint8*)src->pixels;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
54 Uint8* dstpix = (Uint8*)dst->pixels;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
55
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
56 const int srcpitch = src->pitch;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
57 const int dstpitch = dst->pitch;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
58 const int width = src->w;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
59 const int height = src->h;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
60
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
61 switch(src->format->BytesPerPixel)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
62 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
63 case 1: {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
64 Uint8 E0, E1, E2, E3, B, D, E, F, H;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
65 for(looph = 0; looph < height; ++looph)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
66 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
67 for(loopw = 0; loopw < width; ++ loopw)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
68 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
69 B = *(Uint8*)(srcpix + (MAX(0,looph-1)*srcpitch) + (1*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
70 D = *(Uint8*)(srcpix + (looph*srcpitch) + (1*MAX(0,loopw-1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
71 E = *(Uint8*)(srcpix + (looph*srcpitch) + (1*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
72 F = *(Uint8*)(srcpix + (looph*srcpitch) + (1*MIN(width-1,loopw+1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
73 H = *(Uint8*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (1*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
74
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
75 E0 = D == B && B != F && D != H ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
76 E1 = B == F && B != D && F != H ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
77 E2 = D == H && D != B && H != F ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
78 E3 = H == F && D != H && B != F ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
79
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
80 *(Uint8*)(dstpix + looph*2*dstpitch + loopw*2*1) = E0;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
81 *(Uint8*)(dstpix + looph*2*dstpitch + (loopw*2+1)*1) = E1;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
82 *(Uint8*)(dstpix + (looph*2+1)*dstpitch + loopw*2*1) = E2;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
83 *(Uint8*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*1) = E3;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
84 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
85 }break;}
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
86 case 2: {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
87 Uint16 E0, E1, E2, E3, B, D, E, F, H;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
88 for(looph = 0; looph < height; ++looph)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
89 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
90 for(loopw = 0; loopw < width; ++ loopw)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
91 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
92 B = *(Uint16*)(srcpix + (MAX(0,looph-1)*srcpitch) + (2*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
93 D = *(Uint16*)(srcpix + (looph*srcpitch) + (2*MAX(0,loopw-1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
94 E = *(Uint16*)(srcpix + (looph*srcpitch) + (2*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
95 F = *(Uint16*)(srcpix + (looph*srcpitch) + (2*MIN(width-1,loopw+1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
96 H = *(Uint16*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (2*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
97
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
98 E0 = D == B && B != F && D != H ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
99 E1 = B == F && B != D && F != H ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
100 E2 = D == H && D != B && H != F ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
101 E3 = H == F && D != H && B != F ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
102
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
103 *(Uint16*)(dstpix + looph*2*dstpitch + loopw*2*2) = E0;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
104 *(Uint16*)(dstpix + looph*2*dstpitch + (loopw*2+1)*2) = E1;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
105 *(Uint16*)(dstpix + (looph*2+1)*dstpitch + loopw*2*2) = E2;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
106 *(Uint16*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*2) = E3;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
107 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
108 }break;}
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
109 case 3: {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
110 int E0, E1, E2, E3, B, D, E, F, H;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
111 for(looph = 0; looph < height; ++looph)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
112 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
113 for(loopw = 0; loopw < width; ++ loopw)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
114 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
115 B = READINT24(srcpix + (MAX(0,looph-1)*srcpitch) + (3*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
116 D = READINT24(srcpix + (looph*srcpitch) + (3*MAX(0,loopw-1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
117 E = READINT24(srcpix + (looph*srcpitch) + (3*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
118 F = READINT24(srcpix + (looph*srcpitch) + (3*MIN(width-1,loopw+1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
119 H = READINT24(srcpix + (MIN(height-1,looph+1)*srcpitch) + (3*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
120
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
121 E0 = D == B && B != F && D != H ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
122 E1 = B == F && B != D && F != H ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
123 E2 = D == H && D != B && H != F ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
124 E3 = H == F && D != H && B != F ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
125
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
126 WRITEINT24((dstpix + looph*2*dstpitch + loopw*2*3), E0);
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
127 WRITEINT24((dstpix + looph*2*dstpitch + (loopw*2+1)*3), E1);
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
128 WRITEINT24((dstpix + (looph*2+1)*dstpitch + loopw*2*3), E2);
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
129 WRITEINT24((dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*3), E3);
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
130 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
131 }break;}
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
132 default: { /*case 4:*/
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
133 Uint32 E0, E1, E2, E3, B, D, E, F, H;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
134 for(looph = 0; looph < height; ++looph)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
135 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
136 for(loopw = 0; loopw < width; ++ loopw)
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
137 {
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
138 B = *(Uint32*)(srcpix + (MAX(0,looph-1)*srcpitch) + (4*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
139 D = *(Uint32*)(srcpix + (looph*srcpitch) + (4*MAX(0,loopw-1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
140 E = *(Uint32*)(srcpix + (looph*srcpitch) + (4*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
141 F = *(Uint32*)(srcpix + (looph*srcpitch) + (4*MIN(width-1,loopw+1)));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
142 H = *(Uint32*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (4*loopw));
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
143
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
144 E0 = D == B && B != F && D != H ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
145 E1 = B == F && B != D && F != H ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
146 E2 = D == H && D != B && H != F ? D : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
147 E3 = H == F && D != H && B != F ? F : E;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
148
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
149 *(Uint32*)(dstpix + looph*2*dstpitch + loopw*2*4) = E0;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
150 *(Uint32*)(dstpix + looph*2*dstpitch + (loopw*2+1)*4) = E1;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
151 *(Uint32*)(dstpix + (looph*2+1)*dstpitch + loopw*2*4) = E2;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
152 *(Uint32*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*4) = E3;
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
153 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
154 }break;}
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
155 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
156 }
e047f852b925 advancemame scale2x
pygame
parents:
diff changeset
157