Subversion Repositories Kolibri OS

Rev

Rev 9896 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9896 Rev 9898
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016-2020, 2022 Anton Krotov
2
    Copyright 2016-2020, 2022, 2023 Anton Krotov
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
    This file is part of fb2read.
4
    This file is part of fb2read.
5
 
5
 
Line 17... Line 17...
17
    along with fb2read. If not, see .
17
    along with fb2read. If not, see .
18
*)
18
*)
Line 19... Line 19...
19
 
19
 
Line 20... Line 20...
20
MODULE Graph;
20
MODULE Graph;
Line 21... Line 21...
21
 
21
 
Line 22... Line 22...
22
IMPORT K := KOSAPI, sys := SYSTEM, SU := SysUtils, LibImg;
22
IMPORT K := KOSAPI, sys := SYSTEM, SU := SysUtils;
23
 
-
 
Line 24... Line 23...
24
 
23
 
Line 25... Line 24...
25
TYPE
24
 
-
 
25
TYPE
Line 26... Line 26...
26
 
26
 
Line 27... Line 27...
27
  TBuffer = RECORD Width*, Height*, adr*, Color: INTEGER END;
27
  tBuffer* = POINTER TO RECORD Width*, Height*, bitmap*, Color: INTEGER END;
28
  PBuffer* = POINTER TO TBuffer;
28
 
29
 
29
 
30
 
30
VAR
31
VAR
31
 
32
 
32
  Buffer*, BackImg*: tBuffer;
33
  Buffer*, Buffer2, Buffer3*: PBuffer;
33
  Width0, Height0: INTEGER;
34
 
34
 
35
 
35
 
36
PROCEDURE [stdcall-, "rasterworks.obj", ""] drawText (canvas, x, y, string, charQuantity, fontColor, params: INTEGER): INTEGER; END;
36
PROCEDURE [stdcall-, "rasterworks.obj", ""] drawText (canvas, x, y, string, charQuantity, fontColor, params: INTEGER): INTEGER; END;
Line 37... Line 37...
37
 
37
 
38
PROCEDURE Destroy*(VAR Buffer: PBuffer);
38
PROCEDURE Destroy*(VAR Buffer: tBuffer);
39
BEGIN
39
BEGIN
40
  IF Buffer # NIL THEN
40
  IF Buffer # NIL THEN
41
    IF Buffer.adr # 0 THEN
41
    IF Buffer.bitmap # 0 THEN
42
      DEC(Buffer.adr, 8);
42
      DEC(Buffer.bitmap, 8);
43
      Buffer.adr := K.free(Buffer.adr)
43
      Buffer.bitmap := K.free(Buffer.bitmap)
44
    END;
44
    END;
45
    DISPOSE(Buffer)
45
    DISPOSE(Buffer)
46
  END
46
  END
47
END Destroy;
47
END Destroy;
48
 
48
 
Line 49... Line 49...
49
 
49
 
Line 67... Line 67...
67
	g := color DIV 256 MOD 256;
67
	g := color DIV 256 MOD 256;
68
	r := color DIV 65536 MOD 256
68
	r := color DIV 65536 MOD 256
69
END getRGB;
69
END getRGB;
Line 70... Line 70...
70
 
70
 
71
 
71
 
72
PROCEDURE Fill*(Buffer: PBuffer; Color: INTEGER);
72
PROCEDURE Fill* (Buffer: tBuffer; Color: INTEGER);
73
VAR p, n, i: INTEGER;
73
VAR p, n, i: INTEGER;
74
BEGIN
74
BEGIN
75
  p := Buffer.adr;
75
	p := Buffer.bitmap;
76
  n := Buffer.Width * Buffer.Height;
76
	n := Buffer.Width * Buffer.Height;
77
  FOR i := 1 TO n DO
77
	FOR i := 1 TO n DO
78
    sys.PUT(p, Color);
78
    	sys.PUT(p, Color);
Line 87... Line 87...
87
 
87
 
88
BEGIN
88
BEGIN
89
    IF X1 <= X2 THEN
89
    IF X1 <= X2 THEN
90
        SU.MinMax(Y, 0, Buffer.Height - 1);
90
        SU.MinMax(Y, 0, Buffer.Height - 1);
91
        color := Buffer.Color;
91
        color := Buffer.Color;
92
        p1 := Buffer.adr + 4 * (Y * Buffer.Width + X1);
