diff options
Diffstat (limited to 'libs/dgl/src/NanoVG.cpp')
-rw-r--r-- | libs/dgl/src/NanoVG.cpp | 780 |
1 files changed, 0 insertions, 780 deletions
diff --git a/libs/dgl/src/NanoVG.cpp b/libs/dgl/src/NanoVG.cpp deleted file mode 100644 index a4c357b..0000000 --- a/libs/dgl/src/NanoVG.cpp +++ /dev/null @@ -1,780 +0,0 @@ -/* - * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> - * - * Permission to use, copy, modify, and/or distribute this software for any purpose with - * or without fee is hereby granted, provided that the above copyright notice and this - * permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "../NanoVG.hpp" -#include "../Window.hpp" - -// ----------------------------------------------------------------------- -// Ignore some warnings if debugging - -#if 0 //def DEBUG -# define NANOVG_GL3 0 -# define NANOVG_GLES2 0 -# define NANOVG_GLES3 0 -# define NANOVG_GL_USE_UNIFORMBUFFER 0 -# if defined(__clang__) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Weverything" -# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wall" -# pragma GCC diagnostic ignored "-Wextra" -# pragma GCC diagnostic ignored "-Wconversion" -# pragma GCC diagnostic ignored "-Weffc++" -# pragma GCC diagnostic ignored "-Wsign-conversion" -# pragma GCC diagnostic ignored "-Wundef" -# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" -# endif -#endif - -// ----------------------------------------------------------------------- -// Include NanoVG OpenGL implementation - -#define NANOVG_GL2_IMPLEMENTATION 1 -#include "nanovg/nanovg_gl.h" - -#if defined(NANOVG_GL2) -# define nvgCreateGL nvgCreateGL2 -# define nvgDeleteGL nvgDeleteGL2 -#elif defined(NANOVG_GL3) -# define nvgCreateGL nvgCreateGL3 -# define nvgDeleteGL nvgDeleteGL3 -#elif defined(NANOVG_GLES2) -# define nvgCreateGL nvgCreateGLES2 -# define nvgDeleteGL nvgDeleteGLES2 -#elif defined(NANOVG_GLES3) -# define nvgCreateGL nvgCreateGLES3 -# define nvgDeleteGL nvgDeleteGLES3 -#endif - -// ----------------------------------------------------------------------- -// Restore normal state if debugging - -#if 0//def DEBUG -# if defined(__clang__) -# pragma clang diagnostic pop -# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -# pragma GCC diagnostic pop -# endif -#endif - -// ----------------------------------------------------------------------- - -START_NAMESPACE_DGL - -// ----------------------------------------------------------------------- -// Paint - -NanoVG::Paint::Paint() noexcept - : radius(0.0f), feather(0.0f), innerColor(), outerColor(), imageId(0), repeat(REPEAT_NONE) -{ - std::memset(xform, 0, sizeof(float)*6); - std::memset(extent, 0, sizeof(float)*2); -} - -NanoVG::Paint::Paint(const NVGpaint& p) noexcept - : radius(p.radius), feather(p.feather), innerColor(p.innerColor), outerColor(p.outerColor), imageId(p.image), repeat(static_cast<PatternRepeat>(p.repeat)) -{ - std::memcpy(xform, p.xform, sizeof(float)*6); - std::memcpy(extent, p.extent, sizeof(float)*2); -} - -NanoVG::Paint::operator NVGpaint() const noexcept -{ - NVGpaint p; - p.radius = radius; - p.feather = feather; - p.innerColor = innerColor; - p.outerColor = outerColor; - p.image = imageId; - p.repeat = repeat; - std::memcpy(p.xform, xform, sizeof(float)*6); - std::memcpy(p.extent, extent, sizeof(float)*2); - return p; -} - -// ----------------------------------------------------------------------- -// NanoImage - -NanoImage::NanoImage(NVGcontext* const context, const int imageId) noexcept - : fContext(context), - fImageId(imageId), - fSize(), - leakDetector_NanoImage() -{ - _updateSize(); -} - -NanoImage::~NanoImage() -{ - if (fContext != nullptr && fImageId != 0) - nvgDeleteImage(fContext, fImageId); -} - -Size<uint> NanoImage::getSize() const noexcept -{ - return fSize; -} - -void NanoImage::updateImage(const uchar* const data) -{ - DISTRHO_SAFE_ASSERT_RETURN(data != nullptr,); - - if (fContext != nullptr && fImageId != 0) - { - nvgUpdateImage(fContext, fImageId, data); - _updateSize(); - } -} - -void NanoImage::_updateSize() -{ - int w=0, h=0; - - if (fContext != nullptr && fImageId != 0) - { - nvgImageSize(fContext, fImageId, &w, &h); - - if (w < 0) w = 0; - if (h < 0) h = 0; - } - - fSize.setSize(static_cast<uint>(w), static_cast<uint>(h)); -} - -// ----------------------------------------------------------------------- -// NanoVG - -NanoVG::NanoVG() - : fContext(nvgCreateGL(512, 512, NVG_ANTIALIAS)), - fInFrame(false), - leakDetector_NanoVG() -{ - DISTRHO_SAFE_ASSERT_RETURN(fContext != nullptr,); -} - -NanoVG::NanoVG(const int textAtlasWidth, const int textAtlasHeight) - : fContext(nvgCreateGL(textAtlasWidth, textAtlasHeight, NVG_ANTIALIAS)), - fInFrame(false), - leakDetector_NanoVG() -{ - DISTRHO_SAFE_ASSERT_RETURN(fContext != nullptr,); -} - -NanoVG::~NanoVG() -{ - DISTRHO_SAFE_ASSERT(! fInFrame); - - if (fContext != nullptr) - nvgDeleteGL(fContext); -} - -// ----------------------------------------------------------------------- - -void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor, const Alpha alpha) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,); - DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); - - fInFrame = true; - nvgBeginFrame(fContext, static_cast<int>(width), static_cast<int>(height), scaleFactor, static_cast<NVGalpha>(alpha)); -} - -void NanoVG::beginFrame(Widget* const widget) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(widget != nullptr,); - DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); - - Window& window(widget->getParentWindow()); - - fInFrame = true; - nvgBeginFrame(fContext, static_cast<int>(window.getWidth()), static_cast<int>(window.getHeight()), 1.0f, NVG_PREMULTIPLIED_ALPHA); -} - -void NanoVG::endFrame() -{ - DISTRHO_SAFE_ASSERT_RETURN(fInFrame,); - - if (fContext != nullptr) - nvgEndFrame(fContext); - - fInFrame = false; -} - -// ----------------------------------------------------------------------- -// State Handling - -void NanoVG::save() -{ - if (fContext != nullptr) - nvgSave(fContext); -} - -void NanoVG::restore() -{ - if (fContext != nullptr) - nvgRestore(fContext); -} - -void NanoVG::reset() -{ - if (fContext != nullptr) - nvgReset(fContext); -} - -// ----------------------------------------------------------------------- -// Render styles - -void NanoVG::strokeColor(const Color& color) -{ - if (fContext != nullptr) - nvgStrokeColor(fContext, color); -} - -void NanoVG::strokeColor(const int red, const int green, const int blue, const int alpha) -{ - if (fContext != nullptr) - { - DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); - - nvgStrokeColor(fContext, nvgRGBA(static_cast<uchar>(red), - static_cast<uchar>(green), - static_cast<uchar>(blue), - static_cast<uchar>(alpha))); - } -} - -void NanoVG::strokeColor(const float red, const float green, const float blue, const float alpha) -{ - if (fContext != nullptr) - nvgStrokeColor(fContext, nvgRGBAf(red, green, blue, alpha)); -} - -void NanoVG::strokePaint(const Paint& paint) -{ - if (fContext != nullptr) - nvgStrokePaint(fContext, paint); -} - -void NanoVG::fillColor(const Color& color) -{ - if (fContext != nullptr) - nvgFillColor(fContext, color); -} - -void NanoVG::fillColor(const int red, const int green, const int blue, const int alpha) -{ - if (fContext != nullptr) - { - DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); - DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); - - nvgFillColor(fContext, nvgRGBA(static_cast<uchar>(red), - static_cast<uchar>(green), - static_cast<uchar>(blue), - static_cast<uchar>(alpha))); - } -} - -void NanoVG::fillColor(const float red, const float green, const float blue, const float alpha) -{ - if (fContext != nullptr) - nvgFillColor(fContext, nvgRGBAf(red, green, blue, alpha)); -} - -void NanoVG::fillPaint(const Paint& paint) -{ - if (fContext != nullptr) - nvgFillPaint(fContext, paint); -} - -void NanoVG::miterLimit(float limit) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(limit > 0.0f,); - - nvgMiterLimit(fContext, limit); -} - -void NanoVG::strokeWidth(float size) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); - - nvgStrokeWidth(fContext, size); -} - -void NanoVG::lineCap(NanoVG::LineCap cap) -{ - if (fContext != nullptr) - nvgLineCap(fContext, cap); -} - -void NanoVG::lineJoin(NanoVG::LineCap join) -{ - if (fContext != nullptr) - nvgLineJoin(fContext, join); -} - -// ----------------------------------------------------------------------- -// Transforms - -void NanoVG::resetTransform() -{ - if (fContext != nullptr) - nvgResetTransform(fContext); -} - -void NanoVG::transform(float a, float b, float c, float d, float e, float f) -{ - if (fContext != nullptr) - nvgTransform(fContext, a, b, c, d, e, f); -} - -void NanoVG::translate(float x, float y) -{ - if (fContext != nullptr) - nvgTranslate(fContext, x, y); -} - -void NanoVG::rotate(float angle) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); - - nvgRotate(fContext, angle); -} - -void NanoVG::skewX(float angle) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); - - nvgSkewX(fContext, angle); -} - -void NanoVG::skewY(float angle) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); - - nvgSkewY(fContext, angle); -} - -void NanoVG::scale(float x, float y) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(x > 0.0f,); - DISTRHO_SAFE_ASSERT_RETURN(y > 0.0f,); - - nvgScale(fContext, x, y); -} - -void NanoVG::currentTransform(float xform[6]) -{ - if (fContext != nullptr) - nvgCurrentTransform(fContext, xform); -} - -void NanoVG::transformIdentity(float dst[6]) -{ - nvgTransformIdentity(dst); -} - -void NanoVG::transformTranslate(float dst[6], float tx, float ty) -{ - nvgTransformTranslate(dst, tx, ty); -} - -void NanoVG::transformScale(float dst[6], float sx, float sy) -{ - nvgTransformScale(dst, sx, sy); -} - -void NanoVG::transformRotate(float dst[6], float a) -{ - nvgTransformRotate(dst, a); -} - -void NanoVG::transformSkewX(float dst[6], float a) -{ - nvgTransformSkewX(dst, a); -} - -void NanoVG::transformSkewY(float dst[6], float a) -{ - nvgTransformSkewY(dst, a); -} - -void NanoVG::transformMultiply(float dst[6], const float src[6]) -{ - nvgTransformMultiply(dst, src); -} - -void NanoVG::transformPremultiply(float dst[6], const float src[6]) -{ - nvgTransformPremultiply(dst, src); -} - -int NanoVG::transformInverse(float dst[6], const float src[6]) -{ - return nvgTransformInverse(dst, src); -} - -void NanoVG::transformPoint(float& dstx, float& dsty, const float xform[6], float srcx, float srcy) -{ - nvgTransformPoint(&dstx, &dsty, xform, srcx, srcy); -} - -float NanoVG::degToRad(float deg) -{ - return nvgDegToRad(deg); -} - -float NanoVG::radToDeg(float rad) -{ - return nvgRadToDeg(rad); -} - -// ----------------------------------------------------------------------- -// Images - -NanoImage* NanoVG::createImage(const char* filename) -{ - if (fContext == nullptr) return nullptr; - DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', nullptr); - - if (const int imageId = nvgCreateImage(fContext, filename)) - return new NanoImage(fContext, imageId); - - return nullptr; -} - -NanoImage* NanoVG::createImageMem(uchar* data, int ndata) -{ - if (fContext == nullptr) return nullptr; - DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, nullptr); - DISTRHO_SAFE_ASSERT_RETURN(ndata > 0, nullptr); - - if (const int imageId = nvgCreateImageMem(fContext, data, ndata)) - return new NanoImage(fContext, imageId); - - return nullptr; -} - -NanoImage* NanoVG::createImageRGBA(uint w, uint h, const uchar* data) -{ - if (fContext == nullptr) return nullptr; - DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, nullptr); - - if (const int imageId = nvgCreateImageRGBA(fContext, static_cast<int>(w), static_cast<int>(h), data)) - return new NanoImage(fContext, imageId); - - return nullptr; -} - -// ----------------------------------------------------------------------- -// Paints - -NanoVG::Paint NanoVG::linearGradient(float sx, float sy, float ex, float ey, const Color& icol, const Color& ocol) -{ - if (fContext == nullptr) return Paint(); - return nvgLinearGradient(fContext, sx, sy, ex, ey, icol, ocol); -} - -NanoVG::Paint NanoVG::boxGradient(float x, float y, float w, float h, float r, float f, const Color& icol, const Color& ocol) -{ - if (fContext == nullptr) return Paint(); - return nvgBoxGradient(fContext, x, y, w, h, r, f, icol, ocol); -} - -NanoVG::Paint NanoVG::radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol) -{ - if (fContext == nullptr) return Paint(); - return nvgRadialGradient(fContext, cx, cy, inr, outr, icol, ocol); -} - -NanoVG::Paint NanoVG::imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage* image, NanoVG::PatternRepeat repeat) -{ - if (fContext == nullptr) return Paint(); - DISTRHO_SAFE_ASSERT_RETURN(image != nullptr, Paint()); - - return nvgImagePattern(fContext, ox, oy, ex, ey, angle, image->fImageId, repeat); -} - -// ----------------------------------------------------------------------- -// Scissoring - -void NanoVG::scissor(float x, float y, float w, float h) -{ - if (fContext != nullptr) - nvgScissor(fContext, x, y, w, h); -} - -void NanoVG::resetScissor() -{ - if (fContext != nullptr) - nvgResetScissor(fContext); -} - -// ----------------------------------------------------------------------- -// Paths - -void NanoVG::beginPath() -{ - if (fContext != nullptr) - nvgBeginPath(fContext); -} - -void NanoVG::moveTo(float x, float y) -{ - if (fContext != nullptr) - nvgMoveTo(fContext, x, y); -} - -void NanoVG::lineTo(float x, float y) -{ - if (fContext != nullptr) - nvgLineTo(fContext, x, y); -} - -void NanoVG::bezierTo(float c1x, float c1y, float c2x, float c2y, float x, float y) -{ - if (fContext != nullptr) - nvgBezierTo(fContext, c1x, c1y, c2x, c2y, x, y); -} - -void NanoVG::arcTo(float x1, float y1, float x2, float y2, float radius) -{ - if (fContext != nullptr) - nvgArcTo(fContext, x1, y1, x2, y2, radius); -} - -void NanoVG::closePath() -{ - if (fContext != nullptr) - nvgClosePath(fContext); -} - -void NanoVG::pathWinding(NanoVG::Winding dir) -{ - if (fContext != nullptr) - nvgPathWinding(fContext, dir); -} - -void NanoVG::arc(float cx, float cy, float r, float a0, float a1, NanoVG::Winding dir) -{ - if (fContext != nullptr) - nvgArc(fContext, cx, cy, r, a0, a1, dir); -} - -void NanoVG::rect(float x, float y, float w, float h) -{ - if (fContext != nullptr) - nvgRect(fContext, x, y, w, h); -} - -void NanoVG::roundedRect(float x, float y, float w, float h, float r) -{ - if (fContext != nullptr) - nvgRoundedRect(fContext, x, y, w, h, r); -} - -void NanoVG::ellipse(float cx, float cy, float rx, float ry) -{ - if (fContext != nullptr) - nvgEllipse(fContext, cx, cy, rx, ry); -} - -void NanoVG::circle(float cx, float cy, float r) -{ - if (fContext != nullptr) - nvgCircle(fContext, cx, cy, r); -} - -void NanoVG::fill() -{ - if (fContext != nullptr) - nvgFill(fContext); -} - -void NanoVG::stroke() -{ - if (fContext != nullptr) - nvgStroke(fContext); -} - -// ----------------------------------------------------------------------- -// Text - -NanoVG::FontId NanoVG::createFont(const char* name, const char* filename) -{ - if (fContext == nullptr) return -1; - DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); - DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', -1); - - return nvgCreateFont(fContext, name, filename); -} - -NanoVG::FontId NanoVG::createFontMem(const char* name, const uchar* data, int ndata, bool freeData) -{ - if (fContext == nullptr) return -1; - DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); - DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, -1); - - return nvgCreateFontMem(fContext, name, const_cast<uchar*>(data), ndata, freeData); -} - -NanoVG::FontId NanoVG::findFont(const char* name) -{ - if (fContext == nullptr) return -1; - DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); - - return nvgFindFont(fContext, name); -} - -void NanoVG::fontSize(float size) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); - - nvgFontSize(fContext, size); -} - -void NanoVG::fontBlur(float blur) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(blur >= 0.0f,); - - nvgFontBlur(fContext, blur); -} - -void NanoVG::textLetterSpacing(float spacing) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(spacing >= 0.0f,); - - nvgTextLetterSpacing(fContext, spacing); -} - -void NanoVG::textLineHeight(float lineHeight) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(lineHeight > 0.0f,); - - nvgTextLineHeight(fContext, lineHeight); -} - -void NanoVG::textAlign(NanoVG::Align align) -{ - if (fContext != nullptr) - nvgTextAlign(fContext, align); -} - -void NanoVG::textAlign(int align) -{ - if (fContext != nullptr) - nvgTextAlign(fContext, align); -} - -void NanoVG::fontFaceId(FontId font) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(font >= 0,); - - nvgFontFaceId(fContext, font); -} - -void NanoVG::fontFace(const char* font) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(font != nullptr && font[0] != '\0',); - - nvgFontFace(fContext, font); -} - -float NanoVG::text(float x, float y, const char* string, const char* end) -{ - if (fContext == nullptr) return 0.0f; - DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0.0f); - - return nvgText(fContext, x, y, string, end); -} - -void NanoVG::textBox(float x, float y, float breakRowWidth, const char* string, const char* end) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0',); - - nvgTextBox(fContext, x, y, breakRowWidth, string, end); -} - -float NanoVG::textBounds(float x, float y, const char* string, const char* end, Rectangle<float>& bounds) -{ - if (fContext == nullptr) return 0.0f; - DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0.0f); - - float b[4]; - const float ret = nvgTextBounds(fContext, x, y, string, end, b); - bounds = Rectangle<float>(b[0], b[1], b[2], b[3]); - return ret; -} - -void NanoVG::textBoxBounds(float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds) -{ - if (fContext == nullptr) return; - DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0',); - - nvgTextBoxBounds(fContext, x, y, breakRowWidth, string, end, bounds); -} - -int NanoVG::textGlyphPositions(float x, float y, const char* string, const char* end, NanoVG::GlyphPosition* positions, int maxPositions) -{ - if (fContext == nullptr) return 0; - DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0); - - return nvgTextGlyphPositions(fContext, x, y, string, end, (NVGglyphPosition*)positions, maxPositions); -} - -void NanoVG::textMetrics(float* ascender, float* descender, float* lineh) -{ - if (fContext != nullptr) - nvgTextMetrics(fContext, ascender, descender, lineh); -} - -int NanoVG::textBreakLines(const char* string, const char* end, float breakRowWidth, NanoVG::TextRow* rows, int maxRows) -{ - if (fContext != nullptr) - return nvgTextBreakLines(fContext, string, end, breakRowWidth, (NVGtextRow*)rows, maxRows); - return 0; -} - -// ----------------------------------------------------------------------- - -END_NAMESPACE_DGL - -extern "C" { -#include "nanovg/nanovg.c" -} - -// ----------------------------------------------------------------------- |