13 #include "IGraphicsNanoVG.h" 16 #if defined IGRAPHICS_GL 18 #if defined IGRAPHICS_GL2 19 #define NANOVG_GL2_IMPLEMENTATION 20 #elif defined IGRAPHICS_GL3 21 #include <OpenGL/gl3.h> 22 #define NANOVG_GL3_IMPLEMENTATION 24 #error Define either IGRAPHICS_GL2 or IGRAPHICS_GL3 for IGRAPHICS_NANOVG with OS_MAC 34 #error NOT IMPLEMENTED 36 #pragma comment(lib, "opengl32.lib") 37 #if defined IGRAPHICS_GL2 38 #define NANOVG_GL2_IMPLEMENTATION 39 #elif defined IGRAPHICS_GL3 40 #define NANOVG_GL3_IMPLEMENTATION 42 #error Define either IGRAPHICS_GL2 or IGRAPHICS_GL3 when using IGRAPHICS_GL and IGRAPHICS_NANOVG with OS_WIN 44 #elif defined OS_LINUX 45 #error NOT IMPLEMENTED 47 #if defined IGRAPHICS_GLES2 48 #define NANOVG_GLES2_IMPLEMENTATION 49 #elif defined IGRAPHICS_GLES3 50 #define NANOVG_GLES3_IMPLEMENTATION 52 #error Define either IGRAPHICS_GLES2 or IGRAPHICS_GLES3 when using IGRAPHICS_GL and IGRAPHICS_NANOVG with OS_WEB 55 #include "nanovg_gl.h" 56 #include "nanovg_gl_utils.h" 57 #elif defined IGRAPHICS_METAL 58 #include "nanovg_mtl.h" 61 #import <Metal/Metal.h> 64 #error you must define either IGRAPHICS_GL2, IGRAPHICS_GLES2 etc or IGRAPHICS_METAL when using IGRAPHICS_NANOVG 70 using namespace iplug;
71 using namespace igraphics;
73 #pragma mark - Private Classes and Structs 78 Bitmap(NVGcontext* pContext,
const char* path,
double sourceScale,
int nvgImageID,
bool shared =
false);
79 Bitmap(
IGraphicsNanoVG* pGraphics, NVGcontext* pContext,
int width,
int height,
int scale,
float drawScale);
80 Bitmap(NVGcontext* pContext,
int width,
int height,
const uint8_t* pData,
int scale,
float drawScale);
82 NVGframebuffer* GetFBO()
const {
return mFBO; }
86 NVGframebuffer* mFBO =
nullptr;
87 bool mSharedTexture =
false;
90 IGraphicsNanoVG::Bitmap::Bitmap(NVGcontext* pContext,
const char* path,
double sourceScale,
int nvgImageID,
bool shared)
92 assert(nvgImageID > 0);
95 mSharedTexture = shared;
97 nvgImageSize(mVG, nvgImageID, &w, &h);
99 SetBitmap(nvgImageID, w, h, sourceScale, 1.f);
102 IGraphicsNanoVG::Bitmap::Bitmap(
IGraphicsNanoVG* pGraphics, NVGcontext* pContext,
int width,
int height,
int scale,
float drawScale)
104 mGraphics = pGraphics;
106 mFBO = nvgCreateFramebuffer(pContext, width, height, 0);
108 nvgBindFramebuffer(mFBO);
110 #ifdef IGRAPHICS_METAL 111 mnvgClearWithColor(mVG, nvgRGBAf(0, 0, 0, 0));
113 glViewport(0, 0, width, height);
114 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
115 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
117 nvgBeginFrame(mVG, width, height, 1.f);
120 SetBitmap(mFBO->image, width, height, scale, drawScale);
123 IGraphicsNanoVG::Bitmap::Bitmap(NVGcontext* pContext,
int width,
int height,
const uint8_t* pData,
int scale,
float drawScale)
125 int idx = nvgCreateImageRGBA(pContext, width, height, 0, pData);
127 SetBitmap(idx, width, height, scale, drawScale);
130 IGraphicsNanoVG::Bitmap::~Bitmap()
135 mGraphics->DeleteFBO(mFBO);
137 nvgDeleteImage(mVG, GetBitmap());
142 static StaticStorage<IFontData> sFontCache;
144 extern std::map<std::string, MTLTexturePtr> gTextureMap;
147 static void nvgReadPixels(NVGcontext* pContext,
int image,
int x,
int y,
int width,
int height,
void* pData)
149 #if defined(IGRAPHICS_GL) 150 glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pData);
151 #elif defined(IGRAPHICS_METAL) 152 mnvgReadPixels(pContext, image, x, y, width, height, pData);
156 #pragma mark - Utilities 158 BEGIN_IPLUG_NAMESPACE
159 BEGIN_IGRAPHICS_NAMESPACE
161 NVGcolor NanoVGColor(
const IColor& color,
const IBlend* pBlend)
164 c.r = (float) color.R / 255.0f;
165 c.g = (
float) color.G / 255.0f;
166 c.b = (float) color.B / 255.0f;
171 void NanoVGRect(NVGcontext* pContext,
const IRECT& r)
173 nvgRect(pContext, r.
L, r.
T, r.
W(), r.
H());
176 void NanoVGSetBlendMode(NVGcontext* pContext,
const IBlend* pBlend)
180 nvgGlobalCompositeOperation(pContext, NVG_SOURCE_OVER);
184 switch (pBlend->mMethod)
186 case EBlend::SrcOver: nvgGlobalCompositeOperation(pContext, NVG_SOURCE_OVER);
break;
187 case EBlend::SrcIn: nvgGlobalCompositeOperation(pContext, NVG_SOURCE_IN);
break;
188 case EBlend::SrcOut: nvgGlobalCompositeOperation(pContext, NVG_SOURCE_OUT);
break;
189 case EBlend::SrcAtop: nvgGlobalCompositeOperation(pContext, NVG_ATOP);
break;
190 case EBlend::DstOver: nvgGlobalCompositeOperation(pContext, NVG_DESTINATION_OVER);
break;
191 case EBlend::DstIn: nvgGlobalCompositeOperation(pContext, NVG_DESTINATION_IN);
break;
192 case EBlend::DstOut: nvgGlobalCompositeOperation(pContext, NVG_DESTINATION_OUT);
break;
193 case EBlend::DstAtop: nvgGlobalCompositeOperation(pContext, NVG_DESTINATION_ATOP);
break;
194 case EBlend::Add: nvgGlobalCompositeBlendFunc(pContext, NVG_SRC_ALPHA, NVG_DST_ALPHA);
break;
195 case EBlend::XOR: nvgGlobalCompositeOperation(pContext, NVG_XOR);
break;
199 NVGpaint NanoVGPaint(NVGcontext* pContext,
const IPattern& pattern,
const IBlend* pBlend)
201 assert(pattern.
NStops() > 0);
205 NVGcolor icol = NanoVGColor(pattern.
GetStop(0).mColor, pBlend);
206 NVGcolor ocol = NanoVGColor(pattern.
GetStop(pattern.
NStops() - 1).mColor, pBlend);
212 if (pattern.mType == EPatternType::Radial)
214 return nvgRadialGradient(pContext, s[0], s[1], inverse.mXX * pattern.
GetStop(0).mOffset, inverse.mXX, icol, ocol);
220 return nvgLinearGradient(pContext, s[0], s[1], e[0], e[1], icol, ocol);
224 END_IGRAPHICS_NAMESPACE
229 IGraphicsNanoVG::IGraphicsNanoVG(
IGEditorDelegate& dlg,
int w,
int h,
int fps,
float scale)
232 DBGMSG(
"IGraphics NanoVG @ %i FPS\n", fps);
233 StaticStorage<IFontData>::Accessor storage(sFontCache);
237 IGraphicsNanoVG::~IGraphicsNanoVG()
239 StaticStorage<IFontData>::Accessor storage(sFontCache);
246 #if defined IGRAPHICS_METAL 247 return "NanoVG | Metal";
250 return "NanoVG | WebGL";
252 #if defined IGRAPHICS_GL2 253 return "NanoVG | GL2";
254 #elif defined IGRAPHICS_GL3 255 return "NanoVG | GL3";
256 #elif defined IGRAPHICS_GLES2 257 return "NanoVG | GLES2";
258 #elif defined IGRAPHICS_GLES3 259 return "NanoVG | GLES3";
269 return (strstr(extLower,
"png") !=
nullptr) || (strstr(extLower,
"jpg") !=
nullptr) || (strstr(extLower,
"jpeg") !=
nullptr);
274 if (targetScale == 0)
275 targetScale = GetRoundedScreenScale();
278 StaticStorage<APIBitmap>::Accessor storage(mBitmapCache);
279 APIBitmap* pAPIBitmap = storage.Find(name, targetScale);
284 const char* ext = name + strlen(name) - 1;
285 while (ext >= name && *ext !=
'.') --ext;
288 WDL_String fullPathOrResourceID;
290 EResourceLocation resourceFound = SearchImageResource(name, ext, fullPathOrResourceID, targetScale, sourceScale);
292 bool bitmapTypeSupported = BitmapExtSupported(ext);
294 if(resourceFound == EResourceLocation::kNotFound || !bitmapTypeSupported)
296 assert(0 &&
"Bitmap not found");
300 pAPIBitmap = LoadAPIBitmap(fullPathOrResourceID.Get(), sourceScale, resourceFound, ext);
302 storage.Add(pAPIBitmap, name, sourceScale);
304 assert(pAPIBitmap &&
"Bitmap not loaded");
307 return IBitmap(pAPIBitmap, nStates, framesAreHorizontal, name);
313 int nvgImageFlags = 0;
316 if (location == EResourceLocation::kPreloadedTexture)
318 idx = mnvgCreateImageFromHandle(mVG, gTextureMap[fileNameOrResID], nvgImageFlags);
324 if (location == EResourceLocation::kWinBinary)
326 const void* pResData =
nullptr;
329 pResData =
LoadWinResource(fileNameOrResID, ext, size, GetWinModuleHandle());
334 idx = nvgCreateImageMem(mVG, nvgImageFlags, (
unsigned char*) pResData, size);
335 DeactivateGLContext();
340 if (location == EResourceLocation::kAbsolutePath)
343 idx = nvgCreateImage(mVG, fileNameOrResID, nvgImageFlags);
344 DeactivateGLContext();
347 return new Bitmap(mVG, fileNameOrResID, scale, idx, location == EResourceLocation::kPreloadedTexture);
352 StaticStorage<APIBitmap>::Accessor storage(mBitmapCache);
353 APIBitmap* pBitmap = storage.Find(name, scale);
358 int nvgImageFlags = 0;
361 idx = idx = nvgCreateImageMem(mVG, nvgImageFlags, (
unsigned char*)pData, dataSize);
362 DeactivateGLContext();
364 pBitmap =
new Bitmap(mVG, name, scale, idx,
false);
366 storage.Add(pBitmap, name, scale);
379 APIBitmap* pAPIBitmap =
new Bitmap(
this, mVG, width, height, scale, drawScale);
383 nvgBindFramebuffer(mMainFrameBuffer);
384 nvgBeginFrame(mVG, WindowWidth(), WindowHeight(), GetScreenScale());
392 const APIBitmap* pBitmap = layer->GetAPIBitmap();
397 if (data.GetSize() >= size)
399 PushLayer(layer.get());
407 const APIBitmap* pBitmap = layer->GetAPIBitmap();
410 int size = width * height * 4;
412 if (mask.GetSize() >= size)
414 if (!shadow.mDrawForeground)
416 PushLayer(layer.get());
417 nvgGlobalCompositeBlendFunc(mVG, NVG_ZERO, NVG_ZERO);
418 PathRect(layer->Bounds());
419 nvgFillColor(mVG, NanoVGColor(COLOR_TRANSPARENT));
424 IRECT bounds(layer->Bounds());
428 IBitmap tempLayerBitmap(shadowBitmap, 1,
false);
429 IBitmap maskBitmap(&maskRawBitmap, 1,
false);
430 ILayer shadowLayer(shadowBitmap, layer->Bounds(),
nullptr,
IRECT());
433 PushLayer(layer.get());
434 PushLayer(&shadowLayer);
435 DrawBitmap(maskBitmap, bounds, 0, 0,
nullptr);
436 IBlend blend1(EBlend::SrcIn, 1.0);
437 PathRect(layer->Bounds());
438 PathTransformTranslate(-shadow.mXOffset, -shadow.mYOffset);
441 IBlend blend2(EBlend::DstOver, shadow.mOpacity);
442 bounds.Translate(shadow.mXOffset, shadow.mYOffset);
443 DrawBitmap(tempLayerBitmap, bounds, 0, 0, &blend2);
445 PathTransformRestore();
451 #if defined IGRAPHICS_METAL 452 mVG = nvgCreateContext(pContext, NVG_ANTIALIAS | NVG_TRIPLE_BUFFER);
454 mVG = nvgCreateContext(NVG_ANTIALIAS );
458 DBGMSG(
"Could not init nanovg.\n");
466 StaticStorage<APIBitmap>::Accessor storage(mBitmapCache);
469 if(mMainFrameBuffer !=
nullptr)
470 nvgDeleteFramebuffer(mMainFrameBuffer);
472 mMainFrameBuffer =
nullptr;
475 nvgDeleteContext(mVG);
482 if (mMainFrameBuffer !=
nullptr)
483 nvgDeleteFramebuffer(mMainFrameBuffer);
487 mMainFrameBuffer = nvgCreateFramebuffer(mVG, WindowWidth() * GetScreenScale(), WindowHeight() * GetScreenScale(), 0);
489 if (mMainFrameBuffer ==
nullptr)
490 DBGMSG(
"Could not init FBO.\n");
500 glViewport(0, 0, WindowWidth() * GetScreenScale(), WindowHeight() * GetScreenScale());
501 glClearColor(0.f, 0.f, 0.f, 0.f);
502 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
504 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mInitialFBO);
508 nvgBindFramebuffer(mMainFrameBuffer);
509 nvgBeginFrame(mVG, WindowWidth(), WindowHeight(), GetScreenScale());
515 nvgBindFramebuffer(
nullptr);
516 nvgBeginFrame(mVG, WindowWidth(), WindowHeight(), GetScreenScale());
518 NVGpaint img = nvgImagePattern(mVG, 0, 0, WindowWidth(), WindowHeight(), 0, mMainFrameBuffer->image, 1.0f);
521 nvgResetTransform(mVG);
522 nvgTranslate(mVG, mXTranslation, mYTranslation);
524 nvgRect(mVG, 0, 0, WindowWidth(), WindowHeight());
525 nvgFillPaint(mVG, img);
529 #if defined OS_MAC && defined IGRAPHICS_GL 530 glBindFramebuffer(GL_FRAMEBUFFER, mInitialFBO);
535 #if defined IGRAPHICS_IMGUI && defined IGRAPHICS_GL 537 mImGuiRenderer->NewFrame();
554 nvgTransformScale(imgPaint.xform, scale, scale);
556 imgPaint.xform[4] = dest.
L - srcX;
557 imgPaint.xform[5] = dest.
T - srcY;
558 imgPaint.extent[0] = bitmap.
W() * bitmap.
GetScale();
559 imgPaint.extent[1] = bitmap.
H() * bitmap.
GetScale();
560 imgPaint.image = pAPIBitmap->
GetBitmap();
561 imgPaint.radius = imgPaint.feather = 0.f;
562 imgPaint.innerColor = imgPaint.outerColor = nvgRGBAf(1, 1, 1,
BlendWeight(pBlend));
567 nvgRect(mVG, dest.
L, dest.
T, dest.
W(), dest.
H());
568 nvgFillPaint(mVG, imgPaint);
569 NanoVGSetBlendMode(mVG, pBlend);
571 nvgGlobalCompositeOperation(mVG, NVG_SOURCE_OVER);
587 nvgArc(mVG, cx, cy, r, DegToRad(a1 - 90.f), DegToRad(a2 - 90.f), winding == EWinding::CW ? NVG_CW : NVG_CCW);
592 nvgMoveTo(mVG, x, y);
597 nvgLineTo(mVG, x, y);
602 nvgBezierTo(mVG, c1x, c1y, c2x, c2y, x2, y2);
607 nvgQuadTo(mVG, cx, cy, x2, y2);
612 nvgPathWinding(mVG, clockwise ? NVG_CW : NVG_CCW);
620 void IGraphicsNanoVG::PrepareAndMeasureText(
const IText& text,
const char* str,
IRECT& r,
double& x,
double & y)
const 624 assert(nvgFindFont(mVG, text.mFont) != -1 &&
"No font found - did you forget to load it?");
627 nvgFontSize(mVG, text.mSize);
628 nvgFontFace(mVG, text.mFont);
634 case EAlign::Near: align = NVG_ALIGN_LEFT; x = r.
L;
break;
635 case EAlign::Center: align = NVG_ALIGN_CENTER; x = r.
MW();
break;
636 case EAlign::Far: align = NVG_ALIGN_RIGHT; x = r.
R;
break;
639 switch (text.mVAlign)
641 case EVAlign::Top: align |= NVG_ALIGN_TOP; y = r.
T;
break;
642 case EVAlign::Middle: align |= NVG_ALIGN_MIDDLE; y = r.
MH();
break;
643 case EVAlign::Bottom: align |= NVG_ALIGN_BOTTOM; y = r.
B;
break;
646 nvgTextAlign(mVG, align);
647 nvgTextBounds(mVG, x, y, str, NULL, fbounds);
649 r =
IRECT(fbounds[0], fbounds[1], fbounds[2], fbounds[3]);
656 PrepareAndMeasureText(text, str, bounds, x, y);
657 DoMeasureTextRotation(text, r, bounds);
664 IRECT measured = bounds;
667 PrepareAndMeasureText(text, str, measured, x, y);
669 DoTextRotation(text, bounds, measured);
670 nvgFillColor(mVG, NanoVGColor(text.mFGColor, pBlend));
671 NanoVGSetBlendMode(mVG, pBlend);
672 nvgText(mVG, x, y, str, NULL);
673 nvgGlobalCompositeOperation(mVG, NVG_SOURCE_OVER);
674 PathTransformRestore();
680 switch (options.mCapOption)
682 case ELineCap::Butt: nvgLineCap(mVG, NVG_BUTT);
break;
683 case ELineCap::Round: nvgLineCap(mVG, NVG_ROUND);
break;
684 case ELineCap::Square: nvgLineCap(mVG, NVG_SQUARE);
break;
687 switch (options.mJoinOption)
689 case ELineJoin::Miter: nvgLineJoin(mVG, NVG_MITER);
break;
690 case ELineJoin::Round: nvgLineJoin(mVG, NVG_ROUND);
break;
691 case ELineJoin::Bevel: nvgLineJoin(mVG, NVG_BEVEL);
break;
694 nvgMiterLimit(mVG, options.mMiterLimit);
695 nvgStrokeWidth(mVG, thickness);
698 if (pattern.mType == EPatternType::Solid)
699 nvgStrokeColor(mVG, NanoVGColor(pattern.
GetStop(0).mColor, pBlend));
701 nvgStrokePaint(mVG, NanoVGPaint(mVG, pattern, pBlend));
703 nvgPathWinding(mVG, NVG_CCW);
704 NanoVGSetBlendMode(mVG, pBlend);
706 nvgGlobalCompositeOperation(mVG, NVG_SOURCE_OVER);
708 if (!options.mPreserve)
714 switch(options.mFillRule)
719 case EFillRule::Winding:
720 nvgPathWinding(mVG, NVG_CCW);
722 case EFillRule::EvenOdd:
723 nvgPathWinding(mVG, NVG_CW);
725 case EFillRule::Preserve:
731 if (pattern.mType == EPatternType::Solid)
732 nvgFillColor(mVG, NanoVGColor(pattern.
GetStop(0).mColor, pBlend));
734 nvgFillPaint(mVG, NanoVGPaint(mVG, pattern, pBlend));
736 NanoVGSetBlendMode(mVG, pBlend);
738 nvgGlobalCompositeOperation(mVG, NVG_SOURCE_OVER);
740 if (!options.mPreserve)
746 StaticStorage<IFontData>::Accessor storage(sFontCache);
747 IFontData* cached = storage.Find(fontID);
751 nvgCreateFontFaceMem(mVG, fontID, cached->Get(), cached->GetSize(), cached->GetFaceIdx(), 0);
755 IFontDataPtr data = font->GetFontData();
757 if (data->IsValid() && nvgCreateFontFaceMem(mVG, fontID, data->Get(), data->GetSize(), data->GetFaceIdx(), 0) != -1)
759 storage.Add(data.release(), fontID);
766 void IGraphicsNanoVG::UpdateLayer()
772 glViewport(0, 0, WindowWidth() * GetScreenScale(), WindowHeight() * GetScreenScale());
774 nvgBindFramebuffer(mMainFrameBuffer);
775 nvgBeginFrame(mVG, WindowWidth(), WindowHeight(), GetScreenScale());
781 const double scale = GetBackingPixelScale();
782 glViewport(0, 0, mLayers.top()->Bounds().W() * scale, mLayers.top()->Bounds().H() * scale);
784 nvgBindFramebuffer(dynamic_cast<const Bitmap*>(mLayers.top()->GetAPIBitmap())->GetFBO());
785 nvgBeginFrame(mVG, mLayers.top()->Bounds().W() * GetDrawScale(), mLayers.top()->Bounds().H() * GetDrawScale(), GetScreenScale());
789 void IGraphicsNanoVG::PathTransformSetMatrix(
const IMatrix& m)
791 double xTranslate = 0.0;
792 double yTranslate = 0.0;
794 if (!mLayers.empty())
796 IRECT bounds = mLayers.top()->Bounds();
798 xTranslate = -bounds.
L;
799 yTranslate = -bounds.
T;
802 nvgResetTransform(mVG);
803 nvgScale(mVG, GetDrawScale(), GetDrawScale());
804 nvgTranslate(mVG, xTranslate, yTranslate);
805 nvgTransform(mVG, m.mXX, m.mYX, m.mXY, m.mYY, m.mTX, m.mTY);
808 void IGraphicsNanoVG::SetClipRegion(
const IRECT& r)
810 nvgScissor(mVG, r.
L, r.
T, r.
W(), r.
H());
815 const float xd = x1 - x2;
816 const float yd = y1 - y2;
817 const float len = std::sqrt(xd * xd + yd * yd);
819 const float segs = std::round(len / dashLen);
820 const float incr = 1.f / segs;
827 for (
int i = 1; i < static_cast<int>(segs); i+=2)
829 float progress = incr *
static_cast<float>(i);
831 float xe = x1 + progress * (x2 - x1);
832 float ye = y1 + progress * (y2 - y1);
838 xs = x1 + progress * (x2 - x1);
839 ys = y1 + progress * (y2 - y1);
849 const int xsegs =
static_cast<int>(std::ceil(bounds.
W() / (dashLen * 2.f)));
850 const int ysegs =
static_cast<int>(std::ceil(bounds.
H() / (dashLen * 2.f)));
860 for(
int j = 0; j < 2; j++)
862 for (
int i = 0; i < xsegs; i++)
864 x2 =
Clip(x1 + dashLen, bounds.
L, bounds.
R);
866 x1 =
Clip(x2 + dashLen, bounds.
L, bounds.
R);
872 for (
int i = 0; i < ysegs; i++)
874 y2 =
Clip(y1 + dashLen, bounds.
T, bounds.
B);
876 y1 =
Clip(y2 + dashLen, bounds.
T, bounds.
B);
888 void IGraphicsNanoVG::DeleteFBO(NVGframebuffer* pBuffer)
891 nvgDeleteFramebuffer(pBuffer);
894 WDL_MutexLock lock(&mFBOMutex);
895 mFBOStack.push(pBuffer);
899 void IGraphicsNanoVG::ClearFBOStack()
901 WDL_MutexLock lock(&mFBOMutex);
902 while (!mFBOStack.empty())
904 nvgDeleteFramebuffer(mFBOStack.top());
911 NVGpaint shadowPaint = nvgBoxGradient(mVG, innerBounds.
L + xyDrop, innerBounds.
T + xyDrop, innerBounds.
W(), innerBounds.
H(), roundness, blur, NanoVGColor(COLOR_BLACK_DROP_SHADOW, pBlend), NanoVGColor(COLOR_TRANSPARENT,
nullptr));
913 nvgRect(mVG, outerBounds.
L, outerBounds.
T, outerBounds.
W(), outerBounds.
H());
914 nvgFillPaint(mVG, shadowPaint);
915 nvgGlobalCompositeOperation(mVG, NVG_SOURCE_OVER);
void DoDrawText(const IText &text, const char *str, const IRECT &bounds, const IBlend *pBlend) override
IColor GetPoint(int x, int y) override
Get the color at an X, Y location in the graphics context.
void DrawDottedLine(const IColor &color, float x1, float y1, float x2, float y2, const IBlend *pBlend, float thickness, float dashLen) override
Draw a dotted line to the graphics context.
Used to manage a rectangular area, independent of draw class/platform.
void PathCubicBezierTo(float c1x, float c1y, float c2x, float c2y, float x2, float y2) override
Add a cubic bezier to the current path from the current point to the specified location.
void PathFill(const IPattern &pattern, const IFillOptions &options, const IBlend *pBlend) override
Fill the current current path.
void DrawResize() override
Used to manage composite/blend operations, independent of draw class/platform.
User-facing bitmap abstraction that you use to manage bitmap data, independant of draw class/platform...
Used to manage fill behaviour for path based drawing back ends.
const char * GetDrawingAPIStr() override
IMatrix & Invert()
Changes the matrix to be the inverse of its original value.
A Text entry widget drawn by IGraphics to optionally override platform text entries.
virtual void BeginFrame()
Called at the beginning of drawing.
const void * LoadWinResource(const char *resID, const char *type, int &sizeInBytes, void *pHInstance)
Load a resource from the binary (windows only).
void DrawDottedRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend, float thickness, float dashLen) override
Draw a dotted rectangle to the graphics context.
void EndFrame() override
Called by some drawing API classes to finally blit the draw bitmap onto the screen or perform other c...
Used to manage color data, independent of draw class/platform.
Used to manage stroke behaviour for path based drawing back ends.
void PathQuadraticBezierTo(float cx, float cy, float x2, float y2) override
Add a quadratic bezier to the current path from the current point to the specified location...
void PathArc(float cx, float cy, float r, float a1, float a2, EWinding winding) override
Add an arc to the current path.
float DoMeasureText(const IText &text, const char *str, IRECT &bounds) const override
float R
Right side of the rectangle (X + W)
void PathLineTo(float x, float y) override
Add a line to the current path from the current point to the specified location.
BitmapData GetBitmap() const
An editor delegate base class for a SOMETHING that uses IGraphics for it's UI.
void OnViewInitialized(void *pContext) override
Called after platform view initialization, so that drawing classes can e.g.
IText is used to manage font and text/text entry style for a piece of text on the UI...
const IColorStop & GetStop(int idx) const
Get the IColorStop at a particular index (will crash if out of bounds)
void ApplyShadowMask(ILayerPtr &layer, RawBitmapData &mask, const IShadow &shadow) override
Implemented by a graphics backend to apply a calculated shadow mask to a layer, according to the shad...
float GetDrawScale() const
APIBitmap * CreateAPIBitmap(int width, int height, int scale, double drawScale, bool cacheable=false) override
Creates a new API bitmap, either in memory or as a GPU texture.
The lowest level base class of an IGraphics context.
float BlendWeight(const IBlend *pBlend)
Helper function to extract the blend weight value from an IBlend ptr if it is valid.
Used to specify properties of a drop-shadow to a layer.
BEGIN_IPLUG_NAMESPACE T Clip(T x, T lo, T hi)
Clips the value x between lo and hi.
void PathClose() override
Close the path that is being specified.
void TransformPoint(double &x, double &y, double x0, double y0) const
Transforms the point x, y.
void OnViewDestroyed() override
Called after a platform view is destroyed, so that drawing classes can e.g.
void DrawBitmap(const IBitmap &bitmap, const IRECT &dest, int srcX, int srcY, const IBlend *pBlend) override
Draw a bitmap (raster) image to the graphics context.
IBitmap LoadBitmap(const char *name, int nStates, bool framesAreHorizontal, int targetScale) override
Load a bitmap image from disk or from windows resource.
A base class interface for a bitmap abstraction around the different drawing back end bitmap represen...
float L
Left side of the rectangle (X)
void PathSetWinding(bool clockwise) override
NanoVG only.
void GetLayerBitmapData(const ILayerPtr &layer, RawBitmapData &data) override
Get the contents of a layers pixels as bitmap data.
APIBitmap * LoadAPIBitmap(const char *fileNameOrResID, int scale, EResourceLocation location, const char *ext) override
Drawing API method to load a bitmap, called internally.
void PathStroke(const IPattern &pattern, float thickness, const IStrokeOptions &options, const IBlend *pBlend) override
Stroke the current current path.
void PathMoveTo(float x, float y) override
Move the current point in the current path.
void DrawFastDropShadow(const IRECT &innerBounds, const IRECT &outerBounds, float xyDrop=5.f, float roundness=0.f, float blur=10.f, IBlend *pBlend=nullptr) override
NanoVG only.
static void ToLower(char *cDest, const char *cSrc)
IGraphics draw class using NanoVG.
bool BitmapExtSupported(const char *ext) override
Checks a file extension and reports whether this drawing API supports loading that extension...
void PathClear() override
Clear the stack of path drawing commands.
APIBitmap * GetAPIBitmap() const
std::unique_ptr< ILayer > ILayerPtr
ILayerPtr is a managed pointer for transferring the ownership of layers.
Used to store pattern information for gradients.
bool LoadAPIFont(const char *fontID, const PlatformFontPtr &font) override
Drawing API method to load a font from a PlatformFontPtr, called internally.
Used to store transformation matrices.
void BeginFrame() override
Called at the beginning of drawing.
float T
Top of the rectangle (Y)
float B
Bottom of the rectangle (Y + H)
An abstraction that is used to store a temporary raster image/framebuffer.