Browse code

ui: change the way the fills are done (new method is gentler to the linux intel dri driver). Add some missing const qualifiers.

Dario Rodriguez authored on 08/11/2020 11:59:03
Showing 2 changed files
... ...
@@ -28,16 +28,24 @@
28 28
                             |(((Uint32)(((unsigned char *)rgba)[1]))<<16) \
29 29
                             |(((Uint32)(((unsigned char *)rgba)[2]))<<8)  \
30 30
                             |((Uint32)(((unsigned char *)rgba)[3])))
31
+#define CHARRGBA2TEXARGB8888(rgba) ((((Uint32)(((unsigned char *)rgba)[2]))<<24) \
32
+                            |(((Uint32)(((unsigned char *)rgba)[1]))<<16) \
33
+                            |(((Uint32)(((unsigned char *)rgba)[0]))<<8)  \
34
+                            |((Uint32)(((unsigned char *)rgba)[3])))
31 35
 #else
32 36
 #define CHARRGBA2UINT(rgba) ((((Uint32)(((unsigned char *)rgba)[3]))<<24) \
33 37
                             |(((Uint32)(((unsigned char *)rgba)[2]))<<16) \
34 38
                             |(((Uint32)(((unsigned char *)rgba)[1]))<<8)  \
35 39
                             |((Uint32)(((unsigned char *)rgba)[0])))
40
+#define CHARRGBA2TEXARGB8888(rgba) ((((Uint32)(((unsigned char *)rgba)[3]))<<24) \
41
+                            |(((Uint32)(((unsigned char *)rgba)[0]))<<16) \
42
+                            |(((Uint32)(((unsigned char *)rgba)[1]))<<8)  \
43
+                            |((Uint32)(((unsigned char *)rgba)[2])))
36 44
 #endif
37 45
 
38 46
 
39
-static int reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rgba);
40
-static int reui_triangle(SDL_Surface *dst, int x, int y, int w, int h, char direction, char *rgba);
47
+static int reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, const char *rgba);
48
+static int reui_triangle(SDL_Surface *dst, int x, int y, int w, int h, char direction, const char *rgba);
41 49
 
42 50
 
43 51
 reui_t *
... ...
@@ -50,6 +58,18 @@ reui_init(int fontheight)
50 58
         if((ui=malloc(sizeof(reui_t)))==NULL)
51 59
                 return(NULL);
52 60
         memset(ui,0,sizeof(reui_t));
61
+        /* masks */
62
+#if SDL_BYTEORDER==SDL_BIG_ENDIAN
63
+        ui->rmask=0xff000000;
64
+        ui->gmask=0x00ff0000;
65
+        ui->bmask=0x0000ff00;
66
+        ui->amask=0x000000ff;
67
+#else
68
+        ui->rmask=0x000000ff;
69
+        ui->gmask=0x0000ff00;
70
+        ui->bmask=0x00ff0000;
71
+        ui->amask=0xff000000;
72
+#endif
53 73
         /* video */
54 74
         if(SDL_Init(SDL_INIT_VIDEO)<0
55 75
           || SDL_GetDisplayBounds(0,&screenrect)!=0) {
... ...
@@ -91,7 +111,9 @@ reui_init(int fontheight)
91 111
           || (ui->renderer=SDL_CreateRenderer(ui->win,-1,
92 112
               SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC))==NULL
93 113
           || (ui->scr=SDL_CreateTexture(ui->renderer,SDL_PIXELFORMAT_ARGB8888,
94
-              SDL_TEXTUREACCESS_STREAMING,ui->w,ui->h))==NULL) {
114
+              SDL_TEXTUREACCESS_STREAMING,ui->w,ui->h))==NULL
115
+          || (ui->onepx=SDL_CreateTexture(ui->renderer,SDL_PIXELFORMAT_ARGB8888,
116
+              SDL_TEXTUREACCESS_STATIC,1,1))==NULL) {
95 117
                 reui_free(ui),ui=NULL;
96 118
                 return(NULL);
97 119
         }
