Subversion Repositories Kolibri OS

Rev

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