Subversion Repositories Kolibri OS

Rev

Rev 5730 | 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;
  15.         dword file_size;
  16.         word block;
  17.         dword data;
  18.         dword begin;
  19.         dword size_file;
  20.         byte load(...);
  21.         byte symbol(word x,y;byte s;dword c);
  22.         dword text(word x,y;dword text,c;byte size);
  23.         dword textarea(word x,y;dword text,c;byte size);
  24.         byte changeSIZE(byte size);
  25. };
  26. FONT font = 0;
  27. :byte FONT::changeSIZE(byte size)
  28. {
  29.         dword TMP_DATA;
  30.         dword ofs;
  31.         byte s;
  32.         IF(size<9) size = 8;
  33.         IF(size>45)size = 45;
  34.                 s = size-8;
  35.                 data = begin;
  36.                 TMP_DATA = data;
  37.                 TMP_DATA +=s*4;
  38.                 ofs = DSDWORD[TMP_DATA];
  39.                 IF(ofs==-1)return false;
  40.                 data += ofs;
  41.                 data += 156;
  42.                 TMP_DATA = data;
  43.                 file_size = DSDWORD[TMP_DATA];
  44.                 TMP_DATA += file_size;
  45.                 TMP_DATA--;
  46.                 height = DSBYTE[TMP_DATA];
  47.                 TMP_DATA--;
  48.                 width =  DSBYTE[TMP_DATA];
  49.                 block = math.ceil(height*width/32);
  50.                 return true;
  51. }
  52. :dword FONT::text(word x,y;dword text1,c;byte size)
  53. {
  54.         dword len=0;
  55.         if(size)if(!changeSIZE(size))return 0;
  56.        
  57.         WHILE(DSBYTE[text1])
  58.         {
  59.                 len += symbol(x+len,y,DSBYTE[text1],c);
  60.                 text1++;
  61.         }
  62.         return len;
  63. }
  64. :dword FONT::textarea(word x,y;dword text1,c;byte size)
  65. {
  66.         dword len=0;
  67.         if(size)if(!changeSIZE(size))return 0;
  68.         WHILE(DSBYTE[text1])
  69.         {
  70.                 IF(DSBYTE[text1]=='\r'){ y+=height; len=0;}
  71.                 ELSE    len += symbol(x+len,y,DSBYTE[text1],c);
  72.                 text1++;
  73.         }
  74.         return len;
  75. }
  76. :byte FONT::symbol(signed x,y;byte s;dword c)
  77. {
  78.         dword xi,yi;
  79.         dword tmp,_;
  80.         dword iii;
  81.         byte rw=0;
  82.         IF(offsetLine)y+=offsetLine;
  83.         IF(s==32)return width/4;
  84.                 IF(s==9)return width;
  85.         yi = 0;
  86.         iii = 0;
  87.         tmp = 4*block*s;
  88.         tmp +=data;
  89.         while(yi<height)
  90.         {
  91.                 xi = 0;
  92.                 WHILE(xi<width)
  93.                 {
  94.                         IF(!(iii%32))
  95.                         {
  96.                                 tmp += 4;
  97.                                 _ = DSDWORD[tmp];
  98.                         }
  99.                         ELSE _ >>= 1;
  100.                         IF(_&1)
  101.                         {
  102.                                 IF(xi>rw)rw=xi;
  103.                                 PutPixel(x+xi,y+yi,c);
  104.                         }
  105.                         xi++;
  106.                         iii++;
  107.                 }
  108.                 yi++;
  109.         }
  110.         return rw;
  111. }
  112. :byte FONT::load(dword path)
  113. {
  114.         dword tmp;
  115.         IF(data)free(data);
  116.         tmp = io.read(path);
  117.         data = tmp;
  118.         begin = data;
  119.         size_file = io.FILES_SIZE;
  120.         tmp +=size_file;
  121.         tmp--;
  122.         height = DSBYTE[tmp];
  123.         tmp--;
  124.         width = DSBYTE[tmp];
  125.         block = math.ceil(height*width/32);
  126. }
  127.  
  128. #endif