Subversion Repositories Kolibri OS

Rev

Rev 5740 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef INCLUDE_FONT_H
  2. #define INCLUDE_FONT_H
  3.  
  4. #ifndef INCLUDE_MATH_H
  5. #include "../lib/math.h"
  6. #endif
  7.  
  8. #ifndef INCLUDE_IO_H
  9. #include "../lib/io.h"
  10. #endif
  11.  
  12. :struct FONT
  13. {
  14.         byte width,height,offsetLine,r,g,b;
  15.         word width_buffer;
  16.         dword file_size;
  17.         dword buffer;
  18.         dword buffer_size;
  19.         word block;
  20.         dword data;
  21.         dword begin;
  22.         dword size_file;
  23.         byte load(...);
  24.         byte symbol(word x;byte s;dword c);
  25.         dword text(word x,y;dword text,c;byte size);
  26.         dword textarea(word x,y;dword text,c;byte size);
  27.         byte changeSIZE(byte size);
  28.         void PixelRGB(word x,y);
  29.         dword tmp_y,tmp_height,tmp_x;
  30. };
  31. FONT font = 0;
  32.  
  33. :void FONT::PixelRGB(dword x,y)
  34. {
  35.         dword tmp;
  36.         tmp = y*width_buffer*3;
  37.         tmp += x*3;
  38.         tmp += buffer;
  39.  
  40.         DSBYTE[tmp] = r;
  41.         tmp++;
  42.         DSBYTE[tmp] = g;
  43.         tmp++;
  44.         DSBYTE[tmp] = b;
  45. }
  46. :byte FONT::changeSIZE(byte size)
  47. {
  48.         dword TMP_DATA;
  49.         dword ofs;
  50.         byte s;
  51.         IF(size<9) size = 8;
  52.         IF(size>45)size = 45;
  53.                 s = size-8;
  54.                 data = begin;
  55.                 TMP_DATA = data;
  56.                 TMP_DATA +=s*4;
  57.                 ofs = DSDWORD[TMP_DATA];
  58.                 IF(ofs==-1)return false;
  59.                 data += ofs;
  60.                 data += 156;
  61.                 TMP_DATA = data;
  62.                 file_size = DSDWORD[TMP_DATA];
  63.                 TMP_DATA += file_size;
  64.                 TMP_DATA--;
  65.                 height = DSBYTE[TMP_DATA];
  66.                 TMP_DATA--;
  67.                 width =  DSBYTE[TMP_DATA];
  68.                 block = math.ceil(height*width/32);
  69.                 return true;
  70. }
  71. :proc_info Form_SELF_FONTS;
  72.  
  73. :dword FONT::text(word x,y;dword text1,c;byte size)
  74. {
  75.         dword len=0;
  76.         IF(size)IF(!changeSIZE(size))return 0;
  77.         GetProcessInfo(#Form_SELF_FONTS, SelfInfo);
  78.         IF(y>Form_SELF_FONTS.cheight) return 0;
  79.         IF(x>Form_SELF_FONTS.cwidth) return 0;
  80.         tmp_y = y;
  81.         AX = c;
  82.         r = AL;
  83.         g = AH;
  84.         c>>=16;
  85.         AX = c;
  86.         b = AL;
  87.         width_buffer = width;
  88.         width_buffer *= strlen(text1);
  89.         IF(!buffer_size)buffer = malloc(width_buffer*height);
  90.         ELSE IF(buffer_size<width_buffer*height)buffer = realloc(width_buffer*height);
  91.         width_buffer /= 3;
  92.         CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),width_buffer,height);
  93.        
  94.         WHILE(DSBYTE[text1])
  95.         {
  96.                 len += symbol(len,DSBYTE[text1],c);
  97.                 text1++;
  98.         }
  99.         _PutImage(x,y,width_buffer,height,buffer);
  100.         return len;
  101. }
  102. :dword FONT::textarea(word x,y;dword text1,c;byte size)
  103. {
  104.        
  105. }
  106. :byte FONT::symbol(signed x;byte s;dword c)
  107. {
  108.         dword xi,yi;
  109.         dword tmp,_;
  110.         dword iii;
  111.                 dword ___x;
  112.         byte rw=0;
  113.         IF(s==32)return width/4;
  114.                 IF(s==9)return width;
  115.         yi = 0;
  116.         iii = 0;
  117.         tmp = 4*block*s;
  118.         tmp +=data;
  119.         while(yi<height)
  120.         {
  121.                 xi = 0;
  122.                 WHILE(xi<width)
  123.                 {
  124.                         IF(iii%32) _ >>= 1;
  125.                                                 ELSE
  126.                                                 {
  127.                                 tmp += 4;
  128.                                 _ = DSDWORD[tmp];
  129.                         }
  130.                         IF(_&1)
  131.                         {
  132.                                 IF(xi>rw)rw=xi;
  133.                                                                 ___x = x+xi;
  134.                                                                 IF(___x<Form_SELF_FONTS.cwidth)&&(tmp_y+yi<Form_SELF_FONTS.cheight)PixelRGB(x+xi,yi);
  135.                         }
  136.                         xi++;
  137.                         iii++;
  138.                 }
  139.                 yi++;
  140.         }
  141.         return rw;
  142. }
  143. :byte FONT::load(dword path)
  144. {
  145.         dword tmp;
  146.         IF(data)free(data);
  147.         tmp = io.read(path);
  148.         data = tmp;
  149.         begin = data;
  150.         size_file = io.FILES_SIZE;
  151.         tmp +=size_file;
  152.         tmp--;
  153.         height = DSBYTE[tmp];
  154.         tmp--;
  155.         width = DSBYTE[tmp];
  156.         block = math.ceil(height*width/32);
  157. }
  158.  
  159. #endif