~ubuntu-branches/ubuntu/maverick/pygame/maverick

« back to all changes in this revision

Viewing changes to src/surface.h

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2010-01-14 17:02:11 UTC
  • mfrom: (1.3.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100114170211-21eop2ja7mr9vdcr
Tags: 1.9.1release-0ubuntu1
* New upstream version (lp: #433304)
* debian/control:
  - build-depends on libportmidi-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
 
50
50
 
51
51
 
 
52
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
 
53
#define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16))
 
54
#else
 
55
#define GET_PIXEL_24(b) (b[2] + (b[1] << 8) + (b[0] << 16))
 
56
#endif
 
57
 
52
58
#define GET_PIXEL(pxl, bpp, source)               \
53
59
    switch (bpp)                                  \
54
60
    {                                             \
61
67
    default:                                      \
62
68
    {                                             \
63
69
        Uint8 *b = (Uint8 *) source;              \
64
 
        pxl = (SDL_BYTEORDER == SDL_LIL_ENDIAN) ? \
65
 
            b[0] + (b[1] << 8) + (b[2] << 16) :   \
66
 
            (b[0] << 16) + (b[1] << 8) + b[2];    \
 
70
        pxl = GET_PIXEL_24(b);                    \
67
71
    }                                             \
68
72
    break;                                        \
69
73
    }
70
74
 
71
 
#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt)                    \
 
75
#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa)               \
72
76
    _sR = ((px & fmt->Rmask) >> fmt->Rshift);                         \
73
77
    _sR = (_sR << fmt->Rloss) + (_sR >> (8 - (fmt->Rloss << 1)));     \
74
78
    _sG = ((px & fmt->Gmask) >> fmt->Gshift);                         \
75
79
    _sG = (_sG << fmt->Gloss) + (_sG >> (8 - (fmt->Gloss << 1)));     \
76
80
    _sB = ((px & fmt->Bmask) >> fmt->Bshift);                         \
77
81
    _sB = (_sB << fmt->Bloss) + (_sB >> (8 - (fmt->Bloss << 1)));     \
78
 
    if (fmt->Amask)                                                   \
 
82
    if (ppa)                                                          \
79
83
    {                                                                 \
80
84
        _sA = ((px & fmt->Amask) >> fmt->Ashift);                     \
81
85
        _sA = (_sA << fmt->Aloss) + (_sA >> (8 - (fmt->Aloss << 1))); \
97
101
 
98
102
 
99
103
 
 
104
#if SDL_BYTEORDER == SDL_LIL_ENDIAN               
 
105
#define SET_OFFSETS_24(or, og, ob, fmt)           \
 
106
    {                                             \
 
107
    or = (fmt->Rshift == 0 ? 0 :                  \
 
108
          fmt->Rshift == 8 ? 1 :                  \
 
109
                             2   );               \
 
110
    og = (fmt->Gshift == 0 ? 0 :                  \
 
111
          fmt->Gshift == 8 ? 1 :                  \
 
112
                             2   );               \
 
113
    ob = (fmt->Bshift == 0 ? 0 :                  \
 
114
          fmt->Bshift == 8 ? 1 :                  \
 
115
                             2   );               \
 
116
    }
 
117
 
 
118
#define SET_OFFSETS_32(or, og, ob, fmt)           \
 
119
    {                                             \
 
120
    or = (fmt->Rshift == 0  ? 0 :                 \
 
121
          fmt->Rshift == 8  ? 1 :                 \
 
122
          fmt->Rshift == 16 ? 2 :                 \
 
123
                              3   );              \
 
124
    og = (fmt->Gshift == 0  ? 0 :                 \
 
125
          fmt->Gshift == 8  ? 1 :                 \
 
126
          fmt->Gshift == 16 ? 2 :                 \
 
127
                              3   );              \
 
128
    ob = (fmt->Bshift == 0  ? 0 :                 \
 
129
          fmt->Bshift == 8  ? 1 :                 \
 
130
          fmt->Bshift == 16 ? 2 :                 \
 
131
                              3   );              \
 
132
    }
 
133
#else
 
134
#define SET_OFFSETS_24(or, og, ob, fmt)           \
 
135
    {                                             \
 
136
    or = (fmt->Rshift == 0 ? 2 :                  \
 
137
          fmt->Rshift == 8 ? 1 :                  \
 
138
                             0   );               \
 
139
    og = (fmt->Gshift == 0 ? 2 :                  \
 
140
          fmt->Gshift == 8 ? 1 :                  \
 
141
                             0   );               \
 
142
    ob = (fmt->Bshift == 0 ? 2 :                  \
 
143
          fmt->Bshift == 8 ? 1 :                  \
 
144
                             0   );               \
 
145
    }
 
146
 
 
147
#define SET_OFFSETS_32(or, og, ob, fmt)           \
 
148
    {                                             \
 
149
    or = (fmt->Rshift == 0  ? 3 :                 \
 
150
          fmt->Rshift == 8  ? 2 :                 \
 
151
          fmt->Rshift == 16 ? 1 :                 \
 
152
                              0   );              \
 
153
    og = (fmt->Gshift == 0  ? 3 :                 \
 
154
          fmt->Gshift == 8  ? 2 :                 \
 
155
          fmt->Gshift == 16 ? 1 :                 \
 
156
                              0   );              \
 
157
    ob = (fmt->Bshift == 0  ? 3 :                 \
 
158
          fmt->Bshift == 8  ? 2 :                 \
 
159
          fmt->Bshift == 16 ? 1 :                 \
 
160
                              0   );              \
 
161
    }
 
162
#endif
 
163
 
 
164
 
100
165
#define CREATE_PIXEL(buf, r, g, b, a, bp, ft)     \
101
166
    switch (bp)                                   \
102
167
    {                                             \
105
170
            ((r >> ft->Rloss) << ft->Rshift) |    \
106
171
            ((g >> ft->Gloss) << ft->Gshift) |    \
107
172
            ((b >> ft->Bloss) << ft->Bshift) |    \
108
 
            ((a << ft->Aloss) << ft->Ashift);     \
 
173
            ((a >> ft->Aloss) << ft->Ashift);     \
109
174
        break;                                    \
110
175
    case 4:                                       \
111
176
        *((Uint32 *) (buf)) =                     \
112
177
            ((r >> ft->Rloss) << ft->Rshift) |    \
113
178
            ((g >> ft->Gloss) << ft->Gshift) |    \
114
179
            ((b >> ft->Bloss) << ft->Bshift) |    \
115
 
            ((a << ft->Aloss) << ft->Ashift);     \
 
180
            ((a >> ft->Aloss) << ft->Ashift);     \
116
181
        break;                                    \
117
182
    }
118
183
 
212
277
 
213
278
 
214
279
#if 1
 
280
/* Choose an alpha blend equation. If the sign is preserved on a right shift
 
281
 * then use a specialized, faster, equation. Otherwise a more general form,
 
282
 * where all additions are done before the shift, is needed.
 
283
*/
 
284
#if (-1 >> 1) < 0
 
285
#define ALPHA_BLEND_COMP(sC, dC, sA) ((((sC - dC) * sA + sC) >> 8) + dC)
 
286
#else
 
287
#define ALPHA_BLEND_COMP(sC, dC, sA) (((dC << 8) + (sC - dC) * sA + sC) >> 8)
 
288
#endif
 
289
 
215
290
#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \
216
291
    do {                                            \
217
292
        if (dA)                                     \
218
293
        {                                           \
219
 
            dR = (((sR - dR) * sA) >> 8) + dR;      \
220
 
            dG = (((sG - dG) * sA) >> 8) + dG;      \
221
 
            dB = (((sB - dB) * sA) >> 8) + dB;      \
 
294
            dR = ALPHA_BLEND_COMP(sR, dR, sA);      \
 
295
            dG = ALPHA_BLEND_COMP(sG, dG, sA);      \
 
296
            dB = ALPHA_BLEND_COMP(sB, dB, sA);      \
222
297
            dA = sA + dA - ((sA * dA) / 255);       \
223
298
        }                                           \
224
299
        else                                        \