92
        p1 := Buffer.bitmap + 4 * (Y * Buffer.Width + X1);
93
        p2 := p1 + (X2 - X1) * 4;
93
        p2 := p1 + (X2 - X1) * 4;
94
        FOR i := p1 TO p2 BY 4 DO
94
        FOR i := p1 TO p2 BY 4 DO
95
            sys.PUT(i, color)
95
            sys.PUT(i, color)
96
        END
96
        END
Line 104... Line 104...
104
    pix: SET;
104
    pix: SET;
Line 105... Line 105...
105
 
105
 
106
BEGIN
106
BEGIN
107
    IF X1 <= X2 THEN
107
    IF X1 <= X2 THEN
108
        SU.MinMax(Y, 0, Buffer.Height - 1);
108
        SU.MinMax(Y, 0, Buffer.Height - 1);
109
        p1 := Buffer.adr + 4 * (Y * Buffer.Width + X1);
109
        p1 := Buffer.bitmap + 4 * (Y * Buffer.Width + X1);
110
        p2 := p1 + (X2 - X1) * 4;
110
        p2 := p1 + (X2 - X1) * 4;
111
        FOR i := p1 TO p2 BY 4 DO
111
        FOR i := p1 TO p2 BY 4 DO
112
            sys.GET(i, pix);
112
            sys.GET(i, pix);
113
            pix := (-pix) / BITS(color) - {24..31};
113
            pix := (-pix) / BITS(color) - {24..31};
Line 123... Line 123...
123
  ASSERT(Y1 <= Y2);
123
  ASSERT(Y1 <= Y2);
124
  SU.MinMax(Y1, 0, Buffer.Height - 1);
124
  SU.MinMax(Y1, 0, Buffer.Height - 1);
125
  SU.MinMax(Y2, 0, Buffer.Height - 1);
125
  SU.MinMax(Y2, 0, Buffer.Height - 1);
126
  color := Buffer.Color;
126
  color := Buffer.Color;
127
  line_size := Buffer.Width * 4;
127
  line_size := Buffer.Width * 4;
128
  p1 := Buffer.adr + line_size * Y1 + 4 * X;
128
  p1 := Buffer.bitmap + line_size * Y1 + 4 * X;
129
  p2 := p1 + (Y2 - Y1) * line_size;
129
  p2 := p1 + (Y2 - Y1) * line_size;
130
  WHILE p1 <= p2 DO
130
  WHILE p1 <= p2 DO
131
    sys.PUT(p1, color);
131
    sys.PUT(p1, color);
132
    p1 := p1 + line_size
132
    p1 := p1 + line_size
133
  END
133
  END
Line 163... Line 163...
163
END GetColor;
163
END GetColor;
Line 164... Line 164...
164
 
164
 
165
 
165
 
166
PROCEDURE TextOut*(X, Y: INTEGER; Text: INTEGER; length: INTEGER; size, params: INTEGER);
166
PROCEDURE TextOut*(X, Y: INTEGER; Text: INTEGER; length: INTEGER; size, params: INTEGER);
167
BEGIN
167
BEGIN
Line 168... Line 168...
168
	drawText(Buffer.adr - 8, X, Y, Text, length, 0FF000000H + Buffer.Color, params)
168
	drawText(Buffer.bitmap - 8, X, Y, Text, length, 0FF000000H + Buffer.Color, params)
169
END TextOut;
169
END TextOut;
170
 
170
 
171
 
171
 
172
PROCEDURE Resize2*(Width, Height: INTEGER);
172
PROCEDURE InitSize* (Width, Height: INTEGER);
Line 173... Line 173...
173
BEGIN
173
BEGIN
174
  Buffer2.Width := Width;
174
	Width0 := Width;
175
  Buffer2.Height := Height;
175
	Height0 := Height;
176
END Resize2;
176
END InitSize;
177
 
177
 
178
 
178
 
179
PROCEDURE Image* (X, Y, sizeX, sizeY, ptr, Ymin, Ymax: INTEGER);
179
PROCEDURE Image* (X, Y, sizeX, sizeY, ptr, Ymin, Ymax: INTEGER);
180
VAR
180
VAR
181
	y: INTEGER;
181
	y: INTEGER;
182
BEGIN
182
BEGIN
183
	ASSERT(sizeX <= Buffer.Width);
