1 #ifndef DALI_INTERNAL_SCENE_GRAPH_DOUBLE_BUFFERED_H
2 #define DALI_INTERNAL_SCENE_GRAPH_DOUBLE_BUFFERED_H
5 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/internal/common/owner-pointer.h>
30 // The number of buffers per scene-graph property
31 static const unsigned int NUM_SCENE_GRAPH_BUFFERS = 2;
33 // Buffer index used when reading off-stage values
34 static const unsigned int ARBITRARY_OFF_STAGE_BUFFER = 0;
40 * Templated class for a double-buffered value.
53 DoubleBuffered(const T& val)
59 inline T& operator[](const BufferIndex i)
61 DALI_ASSERT_DEBUG(i < NUM_SCENE_GRAPH_BUFFERS);
66 inline const T& operator[](const BufferIndex i) const
68 DALI_ASSERT_DEBUG(i < NUM_SCENE_GRAPH_BUFFERS);
76 DoubleBuffered<T>(const DoubleBuffered<T>&);
79 DoubleBuffered<T>& operator=(const DoubleBuffered<T>& rhs);
88 * @brief Specialization for owner-pointer
90 * This class takes ownership of the pointers and releases the memory when the pointer
91 * is no longer used by either buffer
94 class DoubleBuffered< OwnerPointer< T > >
99 * Class that deals with setting a value
105 * @brief Assignment operator to that a value that will later
106 * be set in the correct buffer index of the object referenced by the setter.
108 Setter& operator=( T* value )
116 mObject.Set( mIndex, mValue );
120 Setter( DoubleBuffered& object,
129 Setter( const Setter& rhs )
130 : mObject( rhs.mObject ),
131 mIndex( rhs.mIndex ),
136 DoubleBuffered& mObject; ///< Double-buffered object that will be changed
137 const BufferIndex mIndex; ///< Buffer index that will be changed
138 T* mValue; ///< Value of the pointer
140 friend class DoubleBuffered;
149 DoubleBuffered(T* val)
157 if( mValue2 != mValue1 )
164 void Set( BufferIndex i, T* value )
166 T*& current = *(&mValue1 + i);
167 T*& previous = *(&mValue1 + 1u-i);
169 if( current != value && current != previous )
176 Setter operator[]( BufferIndex i )
178 return Setter( *this, i, *(&mValue1+i) );
181 const T* operator[]( BufferIndex i ) const
183 DALI_ASSERT_DEBUG(i < NUM_SCENE_GRAPH_BUFFERS);
185 return *(&mValue1+i);
189 * Auto-age the property: if it was set the previous frame,
190 * then copy the value into the current frame's buffer.
192 void CopyPrevious( BufferIndex i )
194 DALI_ASSERT_DEBUG(i < NUM_SCENE_GRAPH_BUFFERS);
196 T*& current = *(&mValue1 + i);
197 T*& previous = *(&mValue1 + 1u-i);
199 if( current != previous )
210 DoubleBuffered(const DoubleBuffered&);
213 DoubleBuffered& operator=(const DoubleBuffered& rhs);
223 } // namespace SceneGraph
225 } // namespace Internal
229 #endif // DALI_INTERNAL_SCENE_GRAPH_DOUBLE_BUFFERED_H