Subversion Repositories Kolibri OS

Rev

Rev 9174 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8728 leency 1
(*
2
    Copyright 2021 Anton Krotov
3
 
4
    This file is part of CEdit.
5
 
6
    CEdit 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
    CEdit 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 CEdit. If not, see .
18
*)
19
 
20
MODULE Graph;
21
 
22
IMPORT SYSTEM, K := KOSAPI;
23
 
24
CONST
25
 
26
    modeCOPY = 0;
27
    modeNOT  = 1;
28
    modeXOR  = 2;
29
 
30
TYPE
31
 
32
    tFont* = POINTER TO RECORD
33
        handle*: INTEGER;
34
        height*: INTEGER;
35
        width*:  INTEGER;
36
        size:    INTEGER;
37
        name*:   ARRAY 256 OF WCHAR
38
    END;
39
 
40
    tCanvas* = POINTER TO RECORD
41
        bitmap: INTEGER;
42
        width*, height*: INTEGER;
43
        color, backColor, textColor: INTEGER;
44
        font*: tFont;
45
        mode: INTEGER
46
    END;
47
 
48
 
49
PROCEDURE DrawCanvas* (canvas: tCanvas; x, y: INTEGER);
50
BEGIN
51
    K.sysfunc7(65, canvas.bitmap, canvas.width*65536 + canvas.height, x*65536 + y, 32, 0, 0);
52
END DrawCanvas;
53
 
54
 
55
PROCEDURE SetColor* (canvas: tCanvas; color: INTEGER);
56
BEGIN
57
    canvas.color := color
58
END SetColor;
59
 
60
 
61
PROCEDURE SetTextColor* (canvas: tCanvas; color: INTEGER);
62
BEGIN
63
    canvas.textColor := color
64
END SetTextColor;
65
 
66
 
67
PROCEDURE SetBkColor* (canvas: tCanvas; color: INTEGER);
68
BEGIN
69
    canvas.backColor := color
70
END SetBkColor;
71
 
72
 
73
PROCEDURE CreateFont* (height: INTEGER; name: ARRAY OF WCHAR; attr: SET): tFont;
74
VAR
75
    font: tFont;
76
BEGIN
77
    NEW(font);
78
    font.size := MAX(MIN(height, 8), 1);
79
    font.width := font.size*8;
80
    font.height := font.size*16;
81
    DEC(font.size);
82
    font.name := name
83
    RETURN font
84
END CreateFont;
85
 
86
 
87
PROCEDURE SetFont* (canvas: tCanvas; font: tFont);
88
BEGIN
89
    canvas.font := font
90
END SetFont;
91
 
92
 
93
PROCEDURE HLine* (canvas: tCanvas; y, x1, x2: INTEGER);
94
VAR
95
    X1, X2, i: INTEGER;
96
    ptr: INTEGER;
97
    color: INTEGER;
98
BEGIN
99
    X1 := MAX(MIN(x1, x2), 0);
100
    X2 := MIN(MAX(x1, x2), canvas.width - 1);
101
    IF (0 <= y) & (y < canvas.height) THEN
102
        color := canvas.color;
103
        ptr := canvas.bitmap + y*canvas.width*4 + X1*4;
104
        FOR i := X1 TO X2 DO
105
            SYSTEM.PUT32(ptr, color);
106
            INC(ptr, 4)
107
        END
108
    END
109
END HLine;
110
 
111
 
112
PROCEDURE VLine* (canvas: tCanvas; x, y1, y2: INTEGER);
113
VAR
114
    Y1, Y2, i: INTEGER;
115
    ptr: INTEGER;
116
    color: INTEGER;
117
BEGIN
118
    Y1 := MAX(MIN(y1, y2), 0);
119
    Y2 := MIN(MAX(y1, y2), canvas.height - 1);
120
    IF (0 <= x) & (x < canvas.width) THEN
121
        color := canvas.color;
122
        ptr := canvas.bitmap + Y1*canvas.width*4 + x*4;
123
        FOR i := Y1 TO Y2 DO
124
            IF canvas.mode = modeNOT THEN
125
                SYSTEM.GET32(ptr, color);
126
                color := ORD(-BITS(color)*{0..23})
127
            ELSIF canvas.mode = modeXOR THEN
128
                SYSTEM.GET32(ptr, color);
129
                color := ORD((BITS(color)/BITS(canvas.color))*{0..23})
130
            END;
131
            SYSTEM.PUT32(ptr, color);
132
            INC(ptr, canvas.width*4)
133
        END
134
    END
135
END VLine;
136
 
137
 
138
PROCEDURE notVLine* (canvas: tCanvas; x, y1, y2: INTEGER);
139
BEGIN
140
    IF (0 <= y1) & (y1 < canvas.height) & (0 <= y2) & (y2 < canvas.height) THEN
141
        canvas.mode := modeNOT;
142
        VLine(canvas, x, y1, y2);
143
        canvas.mode := modeCOPY
144
    END
145
END notVLine;
146
 
147
 
148
PROCEDURE xorVLine* (canvas: tCanvas; x, y1, y2: INTEGER);
149
BEGIN
150
    IF (0 <= y1) & (y1 < canvas.height) & (0 <= y2) & (y2 < canvas.height) THEN
