Mercurial > hg > pub > prymula > com
comparison DPF-Prymula-audioplugins/dpf/dgl/NanoVG.hpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:cf2cb71d31dd | 3:84e66ea83026 |
---|---|
1 /* | |
2 * DISTRHO Plugin Framework (DPF) | |
3 * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |
4 * | |
5 * Permission to use, copy, modify, and/or distribute this software for any purpose with | |
6 * or without fee is hereby granted, provided that the above copyright notice and this | |
7 * permission notice appear in all copies. | |
8 * | |
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |
10 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |
11 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |
12 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |
13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
15 */ | |
16 | |
17 #ifndef DGL_NANO_WIDGET_HPP_INCLUDED | |
18 #define DGL_NANO_WIDGET_HPP_INCLUDED | |
19 | |
20 #include "Color.hpp" | |
21 #include "OpenGL.hpp" | |
22 #include "SubWidget.hpp" | |
23 #include "TopLevelWidget.hpp" | |
24 #include "StandaloneWindow.hpp" | |
25 | |
26 #ifdef _MSC_VER | |
27 # pragma warning(push) | |
28 # pragma warning(disable:4661) /* instantiated template classes whose methods are defined elsewhere */ | |
29 #endif | |
30 | |
31 #ifndef DGL_NO_SHARED_RESOURCES | |
32 # define NANOVG_DEJAVU_SANS_TTF "__dpf_dejavusans_ttf__" | |
33 #endif | |
34 | |
35 struct NVGcontext; | |
36 struct NVGpaint; | |
37 | |
38 START_NAMESPACE_DGL | |
39 | |
40 // ----------------------------------------------------------------------- | |
41 // Forward class names | |
42 | |
43 class NanoVG; | |
44 | |
45 // ----------------------------------------------------------------------- | |
46 // Helper methods | |
47 | |
48 /** | |
49 Create a NanoVG context using the DPF-provided NanoVG library. | |
50 On Windows this will load a few extra OpenGL functions required for NanoVG to work. | |
51 */ | |
52 NVGcontext* nvgCreateGL(int flags); | |
53 | |
54 // ----------------------------------------------------------------------- | |
55 // NanoImage | |
56 | |
57 /** | |
58 NanoVG Image class. | |
59 | |
60 This implements NanoVG images as a C++ class where deletion is handled automatically. | |
61 Images need to be created within a NanoVG or NanoWidget class. | |
62 */ | |
63 class NanoImage | |
64 { | |
65 private: | |
66 struct Handle { | |
67 NVGcontext* context; | |
68 int imageId; | |
69 | |
70 Handle() noexcept | |
71 : context(nullptr), | |
72 imageId(0) {} | |
73 | |
74 Handle(NVGcontext* c, int id) noexcept | |
75 : context(c), | |
76 imageId(id) {} | |
77 }; | |
78 | |
79 public: | |
80 /** | |
81 Constructor for an invalid/null image. | |
82 */ | |
83 NanoImage(); | |
84 | |
85 /** | |
86 Constructor. | |
87 */ | |
88 NanoImage(const Handle& handle); | |
89 | |
90 /** | |
91 Destructor. | |
92 */ | |
93 ~NanoImage(); | |
94 | |
95 /** | |
96 Create a new image without recreating the C++ class. | |
97 */ | |
98 NanoImage& operator=(const Handle& handle); | |
99 | |
100 /** | |
101 Wherever this image is valid. | |
102 */ | |
103 bool isValid() const noexcept; | |
104 | |
105 /** | |
106 Get size. | |
107 */ | |
108 Size<uint> getSize() const noexcept; | |
109 | |
110 /** | |
111 Get the OpenGL texture handle. | |
112 */ | |
113 GLuint getTextureHandle() const; | |
114 | |
115 private: | |
116 Handle fHandle; | |
117 Size<uint> fSize; | |
118 friend class NanoVG; | |
119 | |
120 /** @internal */ | |
121 void _updateSize(); | |
122 | |
123 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoImage) | |
124 }; | |
125 | |
126 // ----------------------------------------------------------------------- | |
127 // NanoVG | |
128 | |
129 /** | |
130 NanoVG class. | |
131 | |
132 This class exposes the NanoVG drawing API. | |
133 All calls should be wrapped in beginFrame() and endFrame(). | |
134 | |
135 @section State Handling | |
136 NanoVG contains state which represents how paths will be rendered. | |
137 The state contains transform, fill and stroke styles, text and font styles, and scissor clipping. | |
138 | |
139 @section Render styles | |
140 Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern. | |
141 Solid color is simply defined as a color value, different kinds of paints can be created | |
142 using linearGradient(), boxGradient(), radialGradient() and imagePattern(). | |
143 | |
144 Current render style can be saved and restored using save() and restore(). | |
145 | |
146 @section Transforms | |
147 The paths, gradients, patterns and scissor region are transformed by an transformation | |
148 matrix at the time when they are passed to the API. | |
149 The current transformation matrix is a affine matrix: | |
150 [sx kx tx] | |
151 [ky sy ty] | |
152 [ 0 0 1] | |
153 Where: sx,sy define scaling, kx,ky skewing, and tx,ty translation. | |
154 The last row is assumed to be 0,0,1 and is not stored. | |
155 | |
156 Apart from resetTransform(), each transformation function first creates | |
157 specific transformation matrix and pre-multiplies the current transformation by it. | |
158 | |
159 Current coordinate system (transformation) can be saved and restored using save() and restore(). | |
160 | |
161 @section Images | |
162 NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering. | |
163 In addition you can upload your own image. The image loading is provided by stb_image. | |
164 | |
165 @section Paints | |
166 NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern. | |
167 These can be used as paints for strokes and fills. | |
168 | |
169 @section Scissoring | |
170 Scissoring allows you to clip the rendering into a rectangle. This is useful for various | |
171 user interface cases like rendering a text edit or a timeline. | |
172 | |
173 @section Paths | |
174 Drawing a new shape starts with beginPath(), it clears all the currently defined paths. | |
175 Then you define one or more paths and sub-paths which describe the shape. The are functions | |
176 to draw common shapes like rectangles and circles, and lower level step-by-step functions, | |
177 which allow to define a path curve by curve. | |
178 | |
179 NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise | |
180 winding and holes should have counter clockwise order. To specify winding of a path you can | |
181 call pathWinding(). This is useful especially for the common shapes, which are drawn CCW. | |
182 | |
183 Finally you can fill the path using current fill style by calling fill(), and stroke it | |
184 with current stroke style by calling stroke(). | |
185 | |
186 The curve segments and sub-paths are transformed by the current transform. | |
187 | |
188 @section Text | |
189 NanoVG allows you to load .ttf files and use the font to render text. | |
190 | |
191 The appearance of the text can be defined by setting the current text style | |
192 and by specifying the fill color. Common text and font settings such as | |
193 font size, letter spacing and text align are supported. Font blur allows you | |
194 to create simple text effects such as drop shadows. | |
195 | |
196 At render time the font face can be set based on the font handles or name. | |
197 | |
198 Font measure functions return values in local space, the calculations are | |
199 carried in the same resolution as the final rendering. This is done because | |
200 the text glyph positions are snapped to the nearest pixels sharp rendering. | |
201 | |
202 The local space means that values are not rotated or scale as per the current | |
203 transformation. For example if you set font size to 12, which would mean that | |
204 line height is 16, then regardless of the current scaling and rotation, the | |
205 returned line height is always 16. Some measures may vary because of the scaling | |
206 since aforementioned pixel snapping. | |
207 | |
208 While this may sound a little odd, the setup allows you to always render the | |
209 same way regardless of scaling. i.e. following works regardless of scaling: | |
210 | |
211 @code | |
212 const char* txt = "Text me up."; | |
213 vg.textBounds(x,y, txt, NULL, bounds); | |
214 vg.beginPath(); | |
215 vg.roundedRect(bounds[0], bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]); | |
216 vg.fill(); | |
217 @endcode | |
218 | |
219 Note: currently only solid color fill is supported for text. | |
220 */ | |
221 class NanoVG | |
222 { | |
223 public: | |
224 enum CreateFlags { | |
225 /** | |
226 Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA). | |
227 */ | |
228 CREATE_ANTIALIAS = 1 << 0, | |
229 | |
230 /** | |
231 Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little | |
232 slower, but path overlaps (i.e. self-intersecting or sharp turns) will be drawn just once. | |
233 */ | |
234 CREATE_STENCIL_STROKES = 1 << 1, | |
235 | |
236 /** | |
237 Flag indicating that additional debug checks are done. | |
238 */ | |
239 CREATE_DEBUG = 1 << 2, | |
240 }; | |
241 | |
242 enum ImageFlags { | |
243 IMAGE_GENERATE_MIPMAPS = 1 << 0, // Generate mipmaps during creation of the image. | |
244 IMAGE_REPEAT_X = 1 << 1, // Repeat image in X direction. | |
245 IMAGE_REPEAT_Y = 1 << 2, // Repeat image in Y direction. | |
246 IMAGE_FLIP_Y = 1 << 3, // Flips (inverses) image in Y direction when rendered. | |
247 IMAGE_PREMULTIPLIED = 1 << 4 // Image data has premultiplied alpha. | |
248 }; | |
249 | |
250 enum Align { | |
251 // Horizontal align | |
252 ALIGN_LEFT = 1 << 0, // Align horizontally to left (default). | |
253 ALIGN_CENTER = 1 << 1, // Align horizontally to center. | |
254 ALIGN_RIGHT = 1 << 2, // Align horizontally to right. | |
255 // Vertical align | |
256 ALIGN_TOP = 1 << 3, // Align vertically to top. | |
257 ALIGN_MIDDLE = 1 << 4, // Align vertically to middle. | |
258 ALIGN_BOTTOM = 1 << 5, // Align vertically to bottom. | |
259 ALIGN_BASELINE = 1 << 6 // Align vertically to baseline (default). | |
260 }; | |
261 | |
262 enum LineCap { | |
263 BUTT, | |
264 ROUND, | |
265 SQUARE, | |
266 BEVEL, | |
267 MITER | |
268 }; | |
269 | |
270 enum Solidity { | |
271 SOLID = 1, // CCW | |
272 HOLE = 2 // CW | |
273 }; | |
274 | |
275 enum Winding { | |
276 CCW = 1, // Winding for solid shapes | |
277 CW = 2 // Winding for holes | |
278 }; | |
279 | |
280 struct Paint { | |
281 float xform[6]; | |
282 float extent[2]; | |
283 float radius; | |
284 float feather; | |
285 Color innerColor; | |
286 Color outerColor; | |
287 int imageId; | |
288 | |
289 Paint() noexcept; | |
290 | |
291 /** | |
292 @internal | |
293 */ | |
294 Paint(const NVGpaint&) noexcept; | |
295 operator NVGpaint() const noexcept; | |
296 }; | |
297 | |
298 struct GlyphPosition { | |
299 const char* str; // Position of the glyph in the input string. | |
300 float x; // The x-coordinate of the logical glyph position. | |
301 float minx, maxx; // The bounds of the glyph shape. | |
302 }; | |
303 | |
304 struct TextRow { | |
305 const char* start; // Pointer to the input text where the row starts. | |
306 const char* end; // Pointer to the input text where the row ends (one past the last character). | |
307 const char* next; // Pointer to the beginning of the next row. | |
308 float width; // Logical width of the row. | |
309 float minx, maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending. | |
310 }; | |
311 | |
312 typedef int FontId; | |
313 | |
314 /** | |
315 Constructor. | |
316 @see CreateFlags | |
317 */ | |
318 NanoVG(int flags = CREATE_ANTIALIAS); | |
319 | |
320 /** | |
321 Constructor reusing a NanoVG context, used for subwidgets. | |
322 Context will not be deleted on class destructor. | |
323 */ | |
324 explicit NanoVG(NVGcontext* context); | |
325 | |
326 /** | |
327 Destructor. | |
328 */ | |
329 virtual ~NanoVG(); | |
330 | |
331 /** | |
332 Get the NanoVG context. | |
333 You should not need this under normal circumstances. | |
334 */ | |
335 NVGcontext* getContext() const noexcept | |
336 { | |
337 return fContext; | |
338 } | |
339 | |
340 /** | |
341 Begin drawing a new frame. | |
342 */ | |
343 void beginFrame(const uint width, const uint height, const float scaleFactor = 1.0f); | |
344 | |
345 /** | |
346 Begin drawing a new frame inside a widget. | |
347 */ | |
348 void beginFrame(Widget* const widget); | |
349 | |
350 /** | |
351 Cancels drawing the current frame. | |
352 */ | |
353 void cancelFrame(); | |
354 | |
355 /** | |
356 Ends drawing flushing remaining render state. | |
357 */ | |
358 void endFrame(); | |
359 | |
360 /* -------------------------------------------------------------------- | |
361 * State Handling */ | |
362 | |
363 /** | |
364 Pushes and saves the current render state into a state stack. | |
365 A matching restore() must be used to restore the state. | |
366 */ | |
367 void save(); | |
368 | |
369 /** | |
370 Pops and restores current render state. | |
371 */ | |
372 void restore(); | |
373 | |
374 /** | |
375 Resets current render state to default values. Does not affect the render state stack. | |
376 */ | |
377 void reset(); | |
378 | |
379 /* -------------------------------------------------------------------- | |
380 * Render styles */ | |
381 | |
382 /** | |
383 Sets current stroke style to a solid color. | |
384 */ | |
385 void strokeColor(const Color& color); | |
386 | |
387 /** | |
388 Sets current stroke style to a solid color, made from red, green, blue and alpha numeric values. | |
389 Values must be in [0..255] range. | |
390 */ | |
391 void strokeColor(const int red, const int green, const int blue, const int alpha = 255); | |
392 | |
393 /** | |
394 Sets current stroke style to a solid color, made from red, green, blue and alpha numeric values. | |
395 Values must in [0..1] range. | |
396 */ | |
397 void strokeColor(const float red, const float green, const float blue, const float alpha = 1.0f); | |
398 | |
399 /** | |
400 Sets current stroke style to a paint, which can be a one of the gradients or a pattern. | |
401 */ | |
402 void strokePaint(const Paint& paint); | |
403 | |
404 /** | |
405 Sets current fill style to a solid color. | |
406 */ | |
407 void fillColor(const Color& color); | |
408 | |
409 /** | |
410 Sets current fill style to a solid color, made from red, green, blue and alpha numeric values. | |
411 Values must be in [0..255] range. | |
412 */ | |
413 void fillColor(const int red, const int green, const int blue, const int alpha = 255); | |
414 | |
415 /** | |
416 Sets current fill style to a solid color, made from red, green, blue and alpha numeric values. | |
417 Values must in [0..1] range. | |
418 */ | |
419 void fillColor(const float red, const float green, const float blue, const float alpha = 1.0f); | |
420 | |
421 /** | |
422 Sets current fill style to a paint, which can be a one of the gradients or a pattern. | |
423 */ | |
424 void fillPaint(const Paint& paint); | |
425 | |
426 /** | |
427 Sets the miter limit of the stroke style. | |
428 Miter limit controls when a sharp corner is beveled. | |
429 */ | |
430 void miterLimit(float limit); | |
431 | |
432 /** | |
433 Sets the stroke width of the stroke style. | |
434 */ | |
435 void strokeWidth(float size); | |
436 | |
437 /** | |
438 Sets how the end of the line (cap) is drawn, | |
439 Can be one of: BUTT, ROUND, SQUARE. | |
440 */ | |
441 void lineCap(LineCap cap = BUTT); | |
442 | |
443 /** | |
444 Sets how sharp path corners are drawn. | |
445 Can be one of MITER, ROUND, BEVEL. | |
446 */ | |
447 void lineJoin(LineCap join = MITER); | |
448 | |
449 /** | |
450 Sets the transparency applied to all rendered shapes. | |
451 Already transparent paths will get proportionally more transparent as well. | |
452 */ | |
453 void globalAlpha(float alpha); | |
454 | |
455 /** | |
456 Sets the color tint applied to all rendered shapes. | |
457 */ | |
458 void globalTint(Color tint); | |
459 | |
460 /* -------------------------------------------------------------------- | |
461 * Transforms */ | |
462 | |
463 /** | |
464 Resets current transform to a identity matrix. | |
465 */ | |
466 void resetTransform(); | |
467 | |
468 /** | |
469 Pre-multiplies current coordinate system by specified matrix. | |
470 The parameters are interpreted as matrix as follows: | |
471 [a c e] | |
472 [b d f] | |
473 [0 0 1] | |
474 */ | |
475 void transform(float a, float b, float c, float d, float e, float f); | |
476 | |
477 /** | |
478 Translates current coordinate system. | |
479 */ | |
480 void translate(float x, float y); | |
481 | |
482 /** | |
483 Rotates current coordinate system. Angle is specified in radians. | |
484 */ | |
485 void rotate(float angle); | |
486 | |
487 /** | |
488 Skews the current coordinate system along X axis. Angle is specified in radians. | |
489 */ | |
490 void skewX(float angle); | |
491 | |
492 /** | |
493 Skews the current coordinate system along Y axis. Angle is specified in radians. | |
494 */ | |
495 void skewY(float angle); | |
496 | |
497 /** | |
498 Scales the current coordinate system. | |
499 */ | |
500 void scale(float x, float y); | |
501 | |
502 /** | |
503 Stores the top part (a-f) of the current transformation matrix in to the specified buffer. | |
504 [a c e] | |
505 [b d f] | |
506 [0 0 1] | |
507 */ | |
508 void currentTransform(float xform[6]); | |
509 | |
510 /** | |
511 The following functions can be used to make calculations on 2x3 transformation matrices. | |
512 A 2x3 matrix is represented as float[6]. */ | |
513 | |
514 /** | |
515 Sets the transform to identity matrix. | |
516 */ | |
517 static void transformIdentity(float dst[6]); | |
518 | |
519 /** | |
520 Sets the transform to translation matrix | |
521 */ | |
522 static void transformTranslate(float dst[6], float tx, float ty); | |
523 | |
524 /** | |
525 Sets the transform to scale matrix. | |
526 */ | |
527 static void transformScale(float dst[6], float sx, float sy); | |
528 | |
529 /** | |
530 Sets the transform to rotate matrix. Angle is specified in radians. | |
531 */ | |
532 static void transformRotate(float dst[6], float a); | |
533 | |
534 /** | |
535 Sets the transform to skew-x matrix. Angle is specified in radians. | |
536 */ | |
537 static void transformSkewX(float dst[6], float a); | |
538 | |
539 /** | |
540 Sets the transform to skew-y matrix. Angle is specified in radians. | |
541 */ | |
542 static void transformSkewY(float dst[6], float a); | |
543 | |
544 /** | |
545 Sets the transform to the result of multiplication of two transforms, of A = A*B. | |
546 */ | |
547 static void transformMultiply(float dst[6], const float src[6]); | |
548 | |
549 /** | |
550 Sets the transform to the result of multiplication of two transforms, of A = B*A. | |
551 */ | |
552 static void transformPremultiply(float dst[6], const float src[6]); | |
553 | |
554 /** | |
555 Sets the destination to inverse of specified transform. | |
556 Returns 1 if the inverse could be calculated, else 0. | |
557 */ | |
558 static int transformInverse(float dst[6], const float src[6]); | |
559 | |
560 /** | |
561 Transform a point by given transform. | |
562 */ | |
563 static void transformPoint(float& dstx, float& dsty, const float xform[6], float srcx, float srcy); | |
564 | |
565 /** | |
566 Convert degrees to radians. | |
567 */ | |
568 static float degToRad(float deg); | |
569 | |
570 /** | |
571 Convert radians to degrees. | |
572 */ | |
573 static float radToDeg(float rad); | |
574 | |
575 /* -------------------------------------------------------------------- | |
576 * Images */ | |
577 | |
578 /** | |
579 Creates image by loading it from the disk from specified file name. | |
580 */ | |
581 NanoImage::Handle createImageFromFile(const char* filename, ImageFlags imageFlags); | |
582 | |
583 /** | |
584 Creates image by loading it from the disk from specified file name. | |
585 Overloaded function for convenience. | |
586 @see ImageFlags | |
587 */ | |
588 NanoImage::Handle createImageFromFile(const char* filename, int imageFlags); | |
589 | |
590 /** | |
591 Creates image by loading it from the specified chunk of memory. | |
592 */ | |
593 NanoImage::Handle createImageFromMemory(const uchar* data, uint dataSize, ImageFlags imageFlags); | |
594 | |
595 /** | |
596 Creates image by loading it from the specified chunk of memory. | |
597 Overloaded function for convenience. | |
598 @see ImageFlags | |
599 */ | |
600 NanoImage::Handle createImageFromMemory(const uchar* data, uint dataSize, int imageFlags); | |
601 | |
602 /** | |
603 Creates image from specified raw format image data. | |
604 */ | |
605 NanoImage::Handle createImageFromRawMemory(uint w, uint h, const uchar* data, | |
606 ImageFlags imageFlags, ImageFormat format); | |
607 | |
608 /** | |
609 Creates image from specified raw format image data. | |
610 Overloaded function for convenience. | |
611 @see ImageFlags | |
612 */ | |
613 NanoImage::Handle createImageFromRawMemory(uint w, uint h, const uchar* data, | |
614 int imageFlags, ImageFormat format); | |
615 | |
616 /** | |
617 Creates image from specified RGBA image data. | |
618 */ | |
619 NanoImage::Handle createImageFromRGBA(uint w, uint h, const uchar* data, ImageFlags imageFlags); | |
620 | |
621 /** | |
622 Creates image from specified RGBA image data. | |
623 Overloaded function for convenience. | |
624 @see ImageFlags | |
625 */ | |
626 NanoImage::Handle createImageFromRGBA(uint w, uint h, const uchar* data, int imageFlags); | |
627 | |
628 /** | |
629 Creates image from an OpenGL texture handle. | |
630 */ | |
631 NanoImage::Handle createImageFromTextureHandle(GLuint textureId, uint w, uint h, ImageFlags imageFlags, bool deleteTexture = false); | |
632 | |
633 /** | |
634 Creates image from an OpenGL texture handle. | |
635 Overloaded function for convenience. | |
636 @see ImageFlags | |
637 */ | |
638 NanoImage::Handle createImageFromTextureHandle(GLuint textureId, uint w, uint h, int imageFlags, bool deleteTexture = false); | |
639 | |
640 /* -------------------------------------------------------------------- | |
641 * Paints */ | |
642 | |
643 /** | |
644 Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates | |
645 of the linear gradient, icol specifies the start color and ocol the end color. | |
646 The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | |
647 */ | |
648 Paint linearGradient(float sx, float sy, float ex, float ey, const Color& icol, const Color& ocol); | |
649 | |
650 /** | |
651 Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering | |
652 drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle, | |
653 (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry | |
654 the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient. | |
655 The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | |
656 */ | |
657 Paint boxGradient(float x, float y, float w, float h, float r, float f, const Color& icol, const Color& ocol); | |
658 | |
659 /** | |
660 Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify | |
661 the inner and outer radius of the gradient, icol specifies the start color and ocol the end color. | |
662 The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | |
663 */ | |
664 Paint radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol); | |
665 | |
666 /** | |
667 Creates and returns an image pattern. Parameters (ox,oy) specify the left-top location of the image pattern, | |
668 (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render. | |
669 The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | |
670 */ | |
671 Paint imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage& image, float alpha); | |
672 | |
673 /* -------------------------------------------------------------------- | |
674 * Scissoring */ | |
675 | |
676 /** | |
677 Sets the current scissor rectangle. | |
678 The scissor rectangle is transformed by the current transform. | |
679 */ | |
680 void scissor(float x, float y, float w, float h); | |
681 | |
682 /** | |
683 Intersects current scissor rectangle with the specified rectangle. | |
684 The scissor rectangle is transformed by the current transform. | |
685 Note: in case the rotation of previous scissor rect differs from | |
686 the current one, the intersection will be done between the specified | |
687 rectangle and the previous scissor rectangle transformed in the current | |
688 transform space. The resulting shape is always rectangle. | |
689 */ | |
690 void intersectScissor(float x, float y, float w, float h); | |
691 | |
692 /** | |
693 Reset and disables scissoring. | |
694 */ | |
695 void resetScissor(); | |
696 | |
697 /* -------------------------------------------------------------------- | |
698 * Paths */ | |
699 | |
700 /** | |
701 Clears the current path and sub-paths. | |
702 */ | |
703 void beginPath(); | |
704 | |
705 /** | |
706 Starts new sub-path with specified point as first point. | |
707 */ | |
708 void moveTo(float x, float y); | |
709 | |
710 /** | |
711 Adds line segment from the last point in the path to the specified point. | |
712 */ | |
713 void lineTo(float x, float y); | |
714 | |
715 /** | |
716 Adds cubic bezier segment from last point in the path via two control points to the specified point. | |
717 */ | |
718 void bezierTo(float c1x, float c1y, float c2x, float c2y, float x, float y); | |
719 | |
720 /** | |
721 Adds quadratic bezier segment from last point in the path via a control point to the specified point. | |
722 */ | |
723 void quadTo(float cx, float cy, float x, float y); | |
724 | |
725 /** | |
726 Adds an arc segment at the corner defined by the last path point, and two specified points. | |
727 */ | |
728 void arcTo(float x1, float y1, float x2, float y2, float radius); | |
729 | |
730 /** | |
731 Closes current sub-path with a line segment. | |
732 */ | |
733 void closePath(); | |
734 | |
735 /** | |
736 Sets the current sub-path winding. | |
737 */ | |
738 void pathWinding(Winding dir); | |
739 | |
740 /** | |
741 Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r, | |
742 and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW or NVG_CW). | |
743 Angles are specified in radians. | |
744 */ | |
745 void arc(float cx, float cy, float r, float a0, float a1, Winding dir); | |
746 | |
747 /** | |
748 Creates new rectangle shaped sub-path. | |
749 */ | |
750 void rect(float x, float y, float w, float h); | |
751 | |
752 /** | |
753 Creates new rounded rectangle shaped sub-path. | |
754 */ | |
755 void roundedRect(float x, float y, float w, float h, float r); | |
756 | |
757 /** | |
758 Creates new ellipse shaped sub-path. | |
759 */ | |
760 void ellipse(float cx, float cy, float rx, float ry); | |
761 | |
762 /** | |
763 Creates new circle shaped sub-path. | |
764 */ | |
765 void circle(float cx, float cy, float r); | |
766 | |
767 /** | |
768 Fills the current path with current fill style. | |
769 */ | |
770 void fill(); | |
771 | |
772 /** | |
773 Fills the current path with current stroke style. | |
774 */ | |
775 void stroke(); | |
776 | |
777 /* -------------------------------------------------------------------- | |
778 * Text */ | |
779 | |
780 /** | |
781 Creates font by loading it from the disk from specified file name. | |
782 Returns handle to the font. | |
783 */ | |
784 FontId createFontFromFile(const char* name, const char* filename); | |
785 | |
786 /** | |
787 Creates font by loading it from the specified memory chunk. | |
788 Returns handle to the font. | |
789 */ | |
790 FontId createFontFromMemory(const char* name, const uchar* data, uint dataSize, bool freeData); | |
791 | |
792 /** | |
793 Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. | |
794 */ | |
795 FontId findFont(const char* name); | |
796 | |
797 /** | |
798 Sets the font size of current text style. | |
799 */ | |
800 void fontSize(float size); | |
801 | |
802 /** | |
803 Sets the blur of current text style. | |
804 */ | |
805 void fontBlur(float blur); | |
806 | |
807 /** | |
808 Sets the letter spacing of current text style. | |
809 */ | |
810 void textLetterSpacing(float spacing); | |
811 | |
812 /** | |
813 Sets the proportional line height of current text style. The line height is specified as multiple of font size. | |
814 */ | |
815 void textLineHeight(float lineHeight); | |
816 | |
817 /** | |
818 Sets the text align of current text style. | |
819 */ | |
820 void textAlign(Align align); | |
821 | |
822 /** | |
823 Sets the text align of current text style. | |
824 Overloaded function for convenience. | |
825 @see Align | |
826 */ | |
827 void textAlign(int align); | |
828 | |
829 /** | |
830 Sets the font face based on specified id of current text style. | |
831 */ | |
832 void fontFaceId(FontId font); | |
833 | |
834 /** | |
835 Sets the font face based on specified name of current text style. | |
836 */ | |
837 void fontFace(const char* font); | |
838 | |
839 /** | |
840 Draws text string at specified location. If end is specified only the sub-string up to the end is drawn. | |
841 */ | |
842 float text(float x, float y, const char* string, const char* end); | |
843 | |
844 /** | |
845 Draws multi-line text string at specified location wrapped at the specified width. | |
846 If end is specified only the sub-string up to the end is drawn. | |
847 White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. | |
848 Words longer than the max width are slit at nearest character (i.e. no hyphenation). | |
849 */ | |
850 void textBox(float x, float y, float breakRowWidth, const char* string, const char* end = nullptr); | |
851 | |
852 /** | |
853 Measures the specified text string. The bounds value are [xmin,ymin, xmax,ymax]. | |
854 Returns the horizontal advance of the measured text (i.e. where the next character should drawn). | |
855 Measured values are returned in local coordinate space. | |
856 */ | |
857 float textBounds(float x, float y, const char* string, const char* end, Rectangle<float>& bounds); | |
858 | |
859 /** | |
860 Measures the specified multi-text string. Parameter bounds should be a pointer to float[4], | |
861 if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] | |
862 Measured values are returned in local coordinate space. | |
863 */ | |
864 void textBoxBounds(float x, float y, float breakRowWidth, const char* string, const char* end, float bounds[4]); | |
865 | |
866 /** | |
867 Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used. | |
868 Measured values are returned in local coordinate space. | |
869 */ | |
870 int textGlyphPositions(float x, float y, const char* string, const char* end, GlyphPosition& positions, int maxPositions); | |
871 | |
872 /** | |
873 Returns the vertical metrics based on the current text style. | |
874 Measured values are returned in local coordinate space. | |
875 */ | |
876 void textMetrics(float* ascender, float* descender, float* lineh); | |
877 | |
878 /** | |
879 Breaks the specified text into lines. If end is specified only the sub-string will be used. | |
880 White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. | |
881 Words longer than the max width are slit at nearest character (i.e. no hyphenation). | |
882 */ | |
883 int textBreakLines(const char* string, const char* end, float breakRowWidth, TextRow& rows, int maxRows); | |
884 | |
885 #ifndef DGL_NO_SHARED_RESOURCES | |
886 /** | |
887 Load DPF's internal shared resources for this NanoVG class. | |
888 */ | |
889 virtual bool loadSharedResources(); | |
890 #endif | |
891 | |
892 private: | |
893 NVGcontext* const fContext; | |
894 bool fInFrame; | |
895 bool fIsSubWidget; | |
896 | |
897 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoVG) | |
898 }; | |
899 | |
900 // ----------------------------------------------------------------------- | |
901 // NanoWidget | |
902 | |
903 /** | |
904 NanoVG Widget class. | |
905 | |
906 This class implements the NanoVG drawing API inside a DGL Widget. | |
907 The drawing function onDisplay() is implemented internally but a | |
908 new onNanoDisplay() needs to be overridden instead. | |
909 */ | |
910 template <class BaseWidget> | |
911 class NanoBaseWidget : public BaseWidget, | |
912 public NanoVG | |
913 { | |
914 public: | |
915 /** | |
916 Constructor for a NanoSubWidget. | |
917 @see CreateFlags | |
918 */ | |
919 explicit NanoBaseWidget(Widget* parentWidget, int flags = CREATE_ANTIALIAS); | |
920 | |
921 /** | |
922 Constructor for a NanoSubWidget reusing a parent subwidget nanovg context. | |
923 */ | |
924 explicit NanoBaseWidget(NanoBaseWidget<SubWidget>* parentWidget); | |
925 | |
926 /** | |
927 Constructor for a NanoSubWidget reusing a parent top-level-widget nanovg context. | |
928 */ | |
929 explicit NanoBaseWidget(NanoBaseWidget<TopLevelWidget>* parentWidget); | |
930 | |
931 /** | |
932 Constructor for a NanoTopLevelWidget. | |
933 @see CreateFlags | |
934 */ | |
935 explicit NanoBaseWidget(Window& windowToMapTo, int flags = CREATE_ANTIALIAS); | |
936 | |
937 /** | |
938 Constructor for a NanoStandaloneWindow without transient parent window. | |
939 @see CreateFlags | |
940 */ | |
941 explicit NanoBaseWidget(Application& app, int flags = CREATE_ANTIALIAS); | |
942 | |
943 /** | |
944 Constructor for a NanoStandaloneWindow with transient parent window. | |
945 @see CreateFlags | |
946 */ | |
947 explicit NanoBaseWidget(Application& app, Window& transientParentWindow, int flags = CREATE_ANTIALIAS); | |
948 | |
949 /** | |
950 Destructor. | |
951 */ | |
952 ~NanoBaseWidget() override {} | |
953 | |
954 protected: | |
955 /** | |
956 New virtual onDisplay function. | |
957 @see onDisplay | |
958 */ | |
959 virtual void onNanoDisplay() = 0; | |
960 | |
961 private: | |
962 /** | |
963 Widget display function. | |
964 Implemented internally to wrap begin/endFrame() automatically. | |
965 */ | |
966 void onDisplay() override; | |
967 | |
968 // these should not be used | |
969 void beginFrame(uint,uint) {} | |
970 void beginFrame(uint,uint,float) {} | |
971 void beginFrame(Widget*) {} | |
972 void cancelFrame() {} | |
973 void endFrame() {} | |
974 | |
975 /** @internal */ | |
976 const bool fUsingParentContext; | |
977 void displayChildren(); | |
978 friend class NanoBaseWidget<TopLevelWidget>; | |
979 friend class NanoBaseWidget<StandaloneWindow>; | |
980 | |
981 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoBaseWidget) | |
982 }; | |
983 | |
984 typedef NanoBaseWidget<SubWidget> NanoSubWidget; | |
985 typedef NanoBaseWidget<TopLevelWidget> NanoTopLevelWidget; | |
986 typedef NanoBaseWidget<StandaloneWindow> NanoStandaloneWindow; | |
987 | |
988 DISTRHO_DEPRECATED_BY("NanoSubWidget") | |
989 typedef NanoSubWidget NanoWidget; | |
990 | |
991 // ----------------------------------------------------------------------- | |
992 | |
993 END_NAMESPACE_DGL | |
994 | |
995 #ifdef _MSC_VER | |
996 # pragma warning(pop) | |
997 #endif | |
998 | |
999 #endif // DGL_NANO_WIDGET_HPP_INCLUDED |