#include #include #include #include #include #include #include #include #include "nanovg.h" #define NANOVG_GLES3_IMPLEMENTATION #include "nanovg_gl.h" #include "nanovg_gl_utils.h" #include "common/framebuffer.h" int main(int argc, char** argv) { int err; const char* spintext = NULL; if (argc >= 2) { spintext = argv[1]; } // spinner int fb_w, fb_h; EGLDisplay display; EGLSurface surface; FramebufferState *fb = framebuffer_init("spinner", 0x00001000, false, &display, &surface, &fb_w, &fb_h); assert(fb); NVGcontext *vg = nvgCreateGLES3(NVG_ANTIALIAS | NVG_STENCIL_STROKES); assert(vg); int font = nvgCreateFont(vg, "Bold", "../../assets/OpenSans-SemiBold.ttf"); assert(font >= 0); int spinner_img = nvgCreateImage(vg, "../../assets/img_spinner_track.png", 0); assert(spinner_img >= 0); int spinner_img_s = 360; int spinner_img_x = ((fb_w/2)-(spinner_img_s/2)); int spinner_img_y = 260; int spinner_img_xc = (fb_w/2); int spinner_img_yc = (fb_h/2)-100; int spinner_comma_img = nvgCreateImage(vg, "../../assets/img_spinner_comma.png", 0); assert(spinner_comma_img >= 0); for (int cnt = 0; ; cnt++) { glClearColor(0.1, 0.1, 0.1, 1.0); glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nvgBeginFrame(vg, fb_w, fb_h, 1.0f); // background nvgBeginPath(vg); NVGpaint bg = nvgLinearGradient(vg, fb_w, 0, fb_w, fb_h, nvgRGBA(0, 0, 0, 175), nvgRGBA(0, 0, 0, 255)); nvgFillPaint(vg, bg); nvgRect(vg, 0, 0, fb_w, fb_h); nvgFill(vg); // spin track nvgSave(vg); nvgTranslate(vg, spinner_img_xc, spinner_img_yc); nvgRotate(vg, (3.75*M_PI * cnt/120.0)); nvgTranslate(vg, -spinner_img_xc, -spinner_img_yc); NVGpaint spinner_imgPaint = nvgImagePattern(vg, spinner_img_x, spinner_img_y, spinner_img_s, spinner_img_s, 0, spinner_img, 0.6f); nvgBeginPath(vg); nvgFillPaint(vg, spinner_imgPaint); nvgRect(vg, spinner_img_x, spinner_img_y, spinner_img_s, spinner_img_s); nvgFill(vg); nvgRestore(vg); // comma NVGpaint comma_imgPaint = nvgImagePattern(vg, spinner_img_x, spinner_img_y, spinner_img_s, spinner_img_s, 0, spinner_comma_img, 1.0f); nvgBeginPath(vg); nvgFillPaint(vg, comma_imgPaint); nvgRect(vg, spinner_img_x, spinner_img_y, spinner_img_s, spinner_img_s); nvgFill(vg); // message if (spintext) { nvgTextAlign(vg, NVG_ALIGN_CENTER | NVG_ALIGN_TOP); nvgFontSize(vg, 96.0f); nvgText(vg, fb_w/2, (fb_h*2/3)+24, spintext, NULL); } nvgEndFrame(vg); eglSwapBuffers(display, surface); assert(glGetError() == GL_NO_ERROR); } return 0; }