151
        canvas.mode := modeXOR;
152
        SetColor(canvas, 0FF0000H);
153
        VLine(canvas, x, y1, y2);
154
        canvas.mode := modeCOPY
155
    END
156
END xorVLine;
157
 
158
 
159
PROCEDURE DLine* (canvas: tCanvas; x1, x2, y: INTEGER; k: INTEGER);
160
VAR
161
    ptr: INTEGER;
162
    color: INTEGER;
163
    d: INTEGER;
164
BEGIN
165
    color := canvas.color;
166
    ptr := canvas.bitmap + y*canvas.width*4 + x1*4;
167
    IF k = -1 THEN
168
        d := canvas.width*4 + 4
169
    ELSIF k = 1 THEN
170
        d := 4 - canvas.width*4
171
    END;
172
    WHILE x1 <= x2 DO
173
        SYSTEM.PUT32(ptr, color);
174
        INC(ptr, d);
175
        INC(x1)
176
    END
177
END DLine;
178
 
179
 
180
PROCEDURE FillRect* (canvas: tCanvas; left, top, right, bottom: INTEGER);
181
VAR
182
    y: INTEGER;
183
BEGIN
184
    FOR y := top TO bottom DO
185
        HLine(canvas, y, left, right)
186
    END
187
END FillRect;
188
 
189
 
190
PROCEDURE Rect* (canvas: tCanvas; left, top, right, bottom: INTEGER);
191
BEGIN
192
    HLine(canvas, top, left, right);
193
    HLine(canvas, bottom, left, right);
194
    VLine(canvas, left, top, bottom);
195
    VLine(canvas, right, top, bottom)
196
END Rect;
197
 
198
 
199
PROCEDURE clear* (canvas: tCanvas);
200
VAR
201
    ptr, ptr2, w, i: INTEGER;
202
BEGIN
203
    HLine(canvas, 0, 0, canvas.width - 1);
204
    w := canvas.width*4;
205
    ptr := canvas.bitmap;
206
    ptr2 := ptr;
207
    i := canvas.height - 1;
208
    WHILE i > 0 DO
209
        INC(ptr2, w);
210
        SYSTEM.MOVE(ptr, ptr2, w);
211
        DEC(i)
212
    END
213
END clear;
214
 
215
 
216
PROCEDURE TextOut* (canvas: tCanvas; x, y: INTEGER; text: INTEGER; n: INTEGER);
217
CONST
218
    WCHAR_SIZE = 2;
219
VAR
220
    color, i: INTEGER;
221
BEGIN
222
    IF (0 <= y) & (y <= canvas.height - canvas.font.height - 1) THEN
223
        IF x < 0 THEN
224
            i := -(x DIV canvas.font.width);
225
            INC(x, i*canvas.font.width);
226
            DEC(n, i)
227
        ELSE
228
            i := 0
229
        END;
230
        IF n > 0 THEN
231
            n := MAX(MIN(n, (canvas.width - x) DIV canvas.font.width), 0);
232
            color := canvas.color;
233
            canvas.color := canvas.backColor;
234
            FillRect(canvas, x, y, x + n*canvas.font.width, y + canvas.font.height);
235
            canvas.color := color;
236
(*            WHILE n > 0 DO
237
                K.sysfunc6(4, x*65536 + y, LSL(28H + canvas.font.size, 24) + canvas.textColor, text + i*WCHAR_SIZE, 1, canvas.bitmap - 8);
238
                INC(x, canvas.font.width);
239
                INC(i);
240
                DEC(n)
241
            END*)
242
            K.sysfunc6(4, x*65536 + y, LSL(28H + canvas.font.size, 24) + canvas.textColor, text + i*WCHAR_SIZE, n, canvas.bitmap - 8)
243
        END
244
    END
245
END TextOut;
246
 
247
 
248
PROCEDURE TextOut2* (canvas: tCanvas; x, y: INTEGER; text: ARRAY OF WCHAR; n: INTEGER);
249
BEGIN
250
    TextOut(canvas, x, y, SYSTEM.ADR(text[0]), n)
251
END TextOut2;
252
 
253
 
254
PROCEDURE CreateCanvas* (width, height: INTEGER): tCanvas;
255
VAR
256
    canvas: tCanvas;
257
BEGIN
258
    NEW(canvas);
259
    canvas.bitmap := K.malloc(width*height*4 + 8);
260
    ASSERT(canvas.bitmap # 0);
261
    SYSTEM.PUT32(canvas.bitmap, width);
262
    SYSTEM.PUT32(canvas.bitmap + 4, height);
263
    INC(canvas.bitmap, 8);
264
    canvas.width := width;
265
    canvas.height := height;
266
    canvas.mode := modeCOPY
267
    RETURN canvas
268
END CreateCanvas;
269
 
270
 
271
PROCEDURE destroy* (VAR canvas: tCanvas);
272
BEGIN
273
    IF canvas # NIL THEN
274
        canvas.bitmap := K.free(canvas.bitmap);
275
        DISPOSE(canvas)
276
    END
277
END destroy;
278
 
279
 
280
END Graph.