FIFE  be64c707dea6b3250bd4355bf5c825d25920087d
sdlblendingfunctions.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005-2019 by the FIFE team *
3  * http://www.fifengine.net *
4  * This file is part of FIFE. *
5  * *
6  * FIFE is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Lesser General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2.1 of the License, or (at your option) any later version. *
10  * *
11  * This library 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 GNU *
14  * Lesser General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Lesser General Public *
17  * License along with this library; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, 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  uint8_t r, g, b;
36  };
37 
38  struct ColorRGBA8 {
39  uint8_t r, g, b, a;
40  };
41 
42  void SDL_BlendRow_RGBA8_to_RGBA8( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) {
43  const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src );
44  ColorRGBA8* dstColor = reinterpret_cast< ColorRGBA8* >( dst );
45 
46  for( int32_t i = n; 0 < i; --i ) {
47  uint32_t aMulA = alpha * srcColor->a;
48 
49  if( aMulA ) {
50  uint32_t 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 uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) {
62  const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src );
63  ColorRGB8* dstColor = reinterpret_cast< ColorRGB8* >( dst );
64 
65  for( int32_t i = n; 0 < i; --i ) {
66  uint32_t aMulA = alpha * srcColor->a;
67  if( aMulA ) {
68  uint32_t 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 uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) {
80  const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src );
81  uint16_t* dstColor = reinterpret_cast< uint16_t* >( dst );
82 
83  for( int32_t i = n; 0 < i; --i ) {
84  uint32_t aMulA = ( alpha * srcColor->a ) >> 8;
85  if( aMulA ) {
86  uint32_t OneMin_aMulA = 255 - aMulA;
87  uint32_t 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 uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) {
103  const uint16_t* srcColor = reinterpret_cast< const uint16_t* >( src );
104  uint16_t* dstColor = reinterpret_cast< uint16_t* >( dst );
105 
106  for( int32_t i = n; 0 < i; --i ) {
107  uint32_t c1 = *dstColor;
108  uint32_t c2 = *srcColor;
109 
110  uint32_t aMulA = c2 & 0xF;
111  aMulA = ( alpha * aMulA ) / 15;
112  if( aMulA ) {
113  uint32_t OneMin_aMulA = 255 - aMulA;
114  uint32_t 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;
119  *dstColor = static_cast< uint16_t >( result >> 8 );
120  }
121 
122  ++dstColor;
123  ++srcColor;
124  }
125  }
126 
127 }
void SDL_BlendRow_RGBA8_to_RGB8(const uint8_t *src, uint8_t *dst, uint32_t alpha, int32_t n)
Blends one row of n pixels from src with n pixels of dst.
void SDL_BlendRow_RGBA8_to_RGBA8(const uint8_t *src, uint8_t *dst, uint32_t alpha, int32_t n)
Blends one row of n pixels from src with n pixels of dst.
unsigned char uint8_t
Definition: core.h:38
unsigned short uint16_t
Definition: core.h:39
void SDL_BlendRow_RGBA4_to_RGB565(const uint8_t *src, uint8_t *dst, uint32_t alpha, int32_t n)
Blends one row of n pixels from src with n pixels of dst.
unsigned int uint32_t
Definition: core.h:40
void SDL_BlendRow_RGBA8_to_RGB565(const uint8_t *src, uint8_t *dst, uint32_t alpha, int32_t n)
Blends one row of n pixels from src with n pixels of dst.