FastUIDraw
colorstop.hpp
Go to the documentation of this file.
1 /*!
2  * \file colorstop.hpp
3  * \brief file colorstop.hpp
4  *
5  * Copyright 2016 by Intel.
6  *
7  * Contact: kevin.rogovin@gmail.com
8  *
9  * This Source Code Form is subject to the
10  * terms of the Mozilla Public License, v. 2.0.
11  * If a copy of the MPL was not distributed with
12  * this file, You can obtain one at
13  * http://mozilla.org/MPL/2.0/.
14  *
15  * \author Kevin Rogovin <kevin.rogovin@gmail.com>
16  *
17  */
18 
19 
20 #ifndef FASTUIDRAW_COLORSTOP_HPP
21 #define FASTUIDRAW_COLORSTOP_HPP
22 
23 #include <fastuidraw/util/util.hpp>
24 #include <fastuidraw/util/vecN.hpp>
27 
28 namespace fastuidraw
29 {
30 ///@cond
31 class ColorStopAtlas;
32 ///@endcond
33 
34 /*!\addtogroup Imaging
35  * @{
36  */
37 
38  /*!
39  * \brief
40  * A ColorStop is a pair consisting of an RGBA value and a place. The
41  * value of the place is a floating point value in the range [0, 1].
42  */
43  class ColorStop
44  {
45  public:
46  /*!
47  * Default ctor. Initializes m_color as (0, 0, 0, 0)
48  * and m_place as 0.0f.
49  */
50  ColorStop(void):
51  m_color(0, 0, 0, 0),
52  m_place(0.0f)
53  {}
54 
55  /*!
56  * Ctor
57  * \param c value with which to initialize m_color
58  * \param p value with which to initialize m_place
59  */
60  ColorStop(u8vec4 c, float p):
61  m_color(c),
62  m_place(p)
63  {}
64 
65  /*!
66  * Comparison operator to sort ColorStop values by m_place.
67  * \param rhs value to which to compare
68  */
69  bool
70  operator<(const ColorStop &rhs) const
71  {
72  return m_place < rhs.m_place;
73  }
74 
75  /*!
76  * The RGBA value of the color of the ColorStop.
77  */
79 
80  /*!
81  * The place of the ColorStop.
82  */
83  float m_place;
84  };
85 
86  /*!
87  * \brief
88  * A ColorStopArray is a sequence of ColorStop values used to
89  * define the color stops of a gradient.
90  *
91  * The values are sorted by ColorStop::m_place and each ColorStop
92  * value of a ColorStopArray must have a unique value for
93  * ColorStop::m_place. A color is computed (in drawing) from a
94  * ColorStopArray at a point q as follows. First the color stops
95  * S and T are found so that q is in the range [S.m_place, T.m_place].
96  * The color value is then given by the value
97  * (1-t) * S.m_color + t * S.m_color where t is given by
98  * (q-S.m_place) / (T.m_place - S.m_place).
99  */
101  {
102  public:
103  /*!
104  * Ctor, inits ColorStopArray as empty
105  */
106  ColorStopArray(void);
107 
108  /*!
109  * Ctor, inits ColorStopArray as empty
110  * but pre-reserves memory for color stops
111  * added via add().
112  * \param reserve number of slots to reserve in memory
113  */
114  explicit
115  ColorStopArray(int reserve);
116 
117  ~ColorStopArray();
118 
119  /*!
120  * Add a ColorStop to this ColorStopArray
121  * \param c value to add
122  */
123  void
124  add(const ColorStop &c);
125 
126  /*!
127  * Add a sequence of stops.
128  * \tparam iterator type to ColorStop
129  * \param begin iterator to 1st stop to add
130  * \param end iterator to one past the last stop to add
131  */
132  template<typename iterator>
133  void
134  add(iterator begin, iterator end)
135  {
136  for(; begin != end; ++begin)
137  {
138  add(*begin);
139  }
140  }
141 
142  /*!
143  * Clear all stops from this ColorStopArray.
144  */
145  void
146  clear(void);
147 
148  /*!
149  * Returns the values added by add() sorted by ColorStop::m_place.
150  * Sorting is done lazily, i.e. on calling values().
151  */
153  values(void) const;
154 
155  private:
156  void *m_d;
157  };
158 
159  /*!
160  * \brief
161  * A ColorStopSequence is a \ref ColorStopArray on a \ref ColorStopAtlas.
162  * A \ref ColorStopAtlas is backed by a 1D texture array with linear filtering.
163  * The values of ColorStop::m_place are discretized. Values in between the
164  * \ref ColorStop 's of a \ref ColorStopArray are interpolated.
165  */
167  {
168  public:
170 
171  /*!
172  * Returns the location in the backing store to
173  * the logical start of the ColorStopSequence.
174  * A ColorStopSequence is added to an atlas
175  * so that the first and last texel are repeated, thus
176  * allowing for implementation to use linear texture
177  * filtering to implement color interpolation quickly
178  * in a shader.
179  */
180  ivec2
181  texel_location(void) const;
182 
183  /*!
184  * Returns the number of texels NOT including repeating the
185  * boundary texels used in the backing store.
186  */
187  int
188  width(void) const;
189 
190  /*!
191  * Returns the atlas on which the object resides
192  */
194  atlas(void) const;
195 
196  private:
197  friend class ColorStopAtlas;
198 
199  ColorStopSequence(const ColorStopArray &color_stops,
200  ColorStopAtlas& atlas, unsigned int pwidth);
201  void *m_d;
202  };
203 
204 /*! @} */
205 }
206 
207 #endif
ColorStop(u8vec4 c, float p)
Definition: colorstop.hpp:60
all classes and functions of FastUIDraw are in the namespace fastuidraw.
Definition: colorstop.hpp:28
A ColorStop is a pair consisting of an RGBA value and a place. The value of the place is a floating p...
Definition: colorstop.hpp:43
A ColorStopArray is a sequence of ColorStop values used to define the color stops of a gradient...
Definition: colorstop.hpp:100
file c_array.hpp
A ColorStopAtlas is a common location to all color stop data of an application. Ideally, all color stop sequences are placed into a single ColorStopAtlas (changes of ColorStopAtlas force draw-call breaks).
file util.hpp
A c_array is a wrapper over a C pointer with a size parameter to facilitate bounds checking and provi...
Definition: c_array.hpp:43
file vecN.hpp
A common base class to use for resources that need to be saved opaquely.
A ColorStopSequence is a ColorStopArray on a ColorStopAtlas. A ColorStopAtlas is backed by a 1D textu...
Definition: colorstop.hpp:166
Class for which copy ctor and assignment operator are private functions.
Definition: util.hpp:505
bool operator<(const ColorStop &rhs) const
Definition: colorstop.hpp:70
void add(iterator begin, iterator end)
Definition: colorstop.hpp:134
file reference_counted.hpp