Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / effects / renderer / graphics-engine / FUiEffects_RendererGraphicsEngineRenderStateCache.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FUiEffects_RendererGraphicsEngineRenderStateCache.cpp
20  * @brief               Implementation of class for render states cache
21  *
22  */
23
24 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineOpenGLImplementation.h>
25 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderStateCache.h>
26 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRender.h>
27
28 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace GraphicsEngine
29 {
30
31 GLenum
32 RenderAlphaBlendCache::GetGlBlendFactor(Tizen::Ui::Effects::_Renderer::EngineModel::AlphaBlendProperty::BlendFactor::Value value)
33 {
34         switch (value)
35         {
36         case EngineModel::AlphaBlendProperty::BlendFactor::ZERO:
37                 return GL_ZERO;
38         case EngineModel::AlphaBlendProperty::BlendFactor::ONE:
39                 return GL_ONE;
40         case EngineModel::AlphaBlendProperty::BlendFactor::SRC_COLOR:
41                 return GL_SRC_COLOR;
42         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_SRC_COLOR:
43                 return GL_ONE_MINUS_SRC_COLOR;
44         case EngineModel::AlphaBlendProperty::BlendFactor::DST_COLOR:
45                 return GL_DST_COLOR;
46         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_DST_COLOR:
47                 return GL_ONE_MINUS_DST_COLOR;
48         case EngineModel::AlphaBlendProperty::BlendFactor::SRC_ALPHA:
49                 return GL_SRC_ALPHA;
50         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_SRC_ALPHA:
51                 return GL_ONE_MINUS_SRC_ALPHA;
52         case EngineModel::AlphaBlendProperty::BlendFactor::DST_ALPHA:
53                 return GL_DST_ALPHA;
54         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_DST_ALPHA:
55                 return GL_ONE_MINUS_DST_ALPHA;
56         case EngineModel::AlphaBlendProperty::BlendFactor::CONSTANT_COLOR:
57                 return GL_CONSTANT_COLOR;
58         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_CONSTANT_COLOR:
59                 return GL_ONE_MINUS_CONSTANT_COLOR;
60         case EngineModel::AlphaBlendProperty::BlendFactor::CONSTANT_ALPHA:
61                 return GL_CONSTANT_ALPHA;
62         case EngineModel::AlphaBlendProperty::BlendFactor::ONE_MINUS_CONSTANT_ALPHA:
63                 return GL_ONE_MINUS_CONSTANT_ALPHA;
64         case EngineModel::AlphaBlendProperty::BlendFactor::SRC_ALPHA_SATURATE:
65                 return GL_SRC_ALPHA_SATURATE;
66         }
67         ThrowJmp("RenderAlphaBlendCache::getGLBlendFactor: unknown blend factor");
68 }
69
70 RenderAlphaBlendCache::RenderAlphaBlendCache(Render* pRender, EngineModel::AlphaBlendProperty* pState)
71         : RenderStateCache(pRender)
72         , __pState(pState)
73         , __source(static_cast<GLenum>(0))
74         , __destination(static_cast<GLenum>(0))
75         , __isEnabled(false)
76 {
77 }
78
79 RenderAlphaBlendCache::~RenderAlphaBlendCache(void)
80 {
81 }
82
83 void
84 RenderAlphaBlendCache::Validate(Render* pRender)
85 {
86         if (!_invalid)
87         {
88                 return;
89         }
90         if (!__pState)
91         {
92                 return;
93         }
94         if (!(__isEnabled = __pState->IsEnable()))
95         {
96                 return;
97         }
98         __source = GetGlBlendFactor(__pState->GetSourceFactor());
99         __destination = GetGlBlendFactor(__pState->GetDestinationFactor());
100         _invalid = false;
101         return;
102 }
103
104 void
105 RenderAlphaBlendCache::Set(Render* pRender)
106 {
107         if (_invalid)
108         {
109                 Validate(pRender);
110                 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
111         }
112
113         if (!__pState->IsEnable())
114         {
115                 return;
116         }
117
118         if (pRender->GetAlphaBlendSource() != __source || pRender->GetAlphaBlendDestination() != __destination)
119         {
120                 glBlendFunc(__source, __destination);
121         }
122
123         return;
124 }
125
126 bool
127 RenderAlphaBlendCache::IsEnable(Render* pRender)
128 {
129         if (_invalid)
130         {
131                 Validate(pRender);
132         }
133         return __isEnabled;
134 }
135
136 }}}}} // Tizen::Ui::Effects::_Renderer::GraphicsEngine