# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <math.h>
# include <unistd.h>
# include <assert.h>
# include <GLES3/gl3.h>
# include <EGL/eglext.h>
# 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 ;
}