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-2020, 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 Graph;
21
 
9898 akron1 22
IMPORT K := KOSAPI, sys := SYSTEM, SU := SysUtils;
9896 akron1 23
 
24
 
25
TYPE
26
 
9898 akron1 27
  tBuffer* = POINTER TO RECORD Width*, Height*, bitmap*, Color: INTEGER END;
9896 akron1 28
 
29
 
30
VAR
31
 
9898 akron1 32
  Buffer*, BackImg*: tBuffer;
33
  Width0, Height0: INTEGER;
9896 akron1 34
 
35
 
36
PROCEDURE [stdcall-, "rasterworks.obj", ""] drawText (canvas, x, y, string, charQuantity, fontColor, params: INTEGER): INTEGER; END;
37
 
9898 akron1 38
PROCEDURE Destroy*(VAR Buffer: tBuffer);
9896 akron1 39
BEGIN
40
  IF Buffer # NIL THEN
9898 akron1 41
    IF Buffer.bitmap # 0 THEN
42
      DEC(Buffer.bitmap, 8);
43
      Buffer.bitmap := K.free(Buffer.bitmap)
9896 akron1 44
    END;
45
    DISPOSE(Buffer)
46
  END
47
END Destroy;
48
 
49
 
9898 akron1 50
PROCEDURE Create*(Width, Height: INTEGER): tBuffer;
51
VAR res: tBuffer;
9896 akron1 52
BEGIN
53
  NEW(res);
9898 akron1 54
  res.bitmap := K.malloc(Width * Height * 4 + 8);
55
  sys.PUT(res.bitmap, Width);
56
  sys.PUT(res.bitmap + 4, Height);
9896 akron1 57
  res.Width := Width;
58
  res.Height := Height;
9898 akron1 59
  INC(res.bitmap, 8);
9896 akron1 60
  RETURN res
61
END Create;
62
 
63
 
64
PROCEDURE getRGB* (color: INTEGER; VAR r, g, b: BYTE);
65
BEGIN
66
	b := color MOD 256;
67
	g := color DIV 256 MOD 256;
68
	r := color DIV 65536 MOD 256
69
END getRGB;
70
 
71
 
9898 akron1 72
PROCEDURE Fill* (Buffer: tBuffer; Color: INTEGER);
9896 akron1 73
VAR p, n, i: INTEGER;
74
BEGIN
9898 akron1 75
	p := Buffer.bitmap;
76
	n := Buffer.Width * Buffer.Height;
77
	FOR i := 1 TO n DO
78
    	sys.PUT(p, Color);
79
		INC(p, 4)
80
	END
9896 akron1 81
END Fill;
82
 
83
 
84
PROCEDURE HLine*(X1, X2, Y: INTEGER);
85
VAR
86
    p1, p2, i, color: INTEGER;
87
 
88
BEGIN
89
    IF X1 <= X2 THEN
90
        SU.MinMax(Y, 0, Buffer.Height - 1);
91
        color := Buffer.Color;
9898 akron1 92
        p1 := Buffer.bitmap + 4 * (Y * Buffer.Width + X1);
9896 akron1 93
        p2 := p1 + (X2 - X1) * 4;
94
        FOR i := p1 TO p2 BY 4 DO
95
            sys.PUT(i, color)
96
        END
97
    END
98
END HLine;
99
 
100
 
101
PROCEDURE HLineNotXOR (X1, X2, Y, color: INTEGER);
102
VAR
103
    p1, p2, i: INTEGER;
104
    pix: SET;
105
 
106
BEGIN
107
    IF X1 <= X2 THEN
108
        SU.MinMax(Y, 0, Buffer.Height - 1);
9898 akron1 109
        p1 := Buffer.bitmap + 4 * (Y * Buffer.Width + X1);
9896 akron1 110
        p2 := p1 + (X2 - X1) * 4;
111
        FOR i := p1 TO p2 BY 4 DO
112
            sys.GET(i, pix);
113
            pix := (-pix) / BITS(color) - {24..31};
114
            sys.PUT(i, pix)
115
        END
116
    END
117
END HLineNotXOR;
118
 
119
 
