Merge remote-tracking branch 'origin/tizen' into devel/new_mesh
[platform/core/uifw/dali-core.git] / dali / internal / common / image-sampler.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/common/image-sampler.h>
20
21 // EXTERNAL INCLUDES
22 #include <iosfwd>
23
24 namespace Dali
25 {
26
27 namespace Internal
28 {
29
30 namespace ImageSampler
31 {
32
33 namespace
34 {
35
36 // @todo MESH_REWORK Remove file after image removal
37
38 // Adjust these shift sizes if the FilterMode enum grows
39 const int MINIFY_BIT_SHIFT  = 0;    // Room for 16
40 const int MAGNIFY_BIT_SHIFT = 4;
41
42 const int MASK_MINIFY_FILTER    = 0x0000000F;
43 const int MASK_MAGNIFY_FILTER   = 0x000000F0;
44
45 const unsigned int FILTER_MODE_COUNT = 4;
46
47 FilterMode::Type FILTER_MODE_OPTIONS[ FILTER_MODE_COUNT ] =
48   { FilterMode::NONE,
49     FilterMode::DEFAULT,
50     FilterMode::NEAREST,
51     FilterMode::LINEAR };
52
53 } // namespace
54
55 /**
56  * Utility to store one of the FilterMode values.
57  * @param[out] options A bitmask used to store the FilterMode values.
58  * @param[in] factor The FilterMode value.
59  * @param[in] bitshift Used to shift to the correct part of options.
60  */
61 void StoreFilterMode( unsigned int& options, FilterMode::Type mode, int bitShift )
62 {
63   // Start shifting from 1 as 0 is the unassigned state
64   switch ( mode )
65   {
66     case FilterMode::NONE:
67     {
68       // Nothing to do
69       break;
70     }
71     case FilterMode::DEFAULT:
72     {
73       options |= ( 1u << bitShift );
74       break;
75     }
76     case FilterMode::NEAREST:
77     {
78       options |= ( 2u << bitShift );
79       break;
80     }
81     case FilterMode::LINEAR:
82     {
83       options |= ( 3u << bitShift );
84       break;
85     }
86   }
87 }
88
89 /**
90  * Utility to retrieve one of the FilterMode values.
91  * @param[in] options A bitmask of filter values.
92  * @param[in] mask The used to mask unwanted values.
93  * @param[in] bitshift Used to shift to the correct part of options.
94  * @return Return the filter mode.
95  */
96 FilterMode::Type RetrieveFilterMode( unsigned int options, int mask, int bitShift )
97 {
98   unsigned int index = options & mask;
99
100   index = ( index >> bitShift );    // Zero based index for array
101
102   DALI_ASSERT_DEBUG( index < FILTER_MODE_COUNT );
103
104   return FILTER_MODE_OPTIONS[ index ];
105 }
106
107 unsigned int PackBitfield( FilterMode::Type minify, FilterMode::Type magnify )
108 {
109   unsigned int bitfield = 0;
110   StoreFilterMode( bitfield, minify, MINIFY_BIT_SHIFT );
111   StoreFilterMode( bitfield, magnify, MAGNIFY_BIT_SHIFT );
112   return bitfield;
113 }
114
115 FilterMode::Type GetMinifyFilterMode( unsigned int bitfield )
116 {
117   return RetrieveFilterMode( bitfield, MASK_MINIFY_FILTER, MINIFY_BIT_SHIFT );
118 }
119
120 FilterMode::Type GetMagnifyFilterMode( unsigned int bitfield )
121 {
122   return RetrieveFilterMode( bitfield, MASK_MAGNIFY_FILTER, MAGNIFY_BIT_SHIFT );
123 }
124
125 } // namespace ImageSampler
126
127 } // namespace Internal
128
129 } // namespace Dali