draw  0.0.0
draw.h
Go to the documentation of this file.
1 /*------------------------------------------------------------------------
2  draw: C++11 cross-platform GPU-accelerated pixel-space 2D drawing library
3  Original location: https://github.com/vsergey3d/draw
4  Distributed under the Simplified BSD License:
5  https://github.com/vsergey3d/draw/blob/master/LICENSE
6 ------------------------------------------------------------------------*/
7 #pragma once
8 #include <stdint.h>
9 #include <memory>
10 
11 #ifndef ASSERT
12 #include <cassert>
13 #define ASSERT(e) assert(e)
14 #endif
15 
16 #define DRAW_NO_EXCEPTIONS
17 #ifndef DRAW_NO_EXCEPTIONS
18 #include <exception>
19 #endif
20 
21 #ifndef SHARED_PTR
22 #define SHARED_PTR std::shared_ptr
23 #define MAKE_SHARED_PTR std::make_shared
24 #endif
25 
26 namespace draw {
27 
29 enum ErrorCode {
30 
31  NoError = 0,
37 };
38 
39 #ifndef DRAW_NO_EXCEPTIONS
40 
42 class Error : public std::exception {
43 
44 public:
45  virtual ~Error() = default;
46 
48  virtual ErrorCode code() const = 0;
49 };
50 
51 #else
54 #endif
55 
57 struct Point {
58 
59  int32_t x {0};
60  int32_t y {0};
61 
63  Point() = default;
64 
66  Point(int32_t x, int32_t y) :
67  x(x), y(y) {};
68 };
69 
71 bool operator == (const Point& left, const Point& right);
72 
74 bool operator != (const Point& left, const Point& right);
75 
77 struct Size {
78 
79  uint32_t width {1};
80  uint32_t height {1};
81 
83  Size() = default;
85  Size(uint32_t width, uint32_t height) :
86  width(width), height(height) {};
87 };
88 
90 bool operator == (const Size& left, const Size& right);
91 
93 bool operator != (const Size& left, const Size& right);
94 
96 struct Rect {
97 
98  int32_t left {0};
99  int32_t bottom {0};
100  int32_t right {0};
101  int32_t top {0};
102 
104  Rect() = default;
106  Rect(int32_t left, int32_t bottom, int32_t right, int32_t top) :
107  left(left), bottom(bottom), right(right), top(top) {};
108 };
109 
111 bool operator == (const Rect& left, const Rect& right);
112 
114 bool operator != (const Rect& left, const Rect& right);
115 
117 struct Vector2 {
118 
119  float x {0.0f};
120  float y {0.0f};
121 
123  Vector2() = default;
125  Vector2(float x, float y) :
126  x(x), y(y) {};
127 };
128 
130 struct Color {
131 
133  float r {0.0f};
135  float g {0.0f};
137  float b {0.0f};
139  float a {1.0f};
140 
142  Color() = default;
144  Color(float r, float g, float b, float a = 1.0f) :
145  r(r), g(g), b(b), a(a) {};
146 };
147 
149 template <typename T>
150 struct Span {
151 
153  const T* ptr;
155  uint32_t count;
156 
158  Span(const T* ptr, uint32_t count) :
159  ptr(ptr), count(count) {}
160 };
161 
163 
168 class Geometry {
169 
170 public:
172  static const uint32_t kMaxVertexCount = 65535;//std::numeric_limits<Index>::max();
174  struct Vertex {
180  Vertex() = default;
182  Vertex(const Vector2& position, const Vector2& uv) :
183  position(position), uv(uv) {};
184  };
188  using Index = uint16_t;
192  enum class Primitive {
193 
194  Point = 1,
195  Line,
196  Triangle
197  };
198  virtual ~Geometry() = default;
200  virtual uint32_t vertexCount() const = 0;
202  virtual uint32_t indexCount() const = 0;
204  virtual Primitive primitive() const = 0;
205 };
206 
207 using GeometryPtr = SHARED_PTR<Geometry>;
208 
210 
211 #ifdef DRAW_NO_EXCEPTIONS
212 
216 #endif
217 class Image {
218 
219 public:
221  static const uint32_t kMaxSize = 4096;
225  enum class Format {
226 
227  A,
228  RGB,
229  RGBA
230  };
231  virtual ~Image() = default;
232 
234  virtual const Size& size() const = 0;
236  virtual Format format() const = 0;
238  virtual bool filter() const = 0;
240 
244  virtual void upload(Bytes bytes) = 0;
245 };
246 
247 using ImagePtr = SHARED_PTR<Image>;
248 
250 class Visual {
251 
252 public:
253  virtual ~Visual() = default;
255  virtual void visibility(bool enable) = 0;
257  virtual bool visibility() const = 0;
259  virtual void order(uint32_t order) = 0;
261  virtual uint32_t order() const = 0;
263  virtual void position(const Point& position) = 0;
265  virtual const Point& position() const = 0;
267  virtual const Rect& bounds() const = 0;
268 };
269 
270 using VisualPtr = SHARED_PTR<Visual>;
271 
273 
274 class Shape : public Visual {
275 
276 public:
277  virtual ~Shape() = default;
279  virtual void size(const Size& size) = 0;
281  virtual const Size& size() const = 0;
283  virtual void color(const Color& color) = 0;
285  virtual const Color& color() const = 0;
287  virtual void transparency(bool value) = 0;
289  virtual bool transparency() const = 0;
291  virtual void geometry(const GeometryPtr& geometry) = 0;
293  virtual GeometryPtr geometry() const = 0;
295  virtual void image(const ImagePtr& image) = 0;
297  virtual void image(const ImagePtr& image, const Vector2& tile) = 0;
299  virtual ImagePtr image() const = 0;
301  virtual void image(const ImagePtr& atlas, const Rect& element) = 0;
303  virtual ImagePtr image(Rect& element) const = 0;
304 };
305 
306 using ShapePtr = SHARED_PTR<Shape>;
307 
309 
310 class Font {
311 
312 public:
314  static const uint32_t kMinLetterSize = 5;
315 
316  virtual ~Font() = default;
318  virtual const char* filePath() const = 0;
320  virtual uint32_t letterSize() const = 0;
321 };
322 
323 using FontPtr = SHARED_PTR<Font>;
324 
326 
327 class Text : public Visual {
328 
329 public:
330  virtual ~Text() = default;
332  virtual void font(const FontPtr& font) = 0;
334  virtual FontPtr font() const = 0;
336  virtual void text(const wchar_t* text) = 0;
338  virtual const wchar_t* text() const = 0;
340  virtual void color(const Color& color) = 0;
342  virtual const Color& color() const = 0;
344  enum class HorizAlign {
345 
346  Left,
347  Center,
348  Right
349  };
351  virtual void horizAlign(HorizAlign alignment) = 0;
353  virtual HorizAlign horizAlign() const = 0;
355  enum class VertAlign {
356 
357  Top,
358  Middle,
359  Bottom
360  };
362  virtual void vertAlign(VertAlign alignment) = 0;
364  virtual VertAlign vertAlign() const = 0;
365 };
366 
367 using TextPtr = SHARED_PTR<Text>;
368 
370 
371 #ifdef DRAW_NO_EXCEPTIONS
372 
376 #endif
377 class Renderer {
378 
379 public:
381 
382  virtual ~Renderer() = default;
384 
391  virtual GeometryPtr makeGeometry(Geometry::Vertices vertices,
392  Geometry::Indices indices, Geometry::Primitive primitive) = 0;
394 
402  virtual ImagePtr makeImage(const Size& size, Image::Format format, bool filter) = 0;
404 
411  virtual FontPtr makeFont(const char* filePath, uint32_t letterSize) = 0;
413 
416  virtual ShapePtr makeRect() = 0;
418 
421  virtual ShapePtr makeShape() = 0;
423 
426  virtual TextPtr makeText() = 0;
428 
431  virtual uint32_t draw(const Color& clear) = 0;
433  virtual void resize(const Size& size) = 0;
434 };
435 
436 using RendererPtr = SHARED_PTR<Renderer>;
437 
439 
444 class Context {
445 
446 public:
447  virtual ~Context() = default;
449  virtual void setCurrent() = 0;
450 };
451 
452 using ContextPtr = std::unique_ptr<Context>;
453 
455 #ifdef DRAW_NO_EXCEPTIONS
456 
460 #endif
461 
469 
470 } // namespace draw
A visual shape.
Definition: draw.h:274
Vector2 position
2D-position in [0.0, 1.0] space
Definition: draw.h:176
Vector2 uv
UV-coordinates in [0.0, 1.0] space.
Definition: draw.h:178
A text object.
Definition: draw.h:327
A rect in pixel space.
Definition: draw.h:96
Point(int32_t x, int32_t y)
constructs from parameters
Definition: draw.h:66
RendererPtr makeRenderer(ContextPtr context)
make Renderer object
A point in pixel space.
Definition: draw.h:57
SHARED_PTR< Renderer > RendererPtr
Definition: draw.h:436
Factory and context owner.
Definition: draw.h:377
HorizAlign
Horizontal alignment.
Definition: draw.h:344
Floating-point 2D-vector.
Definition: draw.h:117
Set of characters of the same style and size.
Definition: draw.h:310
uint16_t Index
An index of a vertex.
Definition: draw.h:188
2D-vertex.
Definition: draw.h:174
ErrorCode
An error code which library can generate.
Definition: draw.h:29
const T * ptr
pointer to the first element
Definition: draw.h:153
Color(float r, float g, float b, float a=1.0f)
construct from parameters
Definition: draw.h:144
RGBA floating-point color.
Definition: draw.h:130
Base interface class of any visual object.
Definition: draw.h:250
VertAlign
Vertical alignment.
Definition: draw.h:355
Definition: draw.h:36
SHARED_PTR< Visual > VisualPtr
Definition: draw.h:270
Vector2(float x, float y)
construct from parameters
Definition: draw.h:125
SHARED_PTR< Font > FontPtr
Definition: draw.h:323
ErrorCode getLastError()
return last error and set the value to draw::NoError
bool operator==(const Point &left, const Point &right)
checks if two points are equal
Definition: draw.h:34
Set of indexed 2D-primitives.
Definition: draw.h:168
Definition: draw.h:35
Contiguous sequence of elements.
Definition: draw.h:150
Format
A pixel format.
Definition: draw.h:225
std::unique_ptr< Context > ContextPtr
Definition: draw.h:452
A size in pixel space.
Definition: draw.h:77
Definition: draw.h:31
Span(const T *ptr, uint32_t count)
constructs from parameters
Definition: draw.h:158
Primitive
A type of primitive.
Definition: draw.h:192
SHARED_PTR< Text > TextPtr
Definition: draw.h:367
Vertex(const Vector2 &position, const Vector2 &uv)
constructs from parameters
Definition: draw.h:182
SHARED_PTR< Image > ImagePtr
Definition: draw.h:247
Size(uint32_t width, uint32_t height)
Constructs from parameters.
Definition: draw.h:85
SHARED_PTR< Shape > ShapePtr
Definition: draw.h:306
Rect(int32_t left, int32_t bottom, int32_t right, int32_t top)
constructs from parameters
Definition: draw.h:106
SHARED_PTR< Geometry > GeometryPtr
Definition: draw.h:207
2D-array of pixels specified format.
Definition: draw.h:217
Definition: draw.h:32
OpenGL rendering context base interface class.
Definition: draw.h:444
Definition: draw.h:26
bool operator!=(const Point &left, const Point &right)
checks if two points are not equal
Definition: draw.h:33
uint32_t count
elements count
Definition: draw.h:155