14#if defined IGRAPHICS_NANOVG
21#include "IGraphicsNanoVG.h"
24using namespace igraphics;
41 nvgDeleteFramebuffer(mFBO);
53 nvgDeleteFramebuffer(mFBO);
55 mFBO = nvgCreateFramebuffer(vg, w, h, 0);
57 invalidateFBO =
false;
64 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mInitialFBO);
66 nvgBindFramebuffer(mFBO);
67 nvgBeginFrame(vg,
static_cast<float>(w),
static_cast<float>(h),
static_cast<float>(g.
GetScreenScale()));
69 glGetIntegerv(GL_VIEWPORT, vp);
71 glViewport(0, 0, w, h);
73 glScissor(0, 0, w, h);
74 glClearColor(0.f, 0.f, 0.f, 0.f);
75 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
79 auto compileShader = [](GLenum shaderType,
const char *src) {
80 GLuint shader = glCreateShader(shaderType);
81 glShaderSource(shader, 1, &src, NULL);
82 glCompileShader(shader);
85 glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
89 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
90 char *buf = (
char*)malloc(maxLength+1);
91 glGetShaderInfoLog(shader, maxLength, &maxLength, buf);
100 auto createProgram = [](GLuint vertexShader, GLuint fragmentShader) {
101 GLuint program = glCreateProgram();
102 glAttachShader(program, vertexShader);
103 glAttachShader(program, fragmentShader);
104 glBindAttribLocation(program, 0,
"apos");
105 glBindAttribLocation(program, 1,
"acolor");
106 glLinkProgram(program);
110 printf(
"Supported GLSL version is %s.\n", (
char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
112 static const char vs_str[] =
113 "attribute vec4 apos;"
114 "attribute vec4 acolor;"
115 "varying vec4 color;"
118 "gl_Position = apos;"
120 GLuint vs = compileShader(GL_VERTEX_SHADER, vs_str);
122 static const char fs_str[] =
124 "precision lowp float;"
126 "varying vec4 color;"
127 "uniform vec4 color2;"
129 "gl_FragColor = color;"
131 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fs_str);
133 GLuint program = createProgram(vs, fs);
134 glUseProgram(program);
136 static const float posAndColor[] = {
138 -0.6f, -0.6f, 1.0, 0.0, 0.0,
139 0.6f, -0.6f, 0.0, 1.0, 0.0,
140 0.f, 0.6f, 0.0, 0.0, 1.0,
144 glGenBuffers(1, &vbo);
145 glBindBuffer(GL_ARRAY_BUFFER, vbo);
146 glBufferData(GL_ARRAY_BUFFER,
sizeof(posAndColor), posAndColor, GL_STATIC_DRAW);
147 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 20, 0);
148 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 20, (
void*)8);
149 glEnableVertexAttribArray(0);
150 glEnableVertexAttribArray(1);
152 glDrawArrays(GL_TRIANGLES, 0, 3);
154 glViewport(vp[0], vp[1], vp[2], vp[3]);
157 glBindFramebuffer(GL_FRAMEBUFFER, mInitialFBO);
158 nvgBeginFrame(vg,
static_cast<float>(g.
WindowWidth()),
162 APIBitmap apibmp {mFBO->image, w, h, 1, 1.};
163 IBitmap bmp {&apibmp, 1,
false};
170 invalidateFBO =
true;
175 invalidateFBO =
true;
177#elif defined IGRAPHICS_METAL
186 NVGframebuffer* mFBO =
nullptr;
188#ifdef IGRAPHICS_METAL
189 void* mRenderPassDescriptor =
nullptr;
190 void* mRenderPipeline =
nullptr;
194 bool invalidateFBO =
true;
210 g.
DrawText(mText,
"UNSUPPORTED", mRECT);
This file contains the base IControl implementation, along with some base classes for specific types ...
A base class interface for a bitmap abstraction around the different drawing back end bitmap represen...
User-facing bitmap abstraction that you use to manage bitmap data, independant of draw class/platform...
The lowest level base class of an IGraphics control.
virtual void OnResize()
Called when IControl is constructed or resized using SetRect().
bool mMouseIsOver
if mGraphics::mHandleMouseOver = true, this will be true when the mouse is over control.
virtual void OnRescale()
Implement to do something when graphics is scaled globally (e.g.
IControl * SetTooltip(const char *str)
Set a tooltip for the control.
The lowest level base class of an IGraphics context.
virtual void DrawFittedBitmap(const IBitmap &bitmap, const IRECT &bounds, const IBlend *pBlend=0)
Draw a bitmap (raster) image to the graphics context, scaling the image to fit the bounds.
void DrawText(const IText &text, const char *str, const IRECT &bounds, const IBlend *pBlend=0)
Draw some text to the graphics context in a specific rectangle.
virtual void * GetDrawContext()=0
Gets a void pointer to underlying drawing context, for the IGraphics backend See draw class implement...
virtual void DrawDottedRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend=0, float thickness=1.f, float dashLen=2.f)
Draw a dotted rectangle to the graphics context.
int WindowWidth() const
Gets the width of the graphics context including draw scaling.
virtual void FillRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend=0)
Fill a rectangular region of the graphics context with a color.
float GetScreenScale() const
Gets the screen/display scaling factor, e.g.
float GetDrawScale() const
Gets the graphics context scaling factor.
int WindowHeight() const
Gets the height of the graphics context including draw scaling.
A base class for knob/dial controls, to handle mouse action and Sender.
Control to test IGraphicsNanoVG with Metal Shaders.
void Draw(IGraphics &g) override
Draw the control to the graphics context.
Used to manage a rectangular area, independent of draw class/platform.