1 #include "Desaturate.h"
5 using std::runtime_error;
10 template<typename SrcType, typename DestType>
12 SrcType *src, SDL_PixelFormat *srcFmt,
13 DestType *dest, SDL_PixelFormat *destFmt,
16 Uint8 srcRed = (((*src) & srcFmt->Rmask)
17 >> srcFmt->Rshift) << srcFmt->Rloss;
18 Uint8 srcGreen = (((*src) & srcFmt->Gmask)
19 >> srcFmt->Gshift) << srcFmt->Gloss;
20 Uint8 srcBlue = (((*src) & srcFmt->Bmask)
21 >> srcFmt->Bshift) << srcFmt->Bloss;
23 Uint8 srcGrey = (srcRed * 76 + srcGreen * 150 + srcBlue * 29) / 255;
25 Uint8 destRed = (srcRed * amount + srcGrey * (255 - amount)) / 255;
26 Uint8 destGreen = (srcGreen * amount + srcGrey * (255 - amount)) / 255;
27 Uint8 destBlue = (srcBlue * amount + srcGrey * (255 - amount)) / 255;
30 = ((destRed >> destFmt->Rloss) << destFmt->Rshift)
31 | ((destGreen >> destFmt->Gloss) << destFmt->Gshift)
32 | ((destBlue >> destFmt->Bloss) << destFmt->Bshift)
33 | (*dest & destFmt->Amask);
40 Uint32 size = src->w * src->h;
42 SDL_LockSurface(dest);
43 SDL_PixelFormat *srcFmt = src->format;
44 SDL_PixelFormat *destFmt = dest->format;
45 Uint8 srcBPP = srcFmt->BytesPerPixel;
46 Uint8 destBPP = destFmt->BytesPerPixel;
49 SDL_UnlockSurface(dest);
50 SDL_UnlockSurface(src);
51 throw runtime_error("unable to read src format");
53 Uint16 *srcIter = reinterpret_cast<Uint16 *>(
55 Uint16 *srcEnd = srcIter + size;
58 SDL_UnlockSurface(dest);
59 SDL_UnlockSurface(src);
60 throw runtime_error("unable to read src format");
62 Uint16 *destIter = reinterpret_cast<Uint16 *>(
64 Uint16 *destEnd = destIter + size;
65 for (;srcIter < srcEnd && destIter < destEnd;
66 ++srcIter, ++destIter) {
74 Uint32 *destIter = reinterpret_cast<Uint32 *>(
76 Uint32 *destEnd = destIter + size;
77 for (;srcIter < srcEnd && destIter < destEnd;
78 ++srcIter, ++destIter) {
88 Uint32 *srcIter = reinterpret_cast<Uint32 *>(
90 Uint32 *srcEnd = srcIter + size;
93 SDL_UnlockSurface(dest);
94 SDL_UnlockSurface(src);
95 throw runtime_error("unable to read src format");
97 Uint16 *destIter = reinterpret_cast<Uint16 *>(
99 Uint16 *destEnd = destIter + size;
100 for (;srcIter < srcEnd && destIter < destEnd;
101 ++srcIter, ++destIter) {
109 Uint32 *destIter = reinterpret_cast<Uint32 *>(
111 Uint32 *destEnd = destIter + size;
112 for (;srcIter < srcEnd && destIter < destEnd;
113 ++srcIter, ++destIter) {
123 SDL_UnlockSurface(dest);
124 SDL_UnlockSurface(src);