... ...
@@ -107,6 +129,8 @@ reui_free(reui_t *ui)
107 129
 {
108 130
         if(ui==NULL)
109 131
                 return;
132
+        if(ui->onepx!=NULL)
133
+                SDL_DestroyTexture(ui->onepx),ui->onepx=NULL;
110 134
         if(ui->font!=NULL)
111 135
                 TTF_CloseFont(ui->font),ui->font=NULL;
112 136
         if(TTF_WasInit())
... ...
@@ -119,6 +143,7 @@ reui_free(reui_t *ui)
119 143
                 SDL_DestroyRenderer(ui->renderer),ui->renderer=NULL;
120 144
         if(ui->win!=NULL)
121 145
                 SDL_DestroyWindow(ui->win),ui->win=NULL;
146
+
122 147
         SDL_Quit();
123 148
         free(ui),ui=NULL;
124 149
 }
... ...
@@ -180,18 +205,18 @@ reui_setfontheight(reui_t *ui, int fontheight)
180 205
 
181 206
 
182 207
 int
183
-reui_fill(reui_t *ui, int x, int y, int w, int h, char *rgba)
208
+reui_fill(reui_t *ui, int x, int y, int w, int h, const char *rgba)
184 209
 {
210
+        SDL_Rect srcrect;
185 211
         SDL_Rect dstrect;
212
+        Uint32 pixels[1];
186 213
         if(ui==NULL || rgba==NULL)
187 214
                 return(-1);
215
+        pixels[0]=CHARRGBA2TEXARGB8888(rgba);
216
+        SDL_UpdateTexture(ui->onepx,NULL,pixels,sizeof(Uint32));
217
+        RECTFILL(srcrect,0,0,1,1);
188 218
         RECTFILL(dstrect,x,y,w,h);
189
-        SDL_SetRenderDrawColor(ui->renderer,
190
-                ((unsigned char *)rgba)[0],
191
-                ((unsigned char *)rgba)[1],
192
-                ((unsigned char *)rgba)[2],
193
-                ((unsigned char *)rgba)[3]);
194
-        SDL_RenderFillRect(ui->renderer, &dstrect);
219
+        SDL_RenderCopy(ui->renderer,ui->onepx,&srcrect,&dstrect);
195 220
         ui->rendererdirty=1;
196 221
         return(0);
197 222
 }
... ...
@@ -220,7 +245,7 @@ reui_present(reui_t *ui)
220 245
 }
221 246
 
222 247
 int
223
-reui_write(reui_t *ui, int x, int y, char *rgba, char *str, int nchar)
248
+reui_write(reui_t *ui, int x, int y, const char *rgba, const char *str, int nchar)
224 249
 {
225 250
         char buf[1024];
226 251
         SDL_Surface *fgsurface;
... ...
@@ -253,7 +278,7 @@ reui_write(reui_t *ui, int x, int y, char *rgba, char *str, int nchar)
253 278
 
254 279
 
255 280
 int
256
-reui_printf(reui_t *ui, int x, int y, char *rgba, char *format, ...)
281
+reui_printf(reui_t *ui, int x, int y, const char *rgba, char *format, ...)
257 282
 {
258 283
         char buf[1024];
259 284
         va_list l;
... ...
@@ -267,7 +292,7 @@ reui_printf(reui_t *ui, int x, int y, char *rgba, char *format, ...)
267 292
 }
268 293
 
269 294
 int
270
-reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbabg, char *str, int nchar)
295
+reui_balloon(reui_t *ui, char direction, int x, int y, const char *rgbafg, const char *rgbabg, const char *str, int nchar)
271 296
 {
272 297
         char buf[1024];
273 298
         SDL_Surface *bgsurface;
... ...
@@ -278,7 +303,6 @@ reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbab
278 303
                      ((unsigned char *)rgbafg)[2],
279 304
                      ((unsigned char *)rgbafg)[3]};