183
	ASSERT(sizeX <= Buffer.Width);
184
	FOR y := 0 TO sizeY - 1 DO
184
	FOR y := 0 TO sizeY - 1 DO
Line 185... Line 185...
185
		IF (Ymin <= Y) & (Y < Ymax) THEN
185
		IF (Ymin <= Y) & (Y < Ymax) THEN
186
			sys.MOVE(ptr + sizeX*4*y, Buffer.adr + (Buffer.Width*Y + X)*4, sizeX*4)
186
			sys.MOVE(ptr + sizeX*4*y, Buffer.bitmap + (Buffer.Width*Y + X)*4, sizeX*4)
187
		END;
187
		END;
188
		INC(Y)
188
		INC(Y)
189
	END
189
	END
190
END Image;
190
END Image;
191
 
191
 
192
 
192
 
193
PROCEDURE Image2(Buffer: PBuffer; X, Y, sizeX, sizeY, ptr: INTEGER);
193
PROCEDURE Image2(Buffer: tBuffer; X, Y, sizeX, sizeY, ptr: INTEGER);
194
VAR x, y, pix, left: INTEGER;
194
VAR x, y, pix, left: INTEGER;
195
BEGIN
195
BEGIN
196
  left := X;
196
  left := X;
197
  FOR y := 0 TO sizeY - 1 DO
197
  FOR y := 0 TO sizeY - 1 DO
198
      X := left;
198
      X := left;
199
      FOR x := 0 TO sizeX - 1 DO
199
      FOR x := 0 TO sizeX - 1 DO
Line 211... Line 211...
211
PROCEDURE BackImage*(sizeX, sizeY, ptr: INTEGER);
211
PROCEDURE BackImage*(sizeX, sizeY, ptr: INTEGER);
212
VAR x, y: INTEGER;
212
VAR x, y: INTEGER;
213
BEGIN
213
BEGIN
214
  IF ptr # 0 THEN
214
  IF ptr # 0 THEN
215
    y := 0;
215
    y := 0;
216
    WHILE y < Buffer3.Height DO
216
    WHILE y < BackImg.Height DO
217
      x := 0;
217
      x := 0;
218
      WHILE x < Buffer3.Width DO
218
      WHILE x < BackImg.Width DO
219
        Image2(Buffer3, x, y, sizeX, sizeY, ptr);
219
        Image2(BackImg, x, y, sizeX, sizeY, ptr);
220
        INC(x, sizeX)
220
        INC(x, sizeX)
221
      END;
221
      END;
222
      INC(y, sizeY)
222
      INC(y, sizeY)
223
    END
223
    END
224
  END
224
  END
225
END BackImage;
225
END BackImage;
Line 226... Line 226...
226
 
226
 
227
 
227
 
228
PROCEDURE Copy*(src, dst: PBuffer; y_src, lines, y_dst: INTEGER);
228
PROCEDURE Copy*(src, dst: tBuffer; y_src, lines, y_dst: INTEGER);
229
BEGIN
229
BEGIN
Line 230... Line -...
230
  sys.MOVE(src.adr + y_src * src.Width * 4, dst.adr + y_dst * dst.Width * 4, lines * dst.Width * 4)
-
 
231
END Copy;
-
 
232
 
-
 
233
 
-
 
234
PROCEDURE Clear*;
-
 
235
VAR p, color: INTEGER;
-
 
236
BEGIN
-
 
237
  color := Buffer.Color;
-
 
238
  FOR p := Buffer.adr TO Buffer.adr + Buffer.Width * Buffer.Height * 4 - 4 BY 4 DO
-
 
239
    sys.PUT(p, color)
-
 
240
  END
230
  sys.MOVE(src.bitmap + y_src * src.Width * 4, dst.bitmap + y_dst * dst.Width * 4, lines * dst.Width * 4)
241
END Clear;
231
END Copy;
242
 
232
 
243
 
233
 
Line 244... Line 234...
244
PROCEDURE Draw*(X, Y: INTEGER);
234
PROCEDURE Draw*(X, Y: INTEGER);
245
BEGIN
235
BEGIN
Line 257... Line 247...
257
 
247
 
258
 
248
 
259
PROCEDURE Progress*(value: REAL);
249
PROCEDURE Progress*(value: REAL);
260
VAR W4, W2, H2: INTEGER;
250
VAR W4, W2, H2: INTEGER;
261
BEGIN
251
BEGIN
262
  W4 := Buffer2.Width DIV 4;
252
  W2 := Width0 DIV 2;
263
  W2 := Buffer2.Width DIV 2;
253
  W4 := W2 DIV 2;
264
  H2 := Buffer2.Height DIV 2;
-
 
265
  SetColor(0FFFFFFH);
254
  H2 := Height0 DIV 2;
266
  Clear;
255
  Fill(Buffer, 0FFFFFFH);
267
  SetColor(0);
256
  SetColor(0);
268
  Rect(W4, H2 - 50, 3 * W4, H2 + 30);
257
  Rect(W4, H2 - 50, 3 * W4, H2 + 30);
269
  TextOut(W2 - 10 * 8 DIV 2, H2 - 50 + 15, sys.SADR("Loading..."), 10, 1, 16 + 0 + LSL(3, 16) + LSL(128, 24));
258
  TextOut(W2 - 10 * 8 DIV 2, H2 - 50 + 15, sys.SADR("Loading..."), 10, 1, 16 + 0 + LSL(3, 16) + LSL(128, 24));
270
  SetColor(000000FFH);
259
  SetColor(000000FFH);
Line 271... Line 260...
271
  Box(W4 + 10, H2, W4 + 10 + FLOOR( FLT(W2 - 20) * value ), H2 + 15);
260
  Box(W4 + 10, H2, W4 + 10 + FLOOR( FLT(W2 - 20) * value ), H2 + 15);
272
END Progress;
261
END Progress;
273
 
262
 
274
 
263
 
275
PROCEDURE Resize3(Buffer: PBuffer; Width, Height: INTEGER);
264
PROCEDURE _resize (Buffer: tBuffer; Width, Height: INTEGER);
276
BEGIN
265
BEGIN
277
  IF Buffer.adr # 0 THEN
266
  IF Buffer.bitmap # 0 THEN
278
    DEC(Buffer.adr, 8)
267
    DEC(Buffer.bitmap, 8)
279
  END;
268
  END;
280
  Buffer.adr := K.realloc(Buffer.adr, Width * Height * 4 + 8);
269
  Buffer.bitmap := K.realloc(Buffer.bitmap, Width * Height * 4 + 8);
281
  SU.MemError(Buffer.adr = 0);
270
  SU.MemError(Buffer.bitmap = 0);
282
  sys.PUT(Buffer.adr, Width);
271
  sys.PUT(Buffer.bitmap, Width);
283
  sys.PUT(Buffer.adr + 4, Height);
272
  sys.PUT(Buffer.bitmap + 4, Height);
Line 284... Line 273...
284
  INC(Buffer.adr, 8);
273
  INC(Buffer.bitmap, 8);
285
  Buffer.Width  := Width;
274
  Buffer.Width  := Width;
286
  Buffer.Height := Height
275
  Buffer.Height := Height
-
 
276
END _resize;
287
END Resize3;
277
 
-
 
278
 
288
 
279
PROCEDURE Resize*(Width, Height: INTEGER);
Line 289... Line 280...
289
 
280
BEGIN
290
PROCEDURE Resize*(Width, Height: INTEGER);
281
	_resize(Buffer,  Width, Height);
291
BEGIN
282
	IF BackImg # NIL THEN
-
 
283
		_resize(BackImg, Width, Height)
292
  Resize3(Buffer,  Width, Height);
284
	END
293
  Resize3(Buffer3, Width, Height);
-
 
294
END Resize;
-
 
295
 
285
END Resize;
296
 
286
 
297
PROCEDURE Init;
287
 
Line -... Line 288...
-
 
288
PROCEDURE Init;
-
 
289
VAR Width, Height: INTEGER;
-
 
290
BEGIN
-
 
291
	BackImg := NIL;
-
 
292
	NEW(Buffer);
-
 
293
	SU.GetScreenSize(Width, Height);
-
 
294
	Resize(Width, Height)
-
 
295
END Init;
-
 
296
 
-
 
297
 
-
 
298
PROCEDURE CreateBackImg*;
-
 
299
BEGIN
-
 
300
	IF BackImg = NIL THEN
-
 
301
		BackImg := Create(Buffer.Width, Buffer.Height)
298
VAR Width, Height: INTEGER;
302
	END
299
BEGIN
303
END CreateBackImg;
300
  NEW(Buffer);
304