120
PROCEDURE VLine*(X, Y1, Y2: INTEGER);
121
VAR p1, p2, line_size, color: INTEGER;
122
BEGIN
123
  ASSERT(Y1 <= Y2);
124
  SU.MinMax(Y1, 0, Buffer.Height - 1);
125
  SU.MinMax(Y2, 0, Buffer.Height - 1);
126
  color := Buffer.Color;
127
  line_size := Buffer.Width * 4;
9898 akron1 128
  p1 := Buffer.bitmap + line_size * Y1 + 4 * X;
9896 akron1 129
  p2 := p1 + (Y2 - Y1) * line_size;
130
  WHILE p1 <= p2 DO
131
    sys.PUT(p1, color);
132
    p1 := p1 + line_size
133
  END
134
END VLine;
135
 
136
 
137
PROCEDURE Box(X1, Y1, X2, Y2: INTEGER);
138
VAR y: INTEGER;
139
BEGIN
140
  FOR y := Y1 TO Y2 DO
141
    HLine(X1, X2, y)
142
  END
143
END Box;
144
 
145
 
146
PROCEDURE BoxNotXOR* (X1, Y1, X2, Y2, color: INTEGER);
147
VAR y: INTEGER;
148
BEGIN
149
    FOR y := Y1 TO Y2 DO
150
        HLineNotXOR(X1, X2, y, color)
151
    END
152
END BoxNotXOR;
153
 
154
 
155
PROCEDURE SetColor*(color: INTEGER);
156
BEGIN
157
  Buffer.Color := color
158
END SetColor;
159
 
160
 
161
PROCEDURE GetColor*(): INTEGER;
162
  RETURN Buffer.Color
163
END GetColor;
164
 
165
 
166
PROCEDURE TextOut*(X, Y: INTEGER; Text: INTEGER; length: INTEGER; size, params: INTEGER);
167
BEGIN
9898 akron1 168
	drawText(Buffer.bitmap - 8, X, Y, Text, length, 0FF000000H + Buffer.Color, params)
9896 akron1 169
END TextOut;
170
 
171
 
9898 akron1 172
PROCEDURE InitSize* (Width, Height: INTEGER);
9896 akron1 173
BEGIN
9898 akron1 174
	Width0 := Width;
175
	Height0 := Height;
176
END InitSize;
9896 akron1 177
 
178
 
179
PROCEDURE Image* (X, Y, sizeX, sizeY, ptr, Ymin, Ymax: INTEGER);
180
VAR
181
	y: INTEGER;
182
BEGIN
183
	ASSERT(sizeX <= Buffer.Width);
184
	FOR y := 0 TO sizeY - 1 DO
185
		IF (Ymin <= Y) & (Y < Ymax) THEN
9898 akron1 186
			sys.MOVE(ptr + sizeX*4*y, Buffer.bitmap + (Buffer.Width*Y + X)*4, sizeX*4)
9896 akron1 187
		END;
188
		INC(Y)
189
	END
190
END Image;
191
 
192
 
9898 akron1 193
PROCEDURE Image2(Buffer: tBuffer; X, Y, sizeX, sizeY, ptr: INTEGER);
9896 akron1 194
VAR x, y, pix, left: INTEGER;
195
BEGIN
196
  left := X;
197
  FOR y := 0 TO sizeY - 1 DO
198
      X := left;
199
      FOR x := 0 TO sizeX - 1 DO
200
        sys.GET32(ptr + (y*sizeX + x)*4, pix);
201
        IF (X < Buffer.Width) & (Y < Buffer.Height) THEN
9898 akron1 202
          sys.PUT32(Buffer.bitmap + (Buffer.Width*Y + X)*4, pix)
9896 akron1 203
        END;
204
        INC(X)
205
      END;
206
    INC(Y)
207
  END
208
END Image2;
209
 
210
 
211
PROCEDURE BackImage*(sizeX, sizeY, ptr: INTEGER);
212
VAR x, y: INTEGER;
213
BEGIN
214
  IF ptr # 0 THEN
215
    y := 0;
9898 akron1 216
    WHILE y < BackImg.Height DO
9896 akron1 217
      x := 0;
9898 akron1 218
      WHILE x < BackImg.Width DO