280 305
         SDL_Rect dstrect;
281
-        Uint32 rmask, gmask, bmask, amask;
282 306
         int trianglew,triangleh;
283 307
         int marginw,marginh;
284 308
         int marginoffx,marginoffy;
... ...
@@ -286,17 +310,6 @@ reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbab
286 310
         int offx,offy;
287 311
         if(ui==NULL || rgbafg==NULL || rgbabg==NULL || (str==NULL && nchar!=0))
288 312
                 return(-1);
289
-#if SDL_BYTEORDER==SDL_BIG_ENDIAN
290
-        rmask=0xff000000;
291
-        gmask=0x00ff0000;
292
-        bmask=0x0000ff00;
293
-        amask=0x000000ff;
294
-#else
295
-        rmask=0x000000ff;
296
-        gmask=0x0000ff00;
297
-        bmask=0x00ff0000;
298
-        amask=0xff000000;
299
-#endif
300 313
         if(nchar<sizeof(buf)) {
301 314
                 memcpy(buf,str,nchar);
302 315
                 buf[nchar]='\0';
... ...
@@ -316,7 +329,7 @@ reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbab
316 329
         if((bgsurface=SDL_CreateRGBSurface(0
317 330
           ,(fgsurface->w+marginw*2)+((direction=='w' || direction=='e')?trianglew:0)
318 331
           ,(fgsurface->h+marginh*2)+((direction=='n' || direction=='s')?triangleh:0)
319
-          ,32, rmask, gmask, bmask, amask))==NULL) {
332
+          ,32, ui->rmask, ui->gmask, ui->bmask, ui->amask))==NULL) {
320 333
                 if(fgsurface!=NULL)
321 334
                         SDL_FreeSurface(fgsurface),fgsurface=NULL;
322 335
                 return(-1);
... ...
@@ -396,7 +409,7 @@ reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbab
396 409
  * returns 0 on success
397 410
  */
398 411
 static int
399
-reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rgba)
412
+reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, const char *rgba)
400 413
 {
401 414
         int yd=(dst->pitch)/(dst->format->BytesPerPixel);
402 415
         Uint32 *pixels=NULL;
... ...
@@ -404,6 +417,7 @@ reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rg
404 417
         int rpsqrt2= (int) (r/sqrt(2));
405 418
         int sy,ey,sx,ex;
406 419
         int d,x2m1;
420
+        int o,l;
407 421
         Uint32 color;
408 422
         if(dst==NULL || rgba==NULL || xo<0 || y0<0 || (xo+w)>dst->w || (yo+h)>dst->h)
409 423
                 return(-1); /* sanity check failed */
... ...
@@ -418,13 +432,15 @@ reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rg
418 432
                 return(-1);
419 433
         SDL_LockSurface(dst);
420 434
         pixels=(Uint32*)(dst->pixels);
435
+        l=dst->w*dst->h;
421 436
         sy=(yo-h)*yd;
422 437
         ey=(yo+h)*yd;
423 438
         sx=(xo-w);
424 439
         ex=(xo+w);
425 440
         for(i=sy;i<=ey;i+=yd) {
426 441
                 for(j=sx-r;j<=ex+r;j++) {
427
-                        pixels[i+j]=color;
442
+                        if((o=i+j)>=0 && o<l)
443
+                                pixels[o]=color;
428 444
                 }
429 445
         }
430 446
         d=-r;
... ...
@@ -437,17 +453,22 @@ reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rg
437 453
                         y--;
438 454
                         d-=(y*2);
439 455
                 }
