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 }