diff --git a/programs/cmm/example fonts/compile original font.bat b/programs/cmm/example fonts/compile original font.bat new file mode 100644 index 0000000000..56b549a5d4 --- /dev/null +++ b/programs/cmm/example fonts/compile original font.bat @@ -0,0 +1,10 @@ +C-- "example original font.c" +@del "example original font" +@rename "example original font.com" "example original font" +kpack "example original" +@del warning.txt +@pause +@rem ====== Automatically add binnary to kolibri.img and then run QEMU ===== +@rem"C:\Program Files (x86)\WinImage\WINIMAGE.exe" D:\Kolibri\work\QEMU\kolibri.img /I /H/Q C:\Users\Leency\Dropbox\CMM\example\example +@rem @cd /d C:\Work\QEMU +@rem C:\Work\QEMU\kolibri_qumu.bat \ No newline at end of file diff --git a/programs/cmm/example fonts/example original font.c b/programs/cmm/example fonts/example original font.c new file mode 100644 index 0000000000..20638dd453 --- /dev/null +++ b/programs/cmm/example fonts/example original font.c @@ -0,0 +1,66 @@ +#define MEMSIZE 0x7E80 + +#include "../lib/font.h" + +byte id,key; + +FONT TimeNewRoman = 0; +FONT Verdana = 0; +void main() +{ + + SetEventMask(1100111b); + + Verdana.load("font/Verdana 15px original"); + font.load("font/Georgia 45px original"); + TimeNewRoman.load("font/Times New Roman 30px original"); + loop() + { + switch(WaitEvent()) + { + case evMouse: + mouse.get(); + + + break; + case evButton: + id=GetButtonID(); + if (id==1) ExitProcess(); + break; + + case evKey: + key = GetKey(); + if (key==013){ //Enter + draw_window(); + + } + break; + + case evReDraw: + draw_window(); + + break; + } + } +} +void draw_window() +{ + proc_info Form; + + int i =0; + DefineAndDrawWindow(215,100,450,500,0x33,0xFFFFFF,"Window header"); + GetProcessInfo(#Form, SelfInfo); + + font.text(0,0,"Georgia 45px original",0x5522DD); + font.text(3,43,"Съешь еще этих мягких французких булок, да выпей чаю. 1234567890",0xDEDEDE); + font.text(0,40,"Съешь еще этих мягких французких булок, да выпей чаю. 1234567890",0x0); + + + font.text(0,80,"Times New Roman 30px original",0x993366); + TimeNewRoman.text(3,113,"Съешь еще этих мягких французких булок, да выпей чаю. 1234567890",0xDEDEDE); + TimeNewRoman.text(0,110,"Съешь еще этих мягких французких булок, да выпей чаю. 1234567890",0x0); + + Verdana.textarea(0,150,"Этот пример демонстрирует возможности шрифта, \rкоторый создан специально для колибриОС.\rВ ближайшее время активно добавляются шрифты.\rРедактировать шрифты можно на сайте: http://font.ga.\rДля редактирования шрифта, шрифт должен быть в несжатом виде,\rтакже соответствовать стандарту!\rВ планах сделать компактный файл,\rкоторый будет содержать разные размеры одного шрифта.\rОригинальный файл (т.е.) не сжатый файл много занимает места,\rпоэтому рекомендую сжимать kpack. Шрифты на заказ https://vk.com/pavelyakov39\rПрорисовка пока что медленная - временно.Кодировка шрифта ANSII.",0x5522DD); + Verdana.text(30,350,"А теперь...",0xAA4444); + font.text(60,370,"До встречи!!!",0xDD4444); +} \ No newline at end of file diff --git a/programs/cmm/example fonts/font/Georgia 45px original b/programs/cmm/example fonts/font/Georgia 45px original new file mode 100644 index 0000000000..1c7e37993e Binary files /dev/null and b/programs/cmm/example fonts/font/Georgia 45px original differ diff --git a/programs/cmm/example fonts/font/Times New Roman 30px original b/programs/cmm/example fonts/font/Times New Roman 30px original new file mode 100644 index 0000000000..924c92f7af Binary files /dev/null and b/programs/cmm/example fonts/font/Times New Roman 30px original differ diff --git a/programs/cmm/example fonts/font/Verdana 15px original b/programs/cmm/example fonts/font/Verdana 15px original new file mode 100644 index 0000000000..42a2b4415d Binary files /dev/null and b/programs/cmm/example fonts/font/Verdana 15px original differ diff --git a/programs/cmm/lib/font.h b/programs/cmm/lib/font.h new file mode 100644 index 0000000000..afa00f5d51 --- /dev/null +++ b/programs/cmm/lib/font.h @@ -0,0 +1,95 @@ +#ifndef INCLUDE_FONT_H +#define INCLUDE_FONT_H + +#ifndef INCLUDE_MATH_H +#include "../lib/math.h" +#endif + +#ifndef INCLUDE_IO_H +#include "../lib/io.h" +#endif + +:struct FONT +{ + byte width,height,offsetLine; + word block; + dword data; + dword size_file; + byte load(...); + byte symbol(word x,y;byte s;dword c); + dword text(word x,y;dword text,c); + dword textarea(word x,y;dword text,c); +}; +FONT font = 0; +:dword FONT::text(word x,y;dword text1,c) +{ + dword len=0; + WHILE(DSBYTE[text1]) + { + len += symbol(x+len,y,DSBYTE[text1],c); + text1++; + } + return len; +} +:dword FONT::textarea(word x,y;dword text1,c) +{ + dword len=0; + WHILE(DSBYTE[text1]) + { + IF(DSBYTE[text1]=='\r'){ y+=height; len=0;} + ELSE len += symbol(x+len,y,DSBYTE[text1],c); + text1++; + } + return len; +} +:byte FONT::symbol(signed x,y;byte s;dword c) +{ + dword xi,yi; + dword tmp,_; + dword iii; + byte rw=0; + IF(offsetLine)y+=offsetLine; + IF(s==32)return width/4; + yi = 0; + iii = 0; + tmp = 4*block*s; + tmp +=data; + while(yi>= 1; + IF(_&1) + { + IF(xi>rw)rw=xi; + PutPixel(x+xi,y+yi,c); + } + xi++; + iii++; + } + yi++; + } + return rw; +} +:byte FONT::load(dword path) +{ + dword tmp; + IF(data)free(data); + tmp = io.read(path); + data = tmp; + size_file = io.FILES_SIZE; + tmp +=size_file; + tmp--; + height = DSBYTE[tmp]; + tmp--; + width = DSBYTE[tmp]; + block = math.ceil(height*width/32); +} + +#endif \ No newline at end of file diff --git a/programs/cmm/lib/io.h b/programs/cmm/lib/io.h index e7147ab32e..038b78216b 100644 --- a/programs/cmm/lib/io.h +++ b/programs/cmm/lib/io.h @@ -279,13 +279,23 @@ byte copy(...); byte move(...); dword set(...); + dword readKPACK(dword path1); dword convert_size(); __DIR dir; __PATH path; __FILE file; ____BDVK BDVK; }io; - +:dword IO::readKPACK(dword path1) +{ + dword sizes; + EAX = 68; + EBX = 27; + ECX = path.path(path1); + EDX = sizes; + $int 0x40; + return EAX; +} :byte __ConvertSize_size_prefix[8]; :dword IO::convert_size() { diff --git a/programs/cmm/lib/math.h b/programs/cmm/lib/math.h index c04408f8c4..5aafee8eeb 100644 --- a/programs/cmm/lib/math.h +++ b/programs/cmm/lib/math.h @@ -15,7 +15,32 @@ float sqrt(float x); float tan(float x); float abs(float x); + float floor(float x); + signed round(float x); + signed ceil(float x); }math; +:signed MATH::round(float x) +{ + x+=0.6; + return x; +} +:signed MATH::ceil(float x) +{ + dword z; + float tmp; + z = x; + tmp = z; + IF(tmp