parent
f7b2b1f327
commit
c8d3353845
2 changed files with 127 additions and 0 deletions
@ -0,0 +1,113 @@ |
|||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <stdbool.h> |
||||||
|
#include <math.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <assert.h> |
||||||
|
|
||||||
|
#include <GLES3/gl3.h> |
||||||
|
#include <EGL/egl.h> |
||||||
|
#include <EGL/eglext.h> |
||||||
|
|
||||||
|
#include "nanovg.h" |
||||||
|
#define NANOVG_GLES3_IMPLEMENTATION |
||||||
|
#include "nanovg_gl.h" |
||||||
|
#include "nanovg_gl_utils.h" |
||||||
|
|
||||||
|
#include "framebuffer.h" |
||||||
|
#include "spinner.h" |
||||||
|
|
||||||
|
// external resources linked in
|
||||||
|
extern const unsigned char _binary_opensans_semibold_ttf_start[]; |
||||||
|
extern const unsigned char _binary_opensans_semibold_ttf_end[]; |
||||||
|
|
||||||
|
extern const unsigned char _binary_img_spinner_track_png_start[]; |
||||||
|
extern const unsigned char _binary_img_spinner_track_png_end[]; |
||||||
|
|
||||||
|
extern const unsigned char _binary_img_spinner_comma_png_start[]; |
||||||
|
extern const unsigned char _binary_img_spinner_comma_png_end[]; |
||||||
|
|
||||||
|
int spin(int argc, char** argv) { |
||||||
|
int err; |
||||||
|
|
||||||
|
const char* spintext = NULL; |
||||||
|
if (argc == 1) { |
||||||
|
spintext = argv[0]; |
||||||
|
} else 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 = nvgCreateFontMem(vg, "Bold", (unsigned char*)_binary_opensans_semibold_ttf_start, _binary_opensans_semibold_ttf_end-_binary_opensans_semibold_ttf_start, 0); |
||||||
|
assert(font >= 0); |
||||||
|
|
||||||
|
int spinner_img = nvgCreateImageMem(vg, 0, (unsigned char*)_binary_img_spinner_track_png_start, _binary_img_spinner_track_png_end - _binary_img_spinner_track_png_start); |
||||||
|
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 = nvgCreateImageMem(vg, 0, (unsigned char*)_binary_img_spinner_comma_png_start, _binary_img_spinner_comma_png_end - _binary_img_spinner_comma_png_start); |
||||||
|
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; |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
#ifndef COMMON_SPINNER_H |
||||||
|
#define COMMON_SPINNER_H |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
int spin(int argc, char** argv); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue