Mercurial > fife-parpg
comparison engine/core/video/sdl/sdlblendingfunctions.cpp @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 90005975cdbb |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4a0efb7baf70 |
---|---|
1 /*************************************************************************** | |
2 * Copyright (C) 2005-2008 by the FIFE team * | |
3 * http://www.fifengine.de * | |
4 * This file is part of FIFE. * | |
5 * * | |
6 * FIFE is free software; you can redistribute it and/or modify * | |
7 * it under the terms of the GNU General Public License as published by * | |
8 * the Free Software Foundation; either version 2 of the License, or * | |
9 * (at your option) any later version. * | |
10 * * | |
11 * This program is distributed in the hope that it will be useful, * | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
14 * GNU General Public License for more details. * | |
15 * * | |
16 * You should have received a copy of the GNU General Public License * | |
17 * along with this program; if not, write to the * | |
18 * Free Software Foundation, Inc., * | |
19 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * | |
20 ***************************************************************************/ | |
21 | |
22 // Standard C++ library includes | |
23 | |
24 // 3rd party library includes | |
25 | |
26 // FIFE includes | |
27 // These includes are split up in two parts, separated by one empty line | |
28 // First block: files included from the FIFE root src directory | |
29 // Second block: files included from the same folder | |
30 #include "sdlblendingfunctions.h" | |
31 | |
32 namespace FIFE { | |
33 | |
34 struct ColorRGB8 { | |
35 unsigned char r, g, b; | |
36 }; | |
37 | |
38 struct ColorRGBA8 { | |
39 unsigned char r, g, b, a; | |
40 }; | |
41 | |
42 void SDL_BlendRow_RGBA8_to_RGBA8( const unsigned char* src, unsigned char* dst, unsigned int alpha, int n ) { | |
43 const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); | |
44 ColorRGBA8* dstColor = reinterpret_cast< ColorRGBA8* >( dst ); | |
45 | |
46 for( int i = n; 0 < i; --i ) { | |
47 register unsigned int aMulA = alpha * srcColor->a; | |
48 | |
49 if( aMulA ) { | |
50 register unsigned int OneMin_aMulA = 65535 - aMulA; | |
51 dstColor->r = ( aMulA * srcColor->r + OneMin_aMulA * dstColor->r ) >> 16; | |
52 dstColor->g = ( aMulA * srcColor->g + OneMin_aMulA * dstColor->g ) >> 16; | |
53 dstColor->b = ( aMulA * srcColor->b + OneMin_aMulA * dstColor->b ) >> 16; | |
54 dstColor->a = 255; | |
55 } | |
56 ++dstColor; | |
57 ++srcColor; | |
58 } | |
59 } | |
60 | |
61 void SDL_BlendRow_RGBA8_to_RGB8( const unsigned char* src, unsigned char* dst, unsigned int alpha, int n ) { | |
62 const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); | |
63 ColorRGB8* dstColor = reinterpret_cast< ColorRGB8* >( dst ); | |
64 | |
65 for( int i = n; 0 < i; --i ) { | |
66 register unsigned int aMulA = alpha * srcColor->a; | |
67 if( aMulA ) { | |
68 register unsigned int OneMin_aMulA = 65535 - aMulA; | |
69 dstColor->r = ( aMulA * srcColor->r + OneMin_aMulA * dstColor->r ) >> 16; | |
70 dstColor->g = ( aMulA * srcColor->g + OneMin_aMulA * dstColor->g ) >> 16; | |
71 dstColor->b = ( aMulA * srcColor->b + OneMin_aMulA * dstColor->b ) >> 16; | |
72 } | |
73 | |
74 ++dstColor; | |
75 ++srcColor; | |
76 } | |
77 } | |
78 | |
79 void SDL_BlendRow_RGBA8_to_RGB565( const unsigned char* src, unsigned char* dst, unsigned int alpha, int n ) { | |
80 const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); | |
81 unsigned short* dstColor = reinterpret_cast< unsigned short* >( dst ); | |
82 | |
83 for( int i = n; 0 < i; --i ) { | |
84 register unsigned int aMulA = ( alpha * srcColor->a ) >> 8; | |
85 if( aMulA ) { | |
86 register unsigned int OneMin_aMulA = 255 - aMulA; | |
87 register unsigned int c = *dstColor; | |
88 *dstColor = ( ( ( srcColor->b * aMulA ) + | |
89 ( ( ( c & 0xF800 ) >> 8 ) * OneMin_aMulA ) ) & 0xF800 ) | | |
90 ( ( ( ( srcColor->g * aMulA ) + | |
91 ( ( ( c & 0x07E0 ) >> 3 ) * OneMin_aMulA ) ) >> 5 ) & 0x07E0 ) | | |
92 ( ( ( ( srcColor->r * aMulA ) + | |
93 ( ( ( c & 0x001F ) << 3 ) * OneMin_aMulA ) ) >> 11 ) & 0x001F ); | |
94 } | |
95 | |
96 ++dstColor; | |
97 ++srcColor; | |
98 } | |
99 } | |
100 | |
101 | |
102 void SDL_BlendRow_RGBA4_to_RGB565( const unsigned char* src, unsigned char* dst, unsigned int alpha, int n ) { | |
103 const unsigned short* srcColor = reinterpret_cast< const unsigned short* >( src ); | |
104 unsigned short* dstColor = reinterpret_cast< unsigned short* >( dst ); | |
105 | |
106 for( int i = n; 0 < i; --i ) { | |
107 register unsigned int c1 = *dstColor; | |
108 register unsigned int c2 = *srcColor; | |
109 | |
110 unsigned int aMulA = c2 & 0xF; | |
111 aMulA = ( alpha * aMulA ) / 15; ///< upgrade to range 0-255 | |
112 if( aMulA ) { | |
113 register unsigned int OneMin_aMulA = 255 - aMulA; | |
114 register unsigned int result; | |
115 result = ( ( ( ( c2 & 0xF000 ) | 0x0800 ) * aMulA ) + ( ( c1 & 0xF800 ) * OneMin_aMulA ) ) & 0xF80000; | |
116 result |= ( ( ( ( ( c2 & 0x0F00 ) >> 1 ) | 0x0040 ) * aMulA ) + ( ( c1 & 0x07E0 ) * OneMin_aMulA ) ) & 0x07E000; | |
117 result |= ( ( ( ( ( c2 & 0x00F0 ) >> 3 ) | 0x0001 ) * aMulA ) + ( ( c1 & 0x001F ) * OneMin_aMulA ) ) & 0x001F00; | |
118 /// multiplying by alpha resulted in shift. | |
119 *dstColor = static_cast< unsigned short int >( result >> 8 ); | |
120 } | |
121 | |
122 ++dstColor; | |
123 ++srcColor; | |
124 } | |
125 } | |
126 | |
127 } |