2 * Copyright (c) 2020 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 = 0x00FF0000;
31 const int MASK_EQUATION_ALPHA = 0xFF000000;
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 = 24;
40 static unsigned int CLEAR_BLEND_FUNC_MASK = 0xFFFF0000; // Bottom 16 bits cleared
41 static unsigned int CLEAR_BLEND_EQUATION_MASK = 0x0000FFFF; // Top 16 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, DevelBlendEquation::Type factor, int bitShift )
153 // Must be same order as BLENDING_EQUATIONS, below:
157 REVERSE_SUBTRACT_BITVAL,
179 case DevelBlendEquation::ADD:
181 options |= ( ADD_BITVAL << bitShift );
185 case DevelBlendEquation::SUBTRACT:
187 options |= ( SUBTRACT_BITVAL << bitShift );
191 case DevelBlendEquation::REVERSE_SUBTRACT:
193 options |= ( REVERSE_SUBTRACT_BITVAL << bitShift );
197 case DevelBlendEquation::MIN:
199 options |= ( MIN_BITVAL << bitShift );
203 case DevelBlendEquation::MAX:
205 options |= ( MAX_BITVAL << bitShift );
209 case DevelBlendEquation::MULTIPLY:
211 options |= ( MULTIPLY_BITVAL << bitShift );
215 case DevelBlendEquation::SCREEN:
217 options |= ( SCREEN_BITVAL << bitShift );
221 case DevelBlendEquation::OVERLAY:
223 options |= ( OVERLAY_BITVAL << bitShift );
227 case DevelBlendEquation::DARKEN:
229 options |= ( DARKEN_BITVAL << bitShift );
233 case DevelBlendEquation::LIGHTEN:
235 options |= ( LIGHTEN_BITVAL << bitShift );
239 case DevelBlendEquation::COLOR_DODGE:
241 options |= ( COLOR_DODGE_BITVAL << bitShift );
245 case DevelBlendEquation::COLOR_BURN:
247 options |= ( COLOR_BURN_BITVAL << bitShift );
251 case DevelBlendEquation::HARD_LIGHT:
253 options |= ( HARD_LIGHT_BITVAL << bitShift );
257 case DevelBlendEquation::SOFT_LIGHT:
259 options |= ( SOFT_LIGHT_BITVAL << bitShift );
263 case DevelBlendEquation::DIFFERENCE:
265 options |= ( DIFFERENCE_BITVAL << bitShift );
269 case DevelBlendEquation::EXCLUSION:
271 options |= ( EXCLUSION_BITVAL << bitShift );
275 case DevelBlendEquation::HUE:
277 options |= ( HUE_BITVAL << bitShift );
281 case DevelBlendEquation::SATURATION:
283 options |= ( SATURATION_BITVAL << bitShift );
287 case DevelBlendEquation::COLOR:
289 options |= ( COLOR_BITVAL << bitShift );
293 case DevelBlendEquation::LUMINOSITY:
295 options |= ( LUMINOSITY_BITVAL << bitShift );
301 const unsigned int BLENDING_FACTOR_COUNT = 15;
302 const unsigned int BLENDING_EQUATION_COUNT = 20;
303 const unsigned int BLENDING_EQUATION_ADVANCED_INDEX_START = 5;
304 const unsigned int BLENDING_EQUATION_ADVANCED_INDEX_END = 19;
306 BlendFactor::Type BLENDING_FACTORS[ BLENDING_FACTOR_COUNT ] =
310 BlendFactor::SRC_COLOR,
311 BlendFactor::ONE_MINUS_SRC_COLOR,
312 BlendFactor::SRC_ALPHA,
313 BlendFactor::ONE_MINUS_SRC_ALPHA,
314 BlendFactor::DST_ALPHA,
315 BlendFactor::ONE_MINUS_DST_ALPHA,
316 BlendFactor::DST_COLOR,
317 BlendFactor::ONE_MINUS_DST_COLOR,
318 BlendFactor::SRC_ALPHA_SATURATE,
319 BlendFactor::CONSTANT_COLOR,
320 BlendFactor::ONE_MINUS_CONSTANT_COLOR,
321 BlendFactor::CONSTANT_ALPHA,
322 BlendFactor::ONE_MINUS_CONSTANT_ALPHA
325 DevelBlendEquation::Type BLENDING_EQUATIONS[ BLENDING_EQUATION_COUNT ] =
327 DevelBlendEquation::ADD,
328 DevelBlendEquation::SUBTRACT,
329 DevelBlendEquation::REVERSE_SUBTRACT,
330 DevelBlendEquation::MIN,
331 DevelBlendEquation::MAX,
332 DevelBlendEquation::MULTIPLY,
333 DevelBlendEquation::SCREEN,
334 DevelBlendEquation::OVERLAY,
335 DevelBlendEquation::DARKEN,
336 DevelBlendEquation::LIGHTEN,
337 DevelBlendEquation::COLOR_DODGE,
338 DevelBlendEquation::COLOR_BURN,
339 DevelBlendEquation::HARD_LIGHT,
340 DevelBlendEquation::SOFT_LIGHT,
341 DevelBlendEquation::DIFFERENCE,
342 DevelBlendEquation::EXCLUSION,
343 DevelBlendEquation::HUE,
344 DevelBlendEquation::SATURATION,
345 DevelBlendEquation::COLOR,
346 DevelBlendEquation::LUMINOSITY
350 * Utility to retrieve one of the BlendFunc values.
351 * @param[in] options A bitmask of blending values.
352 * @param[in] mask The used to mask unwanted values.
353 * @param[in] bitshift Used to shift to the correct part of options.
354 * @return The blending factor.
356 BlendFactor::Type RetrieveBlendFactor( unsigned int options, int mask, int bitShift )
358 unsigned int index = options & mask;
359 index = index >> bitShift;
361 DALI_ASSERT_DEBUG( index < BLENDING_FACTOR_COUNT );
363 return BLENDING_FACTORS[ index ];
367 * Utility to retrieve one of the BlendEquation values.
368 * @param[in] options A bitmask of blending values.
369 * @param[in] mask The used to mask unwanted values.
370 * @param[in] bitshift Used to shift to the correct part of options.
371 * @return The blending equation.
373 DevelBlendEquation::Type RetrieveBlendEquation( unsigned int options, int mask, int bitShift )
375 unsigned int index = options & mask;
376 index = index >> bitShift;
378 DALI_ASSERT_DEBUG( index < BLENDING_EQUATION_COUNT );
380 return BLENDING_EQUATIONS[ index ];
383 } // unnamed namespace
391 BlendingOptions::BlendingOptions()
393 mBlendColor( nullptr )
395 SetBlendFunc( BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA,
396 BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA );
398 SetBlendEquation( DevelBlendEquation::ADD, DevelBlendEquation::ADD );
401 BlendingOptions::~BlendingOptions() = default;
403 void BlendingOptions::SetBitmask( unsigned int bitmask )
408 unsigned int BlendingOptions::GetBitmask() const
413 void BlendingOptions::SetBlendFunc( BlendFactor::Type srcFactorRgb, BlendFactor::Type destFactorRgb,
414 BlendFactor::Type srcFactorAlpha, BlendFactor::Type destFactorAlpha )
416 mBitmask &= CLEAR_BLEND_FUNC_MASK; // Clear the BlendFunc values
418 StoreBlendFactor( mBitmask, srcFactorRgb, SHIFT_TO_SRC_FACTOR_RGB );
419 StoreBlendFactor( mBitmask, destFactorRgb, SHIFT_TO_DEST_FACTOR_RGB );
420 StoreBlendFactor( mBitmask, srcFactorAlpha, SHIFT_TO_SRC_FACTOR_ALPHA );
421 StoreBlendFactor( mBitmask, destFactorAlpha, SHIFT_TO_DEST_FACTOR_ALPHA );
424 BlendFactor::Type BlendingOptions::GetBlendSrcFactorRgb() const
426 return RetrieveBlendFactor( mBitmask, MASK_SRC_FACTOR_RGB, SHIFT_TO_SRC_FACTOR_RGB );
429 BlendFactor::Type BlendingOptions::GetBlendDestFactorRgb() const
431 return RetrieveBlendFactor( mBitmask, MASK_DEST_FACTOR_RGB, SHIFT_TO_DEST_FACTOR_RGB );
434 BlendFactor::Type BlendingOptions::GetBlendSrcFactorAlpha() const
436 return RetrieveBlendFactor( mBitmask, MASK_SRC_FACTOR_ALPHA, SHIFT_TO_SRC_FACTOR_ALPHA );
439 BlendFactor::Type BlendingOptions::GetBlendDestFactorAlpha() const
441 return RetrieveBlendFactor( mBitmask, MASK_DEST_FACTOR_ALPHA, SHIFT_TO_DEST_FACTOR_ALPHA );
444 void BlendingOptions::SetBlendEquation( DevelBlendEquation::Type equationRgb, DevelBlendEquation::Type equationAlpha )
446 mBitmask &= CLEAR_BLEND_EQUATION_MASK; // Clear the BlendEquation values
448 StoreBlendEquation( mBitmask, equationRgb, SHIFT_TO_EQUATION_RGB );
449 StoreBlendEquation( mBitmask, equationAlpha, SHIFT_TO_EQUATION_ALPHA );
452 DevelBlendEquation::Type BlendingOptions::GetBlendEquationRgb() const
454 return RetrieveBlendEquation( mBitmask, MASK_EQUATION_RGB, SHIFT_TO_EQUATION_RGB );
457 DevelBlendEquation::Type BlendingOptions::GetBlendEquationAlpha() const
459 return RetrieveBlendEquation( mBitmask, MASK_EQUATION_ALPHA, SHIFT_TO_EQUATION_ALPHA );
462 void BlendingOptions::SetBlendColor( const Vector4& color )
464 if( Color::TRANSPARENT == color )
466 mBlendColor = nullptr;
472 *mBlendColor = color;
476 // Lazy allocation when non-default is set
477 mBlendColor = new Vector4( color );
482 const Vector4* BlendingOptions::GetBlendColor() const
484 return mBlendColor.Get();
487 bool BlendingOptions::IsAdvancedBlendEquationApplied()
489 unsigned int indexRgb = mBitmask & MASK_EQUATION_RGB;
490 indexRgb = indexRgb >> SHIFT_TO_EQUATION_RGB;
491 unsigned int indexA = mBitmask & MASK_EQUATION_ALPHA;
492 indexA = indexA >> SHIFT_TO_EQUATION_ALPHA;
494 return ( ( ( indexRgb >= BLENDING_EQUATION_ADVANCED_INDEX_START ) && ( indexRgb <= BLENDING_EQUATION_ADVANCED_INDEX_END ) ) ||
495 ( ( indexA >= BLENDING_EQUATION_ADVANCED_INDEX_START ) && ( indexA <= BLENDING_EQUATION_ADVANCED_INDEX_END ) ) );
498 bool BlendingOptions::IsAdvancedBlendEquationIncluded( unsigned int bitmask )
500 unsigned int indexRgb = bitmask & MASK_EQUATION_RGB;
501 indexRgb = indexRgb >> SHIFT_TO_EQUATION_RGB;
502 unsigned int indexA = bitmask & MASK_EQUATION_ALPHA;
503 indexA = indexA >> SHIFT_TO_EQUATION_ALPHA;
505 return ( ( ( indexRgb >= BLENDING_EQUATION_ADVANCED_INDEX_START ) && ( indexRgb <= BLENDING_EQUATION_ADVANCED_INDEX_END ) ) ||
506 ( ( indexA >= BLENDING_EQUATION_ADVANCED_INDEX_START ) && ( indexA <= BLENDING_EQUATION_ADVANCED_INDEX_END ) ) );
509 bool BlendingOptions::IsAdvancedBlendEquation( DevelBlendEquation::Type equation )
513 case DevelBlendEquation::MULTIPLY:
514 case DevelBlendEquation::SCREEN:
515 case DevelBlendEquation::OVERLAY:
516 case DevelBlendEquation::DARKEN:
517 case DevelBlendEquation::LIGHTEN:
518 case DevelBlendEquation::COLOR_DODGE:
519 case DevelBlendEquation::COLOR_BURN:
520 case DevelBlendEquation::HARD_LIGHT:
521 case DevelBlendEquation::SOFT_LIGHT:
522 case DevelBlendEquation::DIFFERENCE:
523 case DevelBlendEquation::EXCLUSION:
524 case DevelBlendEquation::HUE:
525 case DevelBlendEquation::SATURATION:
526 case DevelBlendEquation::COLOR:
527 case DevelBlendEquation::LUMINOSITY:
539 } // namespace Internal