... | ... |
@@ -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 |
|