440
-                for(i=sx-x;i<=ex+x;i++)
441
-                        pixels[sy-y*yd+i]=color;
442
-
443
-                for(i=sx-y;i<=ex+y;i++)
444
-                        pixels[sy-x*yd+i]=color;
445
-
446
-                for(i=sx-y;i<=ex+y;i++)
447
-                        pixels[ey+x*yd+i]=color;
448
-
449
-                for(i=sx-x;i<=ex+x;i++)
450
-                        pixels[ey+y*yd+i]=color;
456
+                for(i=sx-x;i<=ex+x;i++) {
457
+                        if((o=(sy-y*yd+i))>=0 && o<l)
458
+                                pixels[o]=color;
459
+                }
460
+                for(i=sx-y;i<=ex+y ;i++) {
461
+                        if((o=(sy-x*yd+i))>=0 && o<l)
462
+                                pixels[o]=color;
463
+                }
464
+                for(i=sx-y;i<=ex+y;i++) {
465
+                        if((o=(ey+x*yd+i))>=0 && o<l)
466
+                                pixels[o]=color;
467
+                }
468
+                for(i=sx-x;i<=ex+x;i++) {
469
+                        if((o=(ey+y*yd+i))>=0 && o<l)
470
+                                pixels[o]=color;
471
+                }
451 472
         }
452 473
         SDL_UnlockSurface(dst);
453 474
         return(0);
... ...
@@ -456,7 +477,7 @@ reui_fillrounded(SDL_Surface *dst, int xo, int yo, int w, int h, int r, char *rg
456 477
 /* end of external code */
457 478
 
458 479
 static int
459
-reui_triangle(SDL_Surface *dst, int x, int y, int w, int h, char direction, char *rgba)
480
+reui_triangle(SDL_Surface *dst, int x, int y, int w, int h, char direction, const char *rgba)
460 481
 {
461 482
         Uint32 color;
462 483
         SDL_Rect dstrect;
... ...
@@ -17,14 +17,17 @@
17 17
 #include "SDL_ttf.h"
18 18
 
19 19
 
20
+
20 21
 typedef struct reui_t {
21 22
         int screenw,screenh;
22 23
         int w,h;
24
+        Uint32 rmask, gmask, bmask, amask;
23 25
         SDL_Window *win;
24 26
         SDL_Renderer *renderer;
25 27
         SDL_Texture *scr;
26 28
         SDL_RWops *fontdata;
27 29
         TTF_Font *font;
30
+        SDL_Texture *onepx;
28 31
         int fontheight;
29 32
         int fontwidth;
30 33
         int scrdirty;
... ...
@@ -37,17 +40,17 @@ void reui_free(reui_t *ui);
37 40
 int reui_title(reui_t *ui, char *titlefilename);
38 41
 int reui_resize(reui_t *ui, int w, int h);
39 42
 int reui_setfontheight(reui_t *ui, int fontheight);
40
-int reui_fill(reui_t *ui, int x, int y, int w, int h, char *rgba);
43
+int reui_fill(reui_t *ui, int x, int y, int w, int h, const char *rgba);
41 44
 int reui_scr2renderer(reui_t *ui, int x, int y, int w, int h);
42 45
 int reui_present(reui_t *ui);
43 46
 
44 47
 
45
-int reui_write(reui_t *ui, int x, int y, char *rgba, char *str, int nchar);
48
+int reui_write(reui_t *ui, int x, int y, const char *rgba, const char *str, int nchar);
46 49
 #ifdef __GNUC__
47
-int reui_printf(reui_t *ui, int x, int y, char *rgba, char *format, ...) __attribute__ ((format (printf, 5, 6)));
50
+int reui_printf(reui_t *ui, int x, int y, const char *rgba, char *format, ...) __attribute__ ((format (printf, 5, 6)));
48 51
 #else
49
-int reui_printf(reui_t *ui, int x, int y, char *rgba, char *format, ...);
52
+int reui_printf(reui_t *ui, int x, int y, const char *rgba, char *format, ...);
50 53
 #endif
51 54
 
52
-int reui_balloon(reui_t *ui, char direction, int x, int y, char *rgbafg, char *rgbabg, char *str, int nchar);
55
+int reui_balloon(reui_t *ui, char direction, int x, int y, const char *rgbafg, const char *rgbabg, const char *str, int nchar);
53 56