Subversion Repositories Kolibri OS

Rev

Rev 9896 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9896 akron1 1
(*
9898 akron1 2
    Copyright 2016, 2018, 2022, 2023 Anton Krotov
9896 akron1 3
 
4
    This file is part of fb2read.
5
 
6
    fb2read is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    fb2read is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with fb2read. If not, see .
18
*)
19
 
20
MODULE Font;
21
 
9898 akron1 22
IMPORT
23
	W := Window, S := Strings, G := Graph, sys := SYSTEM, K := KOSAPI,
24
	Encoding, Ini, KF := kfonts;
9896 akron1 25
 
26
VAR
27
 
9898 akron1 28
  kf_font, kf_enabled: BOOLEAN;
9896 akron1 29
  cp1251buf: ARRAY 102400 OF CHAR;
30
 
31
  KFont*: KF.TFont;
32
 
33
  Font*: RECORD
34
    color* : INTEGER;
35
    size   : INTEGER;
36
    bold   : BOOLEAN;
37
    italic : BOOLEAN;
38
    strike : BOOLEAN
39
  END;
40
 
41
  ItalicColor, NormalColor: INTEGER;
42
 
43
 
9898 akron1 44
PROCEDURE KFText(X, Y: INTEGER; first, quantity: INTEGER; canvas: G.tBuffer);
9896 akron1 45
BEGIN
9898 akron1 46
  KF.TextOut(KFont, canvas.bitmap - 8, X, Y, first, quantity, Font.color, ORD(Font.bold) + ORD(Font.italic) * 2 + ORD(Font.strike) * 8)
9896 akron1 47
END KFText;
48
 
49
 
50
PROCEDURE sysfont*(sf: BOOLEAN);
51
BEGIN
52
  kf_font := ~sf & kf_enabled;
53
END sysfont;
54
 
55
 
56
PROCEDURE params*(): INTEGER;
57
  RETURN Font.size + 0 + LSL(3, 16) + LSL(ORD(Font.bold) + ORD(Font.italic) * 2 + 128, 24)
58
END params;
59
 
60
 
61
PROCEDURE SetFontColor*(color: INTEGER);
62
BEGIN
63
	Font.color := color
64
END SetFontColor;
65
 
66
 
67
PROCEDURE Bold*(bold: BOOLEAN);
68
BEGIN
69
  Font.bold := bold
70
END Bold;
71
 
72
 
73
PROCEDURE Italic*(italic, notLink: BOOLEAN);
74
BEGIN
75
	Font.italic := italic;
76
	IF italic THEN
77
		IF notLink THEN
78
			SetFontColor(ItalicColor)
79
		END
80
	ELSE
81
		IF notLink THEN
82
			SetFontColor(NormalColor)
83
		END
84
	END
85
END Italic;
86
 
87
 
88
PROCEDURE Strike*(strike: BOOLEAN);
89
BEGIN
90
  Font.strike := strike
91
END Strike;
92
 
93
 
94
PROCEDURE FontW(): INTEGER;
95
  RETURN ASR(Font.size, 1)
96
END FontW;
97
 
98
 
99
PROCEDURE FontH*(): INTEGER;
100
VAR res: INTEGER;
101
BEGIN
102
  IF kf_font THEN
103
    res := KF.TextHeight(KFont)
104
  ELSE
105
    res := Font.size
106
  END
107
  RETURN res
108
END FontH;
109
 
110
 
111
PROCEDURE TextWidth*(text: S.CHARS; length: INTEGER): INTEGER;
112
VAR res: INTEGER;
113
BEGIN
114
  IF kf_font THEN
9898 akron1 115
    Encoding.convert1251(text.first, sys.ADR(cp1251buf[0]), length);
9896 akron1 116
    res := KF.TextWidth(KFont, sys.ADR(cp1251buf[0]), length, ORD(Font.bold) + ORD(Font.italic) * 2)
117
  ELSE
118
    res := length * FontW()
119
  END
120
  RETURN res
121
END TextWidth;
122
 
123
 
124
PROCEDURE MonoWidth*(): INTEGER;
125
  RETURN FontW()
126
END MonoWidth;
127
 
128
 
9898 akron1 129
PROCEDURE StrikeText*(Rect: W.tRect; X, Y: INTEGER; width: INTEGER);
9896 akron1 130
VAR y: INTEGER;
131
BEGIN
132
  IF Font.strike THEN
133
    y := Y + FontH() DIV 2;
134
//    X := X + ORD(Font.italic & kf_font) * ((KF.TextHeight(KFont) DIV 2) DIV 3);
135
    G.SetColor(Font.color);
9898 akron1 136
    G.HLine(X + Rect.left, X + Rect.left + width, y + Rect.top);
9896 akron1 137
    IF Font.size >= 28 THEN
138
      INC(y);
9898 akron1 139
      G.HLine(X + Rect.left, X + Rect.left + width, y + Rect.top);
9896 akron1 140
    END
141
  END
142
END StrikeText;
143
 
144
 
9898 akron1 145
PROCEDURE Text*(Rect: W.tRect; X, Y: INTEGER; adr: INTEGER; length: INTEGER);
9896 akron1 146
BEGIN
147
  IF kf_font THEN
9898 akron1 148
    Encoding.convert1251(adr, sys.ADR(cp1251buf[0]), length);
149
    KFText(X + Rect.left, Y + Rect.top, sys.ADR(cp1251buf[0]), length, G.Buffer)
9896 akron1 150
  ELSE
151
    G.SetColor(Font.color);
9898 akron1 152
    G.TextOut(X + Rect.left, Y + Rect.top, adr, length, Font.size, params())
9896 akron1 153
  END
154
END Text;
155
 
156
 
157
PROCEDURE Init*(italic, normal, fs: INTEGER);
158
BEGIN
159
  ItalicColor := italic;
160
  NormalColor := normal;
161
  IF KF.SetSize(KFont, fs) THEN
162
    Font.size := KF.TextHeight(KFont);
163
    kf_font := TRUE;
164
    kf_enabled := TRUE
165
  ELSE
166
    Font.size := fs;
167
    kf_font := FALSE;
168
    kf_enabled := FALSE
169
  END
170
END Init;
171
 
172
 
173
BEGIN
174
  KFont := KF.LoadFont(Ini.Font);
9898 akron1 175
  kf_font := KFont # NIL;
176
  kf_enabled := kf_font
9896 akron1 177
END Font.