219
        Image2(BackImg, x, y, sizeX, sizeY, ptr);
9896 akron1 220
        INC(x, sizeX)
221
      END;
222
      INC(y, sizeY)
223
    END
224
  END
225
END BackImage;
226
 
227
 
9898 akron1 228
PROCEDURE Copy*(src, dst: tBuffer; y_src, lines, y_dst: INTEGER);
9896 akron1 229
BEGIN
9898 akron1 230
  sys.MOVE(src.bitmap + y_src * src.Width * 4, dst.bitmap + y_dst * dst.Width * 4, lines * dst.Width * 4)
9896 akron1 231
END Copy;
232
 
233
 
234
PROCEDURE Draw*(X, Y: INTEGER);
235
BEGIN
9898 akron1 236
  K.sysfunc7(65, Buffer.bitmap, Buffer.Width * 65536 + Buffer.Height, X * 65536 + Y, 32, 0, 0)
9896 akron1 237
END Draw;
238
 
239
 
240
PROCEDURE Rect*(X1, Y1, X2, Y2: INTEGER);
241
BEGIN
242
  VLine(X1, Y1, Y2);
243
  VLine(X2, Y1, Y2);
244
  HLine(X1, X2, Y1);
245
  HLine(X1, X2, Y2)
246
END Rect;
247
 
248
 
249
PROCEDURE Progress*(value: REAL);
250
VAR W4, W2, H2: INTEGER;
251
BEGIN
9898 akron1 252
  W2 := Width0 DIV 2;
253
  W4 := W2 DIV 2;
254
  H2 := Height0 DIV 2;
255
  Fill(Buffer, 0FFFFFFH);
9896 akron1 256
  SetColor(0);
257
  Rect(W4, H2 - 50, 3 * W4, H2 + 30);
258
  TextOut(W2 - 10 * 8 DIV 2, H2 - 50 + 15, sys.SADR("Loading..."), 10, 1, 16 + 0 + LSL(3, 16) + LSL(128, 24));
259
  SetColor(000000FFH);
260
  Box(W4 + 10, H2, W4 + 10 + FLOOR( FLT(W2 - 20) * value ), H2 + 15);
261
END Progress;
262
 
263
 
9898 akron1 264
PROCEDURE _resize (Buffer: tBuffer; Width, Height: INTEGER);
9896 akron1 265
BEGIN
9898 akron1 266
  IF Buffer.bitmap # 0 THEN
267
    DEC(Buffer.bitmap, 8)
9896 akron1 268
  END;
9898 akron1 269
  Buffer.bitmap := K.realloc(Buffer.bitmap, Width * Height * 4 + 8);
270
  SU.MemError(Buffer.bitmap = 0);
271
  sys.PUT(Buffer.bitmap, Width);
272
  sys.PUT(Buffer.bitmap + 4, Height);
273
  INC(Buffer.bitmap, 8);
9896 akron1 274
  Buffer.Width  := Width;
275
  Buffer.Height := Height
9898 akron1 276
END _resize;
9896 akron1 277
 
278
 
279
PROCEDURE Resize*(Width, Height: INTEGER);
280
BEGIN
9898 akron1 281
	_resize(Buffer,  Width, Height);
282
	IF BackImg # NIL THEN
283
		_resize(BackImg, Width, Height)
284
	END
9896 akron1 285
END Resize;
286
 
287
 
288
PROCEDURE Init;
289
VAR Width, Height: INTEGER;
290
BEGIN
9898 akron1 291
	BackImg := NIL;
292
	NEW(Buffer);
293
	SU.GetScreenSize(Width, Height);
294
	Resize(Width, Height)
9896 akron1 295
END Init;
296
 
297
 
9898 akron1 298
PROCEDURE CreateBackImg*;
9896 akron1 299
BEGIN
9898 akron1 300
	IF BackImg = NIL THEN
301
		BackImg := Create(Buffer.Width, Buffer.Height)
302
	END
303
END CreateBackImg;
304
 
305
 
306
PROCEDURE DestroyBackImg*;
307
BEGIN
308
	Destroy(BackImg)
309
END DestroyBackImg;
310
 
311
 
312
BEGIN
9896 akron1 313
  Init
314
END Graph.