Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2018
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1. #ifndef DEBUG_SCREEN_H
  2. #define DEBUG_SCREEN_H
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <inttypes.h>
  8. #include <vita2d.h>
  9.  
  10. typedef struct PsvDebugScreenFont {
  11. unsigned char* glyphs, width, height, first, last, size_w, size_h;
  12. } PsvDebugScreenFont;
  13.  
  14. #include "debugScreenFont.c"
  15. #define FONT_SIZE (16)
  16. #define SCREEN_WIDTH (960)
  17. #define SCREEN_HEIGHT (544)
  18. #define SCREEN_FB_WIDTH (960)
  19. #define SCREEN_FB_SIZE (2 * 1024 * 1024) //Must be 256KB aligned
  20. #ifndef SCREEN_TAB_SIZE /* this allow easy overriding */
  21. #define SCREEN_TAB_SIZE (8)
  22. #endif
  23. #define SCREEN_TAB_W ((FONT_SIZE) * SCREEN_TAB_SIZE)
  24. #define F psvDebugScreenFont
  25.  
  26. #define FROM_GREY(c ) ((((c)*9) <<16) | (((c)*9) <<8) | ((c)*9))
  27. #define FROM_3BIT(c,dark) (((!!((c)&4))<<23) | ((!!((c)&2))<<15) | ((!!((c)&1))<<7) | (dark ? 0 : 0x7F7F7F))
  28. #define FROM_6BIT(c ) ((((c)%6)*(51<<16)) | ((((c)/6)%6)*(51<<8)) | ((((c)/36)%6)*51))
  29. #define FROM_FULL(r,g,b ) ((r<<16) | (g<<8) | (b))
  30. #define CLEARSCRN(H,toH,W,toW) for(int h = H; h < toH; h++)for(int w = W; w < toW; w++)((uint32_t*)base)[h*SCREEN_FB_WIDTH + w] = colorBg;
  31.  
  32. static int coordX, savedX, coordY, savedY;
  33. static uint32_t defaultFg = 0xFFFFFFFF, colorFg = 0xFFFFFFFF;
  34. static uint32_t defaultBg = 0xFF000000, colorBg = 0xFF000000;
  35.  
  36.  
  37. #ifdef __vita__
  38. #include <psp2/display.h>
  39. #include <psp2/kernel/sysmem.h>
  40. #include <psp2/kernel/threadmgr.h>
  41. static void* base; // pointer to frame buffer
  42. #else
  43. static char base[SCREEN_FB_WIDTH * SCREEN_HEIGHT * 4];
  44. #endif
  45. static vita2d_pgf *pgf;
  46.  
  47. static size_t psvDebugScreenEscape(const unsigned char *str) {
  48. for(unsigned i = 0, argc = 0, arg[32] = {0}; argc < (sizeof(arg)/sizeof(*arg)) && str[i]!='\0'; i++)
  49. switch(str[i]) {
  50. case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
  51. arg[argc]=(arg[argc]*10) + (str[i] - '0');continue;
  52. case ';': argc++;continue;
  53. case 's': savedX = coordX; savedY = coordY; return i;
  54. case 'u': coordX = savedX; coordY = savedY; return i;
  55. case 'A': coordY -= arg[0] * (FONT_SIZE); return i;
  56. case 'B': coordY += arg[0] * (FONT_SIZE); return i;
  57. case 'C': coordX += arg[0] * (FONT_SIZE); return i;
  58. case 'D': coordX -= arg[0] * (FONT_SIZE); return i;
  59. case 'E': coordY += arg[0] * (FONT_SIZE); coordX = 0; return i;
  60. case 'F': coordY -= arg[0] * (FONT_SIZE); coordX = 0; return i;
  61. case 'G': coordX = (arg[0]-1) * (FONT_SIZE); return i;
  62. case 'H':
  63. case 'f': coordY = (arg[0]-1) * (FONT_SIZE);
  64. coordX = (arg[1]-1) * (FONT_SIZE); return i;
  65. case 'J': //clear part of (J=screen, K=Line) so J code reuse part of K
  66. case 'K': if(arg[0]==0)CLEARSCRN(coordY, coordY + FONT_SIZE, coordX, SCREEN_WIDTH);//from curosr to end
  67. if(arg[0]==1)CLEARSCRN(coordY, coordY + FONT_SIZE, 0, coordX);//from begining to cursor
  68. if(arg[0]==2)CLEARSCRN(coordY, coordY + FONT_SIZE, 0, SCREEN_WIDTH);//whole line
  69. if(str[i]=='K')return i;
  70. if(arg[0]==0)CLEARSCRN(coordY, SCREEN_HEIGHT, 0, SCREEN_WIDTH);
  71. if(arg[0]==1)CLEARSCRN(0, coordY, 0, SCREEN_WIDTH);
  72. if(arg[0]==2)CLEARSCRN(0, SCREEN_HEIGHT, 0, SCREEN_WIDTH);
  73. return i;
  74. case 'm':// Color
  75. if(!arg[0]) {arg[0] = 39;arg[1] = 49;argc = 1;}//no/0 args == reset BG + FG
  76. for(unsigned c = 0; c <= argc; c++) {
  77. uint32_t unit = arg[c] % 10, mode = arg[c] / 10, *color = mode&1 ? &colorFg : &colorBg;
  78. if (arg[c]==1)colorFg|=0x808080;
  79. if (arg[c]==2)colorFg&=0x7F7F7F;
  80. if (mode!=3 && mode!=4 && mode!=9 && mode!=10)continue;//skip unsported modes
  81. if (unit == 9){ // reset FG or BG
  82. *color = mode&1 ? defaultFg : defaultBg;
  83. } else if ((unit==8) && (arg[c+1]==5)) { // 8bit : [0-15][16-231][232-256] color map
  84. c+=2;*color = arg[c]<=15?FROM_3BIT(arg[c],mode<9):arg[c]>=232?FROM_GREY(arg[c]-232):FROM_6BIT(arg[c]-16);
  85. } else if ((unit==8) && (arg[c+1]==2)) { // 24b color space
  86. *color = FROM_FULL(arg[c+4], arg[c+3], arg[c+2]);c+=4;
  87. } else *color = FROM_3BIT(unit,mode<9); // standard 8+8 colors
  88. }
  89. return i;
  90. }
  91. return 0;
  92. }
  93.  
  94. void drawStart(){
  95. vita2d_start_drawing();
  96. //vita2d_clear_screen();
  97. }
  98.  
  99. void drawInit() {
  100. vita2d_init();
  101. pgf = vita2d_load_default_pgf();
  102. drawStart();
  103. }
  104.  
  105. void drawEnd(){
  106. vita2d_end_drawing();
  107. vita2d_common_dialog_update();
  108. vita2d_swap_buffers();
  109. sceDisplayWaitVblankStart();
  110. }
  111.  
  112. void drawUpdate(){
  113. drawEnd();
  114. drawStart();
  115. }
  116.  
  117. void psvDebugScreenInit() {
  118. drawInit();
  119. //reset X/Y
  120. coordX = 0;
  121. coordY = 0;
  122. }
  123.  
  124.  
  125.  
  126. int psvDebugScreenPuts(const char * _text) {
  127. const unsigned char*text = (const unsigned char*)_text;
  128. int c;
  129. for (c = 0; text[c] ; c++) {
  130. unsigned char t = text[c];
  131. if (t == '\t') {
  132. coordX += SCREEN_TAB_W - coordX % SCREEN_TAB_W;
  133. continue;
  134. }
  135. if (coordX + FONT_SIZE > SCREEN_WIDTH) {
  136. coordY += FONT_SIZE;
  137. coordX = 0;
  138. }
  139. if (coordY + FONT_SIZE > SCREEN_HEIGHT) {
  140. coordX = coordY = 0;
  141. }
  142. if (t == '\n') {
  143. coordX = 0;
  144. coordY += FONT_SIZE;
  145. continue;
  146. } else if (t == '\r') {
  147. coordX = 0;
  148. continue;
  149. } else if ((t == '\e') && (text[c+1] == '[')) {
  150. c += psvDebugScreenEscape(text + c + 2) + 2;
  151. if(coordX < 0)coordX = 0;// CSI position are 1-based,
  152. if(coordY < 0)coordY = 0;// prevent 0-based coordiate from producing a negativ X/Y
  153. continue;
  154. }
  155. vita2d_pgf_draw_textf(pgf, coordX, coordY, colorFg, 1.0f, "%c",t );
  156. coordX += FONT_SIZE;
  157. }
  158. return c;
  159. }
  160.  
  161. __attribute__((__format__ (__printf__, 1, 2)))
  162. int psvDebugScreenPrintf(const char *format, ...) {
  163. drawStart();
  164. char buf[4096];
  165.  
  166. va_list opt;
  167. va_start(opt, format);
  168. int ret = vsnprintf(buf, sizeof(buf), format, opt);
  169. psvDebugScreenPuts(buf);
  170. va_end(opt);
  171. drawEnd();
  172. return ret;
  173. }
  174.  
  175. void psvDebugScreenSetFgColor(uint32_t rgb){
  176. psvDebugScreenPrintf("\e[38;2;%lu;%lu;%lum", (rgb>>16)&0xFF, (rgb>>8)&0xFF, rgb&0xFF);
  177. }
  178. void psvDebugScreenSetBgColor(uint32_t rgb){
  179. psvDebugScreenPrintf("\e[48;2;%lu;%lu;%lum", (rgb>>16)&0xFF, (rgb>>8)&0xFF, rgb&0xFF);
  180. }
  181. void psvDebugScreenClear(){
  182. vita2d_clear_screen();
  183. vita2d_set_clear_color(RGBA8(0, 0, 0, 0xFF));
  184. coordX = 0;
  185. coordY = 0;
  186. }
  187. #undef F
  188. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement