Subversion Repositories Kolibri OS

Rev

Rev 5231 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "paint.h"
  2.  
  3. typedef struct {
  4.     char b;
  5.     char g;
  6.     char r;
  7. } rgb;
  8.  
  9. struct {
  10.     rect    area;
  11.     rgb*    image;
  12. } canvas = {0};
  13.  
  14. __u32 canvas_index(__u16 row, __u16 column) {
  15.     return column + row * canvas.area.width;
  16. }
  17.  
  18. point canvas_position(__u32 index) {
  19.     point p = {
  20.         .x = index % canvas.area.width,
  21.         .y = index / canvas.area.width
  22.     };
  23.     return p;
  24. }
  25.  
  26. void canvas_init(rect *r)
  27. {
  28.     canvas.area = *r;
  29.  
  30.     canvas_delete();
  31.     canvas.image = malloc(r->width * r->height * sizeof(rgb));
  32. }
  33.  
  34. void canvas_delete()
  35. {
  36.     if (canvas.image)
  37.         free(canvas.image);
  38. }
  39.  
  40. void canvas_fill(__u32 color)
  41. {
  42.     if (canvas.image)
  43.     {
  44.         __u32 i = 0;
  45.         __u32 len = canvas.area.width * canvas.area.height;
  46.         for (i = 0; i < len; i++)
  47.         {
  48.             canvas.image[i] = *((rgb*)(&color));
  49.         }
  50.     }
  51. }
  52.  
  53. void canvas_draw_rect(rect *r, __u32 color)
  54. {
  55.     if (canvas.image)
  56.     {
  57.         __u32 row = 0;
  58.         __u32 column = 0;
  59.         rgb* c = (rgb*)(&color);
  60.  
  61.         for (row = 0; row < r->height; row++)
  62.         {
  63.             for (column = 0; column < (r->width); column++)
  64.             {
  65.                 canvas.image[canvas_index(row + r->y - canvas.area.y,
  66.                                           column + r->x - canvas.area.x)] = *c;
  67.             }
  68.         }
  69.     }
  70. }
  71.  
  72. void canvas_draw_text(rect* r, char* txt, __u32 len, __u32 color)
  73. {
  74.     __u32 w;
  75.     __u32 h;
  76.     char* mem;
  77.  
  78.     h = FONT_HEIGHT;
  79.     w = len * FONT_WIDTH + len;
  80.     mem = malloc(sizeof(__u32) * 2 + h * w * sizeof(__u32));
  81.  
  82.     memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
  83.     ((__u32*)mem)[0] = w;
  84.     ((__u32*)mem)[1] = h;
  85.  
  86.      __asm__ __volatile__("int $0x40"::
  87.                           "a"(4),
  88.                           "b"(0),
  89.                           "c"(color | (8 << 24)),
  90.                           "d"((__u32)txt),
  91.                           "S"(len),
  92.                           "D"((__u32)(mem)));
  93.  
  94.     __u16 x = r->x + (r->width - (len * FONT_WIDTH + len) * 2) / 2 - canvas.area.x;
  95.     __u16 y = r->y + (r->height - FONT_HEIGHT * 2) / 2 - canvas.area.y;
  96.  
  97.     int row = 0;
  98.     int column = 0;
  99.     __u32* __mem = (__u32*)(mem + 8);
  100.     for (row = 0; row < h; row++)
  101.     {
  102.         for (column = 0; column < w; column++)
  103.         {
  104.             __u32 c = __mem[column + row * w];
  105.             if (c & 0xFF000000)
  106.             {
  107.                 canvas.image[canvas_index(row * 2 + y,column * 2 + x)] = *((rgb*)&c);
  108.                 canvas.image[canvas_index(row * 2 + y,column * 2 + 1 + x)] = *((rgb*)&c);
  109.  
  110.                 canvas.image[canvas_index(row * 2 + 1 + y,column * 2 + x)] = *((rgb*)&c);
  111.                 canvas.image[canvas_index(row * 2 + 1 + y,column * 2 + 1 + x)] = *((rgb*)&c);
  112.             }
  113.         }
  114.     }
  115.  
  116.     memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
  117.     free(mem);
  118. }
  119.  
  120. void canvas_draw_value(rect* r, __u32 v, __u32 color)
  121. {
  122.     char buffer[16] = {0};
  123.     __u32 length = strlen(itoa(v,buffer,10));
  124.     canvas_draw_text(r,buffer,length,color);
  125. }
  126.  
  127. void canvas_paint()
  128. {
  129.     if (canvas.image)
  130.     {
  131.         __menuet__putimage(canvas.area.x,
  132.                            canvas.area.y,
  133.                            canvas.area.width,
  134.                            canvas.area.height,
  135.                            (char*)canvas.image);
  136.     }
  137. }
  138.