2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/common/blending-options.h>
21 namespace // unnamed namespace
26 const int MASK_SRC_FACTOR_RGB = 0x0000000F;
27 const int MASK_SRC_FACTOR_ALPHA = 0x000000F0;
28 const int MASK_DEST_FACTOR_RGB = 0x00000F00;
29 const int MASK_DEST_FACTOR_ALPHA = 0x0000F000;
30 const int MASK_EQUATION_RGB = 0x000F0000;
31 const int MASK_EQUATION_ALPHA = 0x00F00000;
33 const int SHIFT_TO_SRC_FACTOR_RGB = 0;
34 const int SHIFT_TO_SRC_FACTOR_ALPHA = 4;
35 const int SHIFT_TO_DEST_FACTOR_RGB = 8;
36 const int SHIFT_TO_DEST_FACTOR_ALPHA = 12;
37 const int SHIFT_TO_EQUATION_RGB = 16;
38 const int SHIFT_TO_EQUATION_ALPHA = 20;
40 static unsigned int CLEAR_BLEND_FUNC_MASK = 0xFFFF0000; // Bottom 16 bits cleared
41 static unsigned int CLEAR_BLEND_EQUATION_MASK = 0xFF00FFFF; // 8 bits cleared
44 * Utility to store one of the BlendFunc values.
45 * @param[out] options A bitmask used to store the BlendFunc values.
46 * @param[in] factor The BlendFunc value.
47 * @param[in] bitshift Used to shift to the correct part of options.
49 void StoreBlendFactor( unsigned int& options, BlendFactor::Type factor, int bitShift )
53 case BlendFactor::ZERO:
55 options |= ( 0u << bitShift );
59 case BlendFactor::ONE:
61 options |= ( 1u << bitShift );
65 case BlendFactor::SRC_COLOR:
67 options |= ( 2u << bitShift );
71 case BlendFactor::ONE_MINUS_SRC_COLOR:
73 options |= ( 3u << bitShift );
77 case BlendFactor::SRC_ALPHA:
79 options |= ( 4u << bitShift );
83 case BlendFactor::ONE_MINUS_SRC_ALPHA:
85 options |= ( 5u << bitShift );
89 case BlendFactor::DST_ALPHA:
91 options |= ( 6u << bitShift );
95 case BlendFactor::ONE_MINUS_DST_ALPHA:
97 options |= ( 7u << bitShift );
101 case BlendFactor::DST_COLOR:
103 options |= ( 8u << bitShift );
107 case BlendFactor::ONE_MINUS_DST_COLOR:
109 options |= ( 9u << bitShift );
113 case BlendFactor::SRC_ALPHA_SATURATE:
115 options |= ( 10u << bitShift );
119 case BlendFactor::CONSTANT_COLOR:
121 options |= ( 11u << bitShift );
125 case BlendFactor::ONE_MINUS_CONSTANT_COLOR:
127 options |= ( 12u << bitShift );
131 case BlendFactor::CONSTANT_ALPHA:
133 options |= ( 13u << bitShift );
137 case BlendFactor::ONE_MINUS_CONSTANT_ALPHA:
139 options |= ( 14u << bitShift );
146 * Utility to store one of the BlendEquation values.
147 * @param[out] options A bitmask used to store the BlendEquation values.
148 * @param[in] factor The BlendEquation value.
149 * @param[in] bitshift Used to shift to the correct part of options.
151 void StoreBlendEquation( unsigned int& options, BlendEquation::Type factor, int bitShift )
155 case BlendEquation::ADD:
157 options |= ( 0u << bitShift );
161 case BlendEquation::SUBTRACT:
163 options |= ( 1u << bitShift );
167 case BlendEquation::REVERSE_SUBTRACT:
169 options |= ( 2u << bitShift );
175 const unsigned int BLENDING_FACTOR_COUNT = 15;
176 const unsigned int BLENDING_EQUATION_COUNT = 3;
178 BlendFactor::Type BLENDING_FACTORS[ BLENDING_FACTOR_COUNT ] =
181 BlendFactor::SRC_COLOR,
182 BlendFactor::ONE_MINUS_SRC_COLOR,
183 BlendFactor::SRC_ALPHA,
184 BlendFactor::ONE_MINUS_SRC_ALPHA,
185 BlendFactor::DST_ALPHA,
186 BlendFactor::ONE_MINUS_DST_ALPHA,
187 BlendFactor::DST_COLOR,
188 BlendFactor::ONE_MINUS_DST_COLOR,
189 BlendFactor::SRC_ALPHA_SATURATE,
190 BlendFactor::CONSTANT_COLOR,
191 BlendFactor::ONE_MINUS_CONSTANT_COLOR,
192 BlendFactor::CONSTANT_ALPHA,
193 BlendFactor::ONE_MINUS_CONSTANT_ALPHA };
195 BlendEquation::Type BLENDING_EQUATIONS[ BLENDING_EQUATION_COUNT ] =
196 { BlendEquation::ADD,
197 BlendEquation::SUBTRACT,
198 BlendEquation::REVERSE_SUBTRACT };
201 * Utility to retrieve one of the BlendFunc values.
202 * @param[in] options A bitmask of blending values.
203 * @param[in] mask The used to mask unwanted values.
204 * @param[in] bitshift Used to shift to the correct part of options.
205 * @return The blending factor.
207 BlendFactor::Type RetrieveBlendFactor( unsigned int options, int mask, int bitShift )
209 unsigned int index = options & mask;
210 index = index >> bitShift;
212 DALI_ASSERT_DEBUG( index < BLENDING_FACTOR_COUNT );
214 return BLENDING_FACTORS[ index ];
218 * Utility to retrieve one of the BlendEquation values.
219 * @param[in] options A bitmask of blending values.
220 * @param[in] mask The used to mask unwanted values.
221 * @param[in] bitshift Used to shift to the correct part of options.
222 * @return The blending equation.
224 BlendEquation::Type RetrieveBlendEquation( unsigned int options, int mask, int bitShift )
226 unsigned int index = options & mask;
227 index = index >> bitShift;
229 DALI_ASSERT_DEBUG( index < BLENDING_EQUATION_COUNT );
231 return BLENDING_EQUATIONS[ index ];
234 } // unnamed namespace
242 BlendingOptions::BlendingOptions()
246 SetBlendFunc( BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA,
247 BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA );
249 SetBlendEquation( BlendEquation::ADD, BlendEquation::ADD );
252 BlendingOptions::~BlendingOptions()
256 void BlendingOptions::SetBitmask( unsigned int bitmask )
261 unsigned int BlendingOptions::GetBitmask() const
266 void BlendingOptions::SetBlendFunc( BlendFactor::Type srcFactorRgb, BlendFactor::Type destFactorRgb,
267 BlendFactor::Type srcFactorAlpha, BlendFactor::Type destFactorAlpha )
269 mBitmask &= CLEAR_BLEND_FUNC_MASK; // Clear the BlendFunc values
271 StoreBlendFactor( mBitmask, srcFactorRgb, SHIFT_TO_SRC_FACTOR_RGB );
272 StoreBlendFactor( mBitmask, destFactorRgb, SHIFT_TO_DEST_FACTOR_RGB );
273 StoreBlendFactor( mBitmask, srcFactorAlpha, SHIFT_TO_SRC_FACTOR_ALPHA );
274 StoreBlendFactor( mBitmask, destFactorAlpha, SHIFT_TO_DEST_FACTOR_ALPHA );
277 BlendFactor::Type BlendingOptions::GetBlendSrcFactorRgb() const
279 return RetrieveBlendFactor( mBitmask, MASK_SRC_FACTOR_RGB, SHIFT_TO_SRC_FACTOR_RGB );
282 BlendFactor::Type BlendingOptions::GetBlendDestFactorRgb() const
284 return RetrieveBlendFactor( mBitmask, MASK_DEST_FACTOR_RGB, SHIFT_TO_DEST_FACTOR_RGB );
287 BlendFactor::Type BlendingOptions::GetBlendSrcFactorAlpha() const
289 return RetrieveBlendFactor( mBitmask, MASK_SRC_FACTOR_ALPHA, SHIFT_TO_SRC_FACTOR_ALPHA );
292 BlendFactor::Type BlendingOptions::GetBlendDestFactorAlpha() const
294 return RetrieveBlendFactor( mBitmask, MASK_DEST_FACTOR_ALPHA, SHIFT_TO_DEST_FACTOR_ALPHA );
297 void BlendingOptions::SetBlendEquation( BlendEquation::Type equationRgb, BlendEquation::Type equationAlpha )
299 mBitmask &= CLEAR_BLEND_EQUATION_MASK; // Clear the BlendEquation values
301 StoreBlendEquation( mBitmask, equationRgb, SHIFT_TO_EQUATION_RGB );
302 StoreBlendEquation( mBitmask, equationAlpha, SHIFT_TO_EQUATION_ALPHA );
305 BlendEquation::Type BlendingOptions::GetBlendEquationRgb() const
307 return RetrieveBlendEquation( mBitmask, MASK_EQUATION_RGB, SHIFT_TO_EQUATION_RGB );
310 BlendEquation::Type BlendingOptions::GetBlendEquationAlpha() const
312 return RetrieveBlendEquation( mBitmask, MASK_EQUATION_ALPHA, SHIFT_TO_EQUATION_ALPHA );
315 void BlendingOptions::SetBlendColor( const Vector4& color )
317 if( Color::TRANSPARENT == color )
325 *mBlendColor = color;
329 // Lazy allocation when non-default is set
330 mBlendColor = new Vector4( color );
335 const Vector4* BlendingOptions::GetBlendColor() const
337 return mBlendColor.Get();
340 } // namespace Internal