0,0 → 1,124 |
(* |
Copyright 2016 KolibriOS team |
|
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by |
the Free Software Foundation, either version 3 of the License, or |
(at your option) any later version. |
|
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU Lesser General Public License for more details. |
|
You should have received a copy of the GNU Lesser General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. |
*) |
|
MODULE RasterWorks; |
|
IMPORT sys := SYSTEM, KOSAPI; |
|
|
CONST |
|
(* flags *) |
|
bold *= 1; |
italic *= 2; |
underline *= 4; |
strike_through *= 8; |
align_right *= 16; |
align_center *= 32; |
|
bpp32 *= 128; |
|
|
(* encoding *) |
|
cp866 *= 1; |
utf16le *= 2; |
utf8 *= 3; |
|
|
VAR |
|
// draw text on 24bpp or 32bpp image |
// autofits text between 'x' and 'xSize' |
drawText *: PROCEDURE (canvas, x, y, string, charQuantity, fontColor, params: INTEGER): INTEGER; |
(* |
[canvas]: |
xSize dd ? |
ySize dd ? |
picture rb xSize * ySize * bpp |
|
fontColor dd AARRGGBB |
AA = alpha channel ; 0 = transparent, FF = non transparent |
|
params dd ffeewwhh |
hh = char height |
ww = char width ; 0 = auto (proportional) |
ee = encoding ; 1 = cp866, 2 = UTF-16LE, 3 = UTF-8 |
ff = flags ; 0001 = bold, 0010 = italic |
; 0100 = underline, 1000 = strike-through |
00010000 = align right, 00100000 = align center |
01000000 = set text area between higher and lower halfs of 'x' |
10000000 = 32bpp canvas insted of 24bpp |
all flags combinable, except align right + align center |
|
returns: char width (0 = error) |
*) |
|
// calculate amount of valid chars in UTF-8 string |
// supports zero terminated string (set byteQuantity = -1) |
cntUTF_8 *: PROCEDURE (string, byteQuantity: INTEGER): INTEGER; |
|
|
// calculate amount of chars that fits given width |
charsFit *: PROCEDURE (areaWidth, charHeight: INTEGER): INTEGER; |
|
|
// calculate string width in pixels |
strWidth *: PROCEDURE (charQuantity, charHeight: INTEGER): INTEGER; |
|
|
PROCEDURE params* (charHeight, charWidth, encoding, flags: INTEGER): INTEGER; |
(* |
hh = char height |
ww = char width ; 0 = auto (proportional) |
ee = encoding ; 1 = cp866, 2 = UTF-16LE, 3 = UTF-8 |
ff = flags ; 0001 = bold, 0010 = italic |
; 0100 = underline, 1000 = strike-through |
00010000 = align right, 00100000 = align center |
01000000 = set text area between higher and lower halfs of 'x' |
10000000 = 32bpp canvas insted of 24bpp |
all flags combinable, except align right + align center |
*) |
RETURN charHeight + LSL(charWidth, 8) + LSL(encoding, 16) + LSL(flags, 24) |
END params; |
|
|
PROCEDURE main; |
VAR Lib: INTEGER; |
|
PROCEDURE GetProc(v: INTEGER; name: ARRAY OF CHAR); |
VAR a: INTEGER; |
BEGIN |
a := KOSAPI.GetProcAdr(name, Lib); |
ASSERT(a # 0); |
sys.PUT(v, a) |
END GetProc; |
|
BEGIN |
Lib := KOSAPI.LoadLib("/rd/1/lib/RasterWorks.obj"); |
ASSERT(Lib # 0); |
GetProc(sys.ADR(drawText), "drawText"); |
GetProc(sys.ADR(cntUTF_8), "cntUTF-8"); |
GetProc(sys.ADR(charsFit), "charsFit"); |
GetProc(sys.ADR(strWidth), "strWidth"); |
END main; |
|
|
BEGIN |
main |
END RasterWorks. |