You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							2.8 KiB
						
					
					
				| #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;
 | |
| }
 | |
| 
 |