Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6613 Rev 6647
Line 15... Line 15...
15
    along with this program.  If not, see .
15
    along with this program.  If not, see .
16
*)
16
*)
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
MODULE kfonts;
18
MODULE kfonts;
Line 19... Line 19...
19
 
19
 
Line 20... Line 20...
20
IMPORT sys := SYSTEM;
20
IMPORT sys := SYSTEM, File, KOSAPI;
21
 
21
 
Line 47... Line 47...
47
  END;
47
  END;
Line 48... Line 48...
48
 
48
 
Line 49... Line -...
49
  TFont* = POINTER TO TFont_desc;
-
 
50
 
-
 
51
 
-
 
52
PROCEDURE [stdcall] LoadFile(file_name: INTEGER; VAR size: INTEGER): INTEGER;
-
 
53
BEGIN
-
 
54
  sys.CODE("53");               (* push    ebx              *)
-
 
55
  sys.CODE("6A44");             (* push    68               *)
-
 
56
  sys.CODE("58");               (* pop     eax              *)
-
 
57
  sys.CODE("6A1B");             (* push    27               *)
-
 
58
  sys.CODE("5B");               (* pop     ebx              *)
-
 
59
  sys.CODE("8B4D08");           (* mov     ecx, [ebp + 08h] *)
-
 
60
  sys.CODE("CD40");             (* int     40h              *)
-
 
61
  sys.CODE("8B4D0C");           (* mov     ecx, [ebp + 0Ch] *)
-
 
62
  sys.CODE("8911");             (* mov     [ecx], edx       *)
-
 
63
  sys.CODE("5B");               (* pop     ebx              *)
-
 
64
  sys.CODE("C9");               (* leave                    *)
-
 
65
  sys.CODE("C20800");           (* ret     08h              *)
-
 
66
  RETURN 0
-
 
67
END LoadFile;
-
 
68
 
-
 
69
PROCEDURE [stdcall] sysfunc3(arg1, arg2, arg3: INTEGER): INTEGER;
-
 
70
BEGIN
-
 
71
  sys.CODE("53");               (* push    ebx              *)
-
 
72
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
-
 
73
  sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
-
 
74
  sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
-
 
75
  sys.CODE("CD40");             (* int     40h              *)
-
 
76
  sys.CODE("5B");               (* pop     ebx              *)
-
 
77
  sys.CODE("C9");               (* leave                    *)
-
 
78
  sys.CODE("C20C00");           (* ret     0Ch              *)
-
 
79
  RETURN 0
49
  TFont* = POINTER TO TFont_desc;
80
END sysfunc3;
50
 
81
 
51
 
82
PROCEDURE [stdcall] zeromem(size, adr: INTEGER);
52
PROCEDURE [stdcall] zeromem(size, adr: INTEGER);
Line 258... Line 228...
258
  style := style MOD 4;
228
  style := style MOD 4;
259
  glyph := Font.glyphs[style, c];
229
  glyph := Font.glyphs[style, c];
260
  xsize := glyph.xsize;
230
  xsize := glyph.xsize;
261
  xmax := x0 + xsize;
231
  xmax := x0 + xsize;
262
  mem := Font.mem + glyph.base;
232
  mem := Font.mem + glyph.base;
-
 
233
  getrgb(color, r0, g0, b0);
263
  FOR i := mem TO mem + xsize * Font.height - 1 DO
234
  FOR i := mem TO mem + xsize * Font.height - 1 DO
264
    sys.GET(i, ch);
235
    sys.GET(i, ch);
265
    IF ch = 1X THEN
236
    IF ch = 1X THEN
266
      pset(buf, x, y, color, bpp32)
237
      pset(buf, x, y, color, bpp32);
267
    ELSIF (ch = 2X) & smoothing THEN
238
    ELSIF (ch = 2X) & smoothing THEN
268
      getrgb(pget(buf, x, y, bpp32), r, g, b);
239
      getrgb(pget(buf, x, y, bpp32), r, g, b);
269
      getrgb(color, r0, g0, b0);
-
 
270
      r := (r * 3 + r0) DIV 4;
240
      r := (r * 3 + r0) DIV 4;
271
      g := (g * 3 + g0) DIV 4;
241
      g := (g * 3 + g0) DIV 4;
272
      b := (b * 3 + b0) DIV 4;
242
      b := (b * 3 + b0) DIV 4;
273
      pset(buf, x, y, rgb(r, g, b), bpp32)
243
      pset(buf, x, y, rgb(r, g, b), bpp32)
274
    END;
244
    END;
Line 287... Line 257...
287
  FOR i := x TO x + width - 1 DO
257
  FOR i := x TO x + width - 1 DO
288
    pset(buf, i, y, color, bpp32)
258
    pset(buf, i, y, color, bpp32)
289
  END
259
  END
290
END hline;
260
END hline;
Line 291... Line -...
291
 
-
 
292
PROCEDURE TextOut*(Font: TFont; canvas, x, y, str, length, color, params: INTEGER);
-
 
293
VAR width: INTEGER; c: CHAR; bpp32, smoothing: BOOLEAN;
-
 
294
BEGIN
-
 
295
  IF Font # NIL THEN
-
 
296
    smoothing := 4 IN BITS(params);
-
 
297
    bpp32 := 5 IN BITS(params);
-
 
298
    sys.GET(str, c);
-
 
299
    WHILE (length > 0) OR (length = -1) & (c # 0X) DO
-
 
300
      INC(str);
-
 
301
      width := OutChar(Font^, ORD(c), x, y, canvas, bpp32, smoothing, color, params);
-
 
302
      IF 3 IN BITS(params) THEN
-
 
303
	hline(canvas, x + ORD(1 IN BITS(params)) * ((Font.height DIV 2) DIV 3), y + Font.height DIV 2, width, color, bpp32)
-
 
304
      END;
-
 
305
      IF 2 IN BITS(params) THEN
-
 
306
	hline(canvas, x, y + Font.height - 1, width, color, bpp32)
-
 
307
      END;
-
 
308
      x := x + width;
-
 
309
      IF length > 0 THEN
-
 
310
	DEC(length)
-
 
311
      END;
-
 
312
      sys.GET(str, c)
-
 
313
    END
-
 
314
  END
-
 
315
END TextOut;
-
 
316
 
261
 
317
PROCEDURE TextWidth*(Font: TFont; str, length, params: INTEGER): INTEGER;
262
PROCEDURE TextWidth*(Font: TFont; str, length, params: INTEGER): INTEGER;
318
VAR res: INTEGER; c: CHAR;
263
VAR res: INTEGER; c: CHAR;
319
BEGIN
264
BEGIN
320
  res := 0;
265
  res := 0;
Line 325... Line 270...
325
      INC(str);
270
      INC(str);
326
      res := res + Font.glyphs[params, ORD(c)].width;
271
      res := res + Font.glyphs[params, ORD(c)].width;
327
      IF length > 0 THEN
272
      IF length > 0 THEN
328
	DEC(length)
273
	DEC(length)
329
      END;
274
      END;
-
 
275
      IF length # 0 THEN
330
      sys.GET(str, c)
276
	sys.GET(str, c)
331
    END
277
      END
332
  END
278
    END
-
 
279
  END
333
  RETURN res
280
  RETURN res
334
END TextWidth;
281
END TextWidth;
Line 335... Line 282...
335
 
282
 
336
PROCEDURE TextHeight*(Font: TFont): INTEGER;
283
PROCEDURE TextHeight*(Font: TFont): INTEGER;
Line 342... Line 289...
342
    res := 0
289
    res := 0
343
  END
290
  END
344
  RETURN res
291
  RETURN res
345
END TextHeight;
292
END TextHeight;
Line -... Line 293...
-
 
293
 
-
 
294
PROCEDURE TextClipLeft(Font: TFont; str, length, params: INTEGER; VAR x: INTEGER): INTEGER;
-
 
295
VAR x1: INTEGER; c: CHAR;
-
 
296
BEGIN
-
 
297
  params := params MOD 4;
-
 
298
  sys.GET(str, c);
-
 
299
  WHILE (length > 0) OR (length = -1) & (c # 0X) DO
-
 
300
    INC(str);
-
 
301
    x1 := x;
-
 
302
    x := x + Font.glyphs[params, ORD(c)].width;
-
 
303
    IF x > 0 THEN
-
 
304
      length := 0;
-
 
305
    END;
-
 
306
    IF length > 0 THEN
-
 
307
      DEC(length)
-
 
308
    END;
-
 
309
    IF length # 0 THEN
-
 
310
      sys.GET(str, c)
-
 
311
    END
-
 
312
  END;
-
 
313
  x := x1
-
 
314
  RETURN str - 1
-
 
315
END TextClipLeft;
-
 
316
 
-
 
317
PROCEDURE TextOut*(Font: TFont; canvas, x, y, str, length, color, params: INTEGER);
-
 
318
VAR width, xsize, ysize, str1, n: INTEGER; c: CHAR; bpp32, smoothing, underline, strike: BOOLEAN;
-
 
319
BEGIN
-
 
320
  IF Font # NIL THEN
-
 
321
    sys.GET(canvas,	xsize);
-
 
322
    sys.GET(canvas + 4, ysize);
-
 
323
    IF (y <= -TextHeight(Font)) OR (y >= ysize) THEN
-
 
324
      length := 0
-
 
325
    END;
-
 
326
    IF length # 0 THEN
-
 
327
      smoothing := 4 IN BITS(params);
-
 
328
      bpp32 := 5 IN BITS(params);
-
 
329
      underline := 2 IN BITS(params);
-
 
330
      strike := 3 IN BITS(params);
-
 
331
      str1 := TextClipLeft(Font, str, length, params, x);
-
 
332
      n := str1 - str;
-
 
333
      str := str1;
-
 
334
      IF length >= n THEN
-
 
335
	length := length - n
-
 
336
      END;
-
 
337
      sys.GET(str, c)
-
 
338
    END;
-
 
339
    WHILE (length > 0) OR (length = -1) & (c # 0X) DO
-
 
340
      INC(str);
-
 
341
      width := OutChar(Font^, ORD(c), x, y, canvas, bpp32, smoothing, color, params);
-
 
342
      IF strike THEN
-
 
343
	hline(canvas, x + ORD(1 IN BITS(params)) * ((Font.height DIV 2) DIV 3), y + Font.height DIV 2, width + 2, color, bpp32)
-
 
344
      END;
-
 
345
      IF underline THEN
-
 
346
	hline(canvas, x, y + Font.height - 1, width + 2, color, bpp32)
-
 
347
      END;
-
 
348
      x := x + width;
-
 
349
      IF x > xsize THEN
-
 
350
	length := 0
-
 
351
      END;
-
 
352
      IF length > 0 THEN
-
 
353
	DEC(length)
-
 
354
      END;
-
 
355
      IF length # 0 THEN
-
 
356
	sys.GET(str, c)
-
 
357
      END
-
 
358
    END
-
 
359
  END
-
 
360
END TextOut;
346
 
361
 
347
PROCEDURE SetSize*(_Font: TFont; font_size: INTEGER): BOOLEAN;
362
PROCEDURE SetSize*(_Font: TFont; font_size: INTEGER): BOOLEAN;
348
VAR temp, offset, fsize, i, memsize, mem: INTEGER;
363
VAR temp, offset, fsize, i, memsize, mem: INTEGER;
349
    c: CHAR; Font, Font2: TFont_desc;
364
    c: CHAR; Font, Font2: TFont_desc;
350
BEGIN
365
BEGIN
Line 379... Line 394...
379
		  IF Font.char_size > 0 THEN
394
		  IF Font.char_size > 0 THEN
380
		    Font.font := offset + 4;
395
		    Font.font := offset + 4;
381
		    Font.mempos := 0;
396
		    Font.mempos := 0;
382
		    memsize := (Font.width + 10) * Font.height * 1024;
397
		    memsize := (Font.width + 10) * Font.height * 1024;
383
		    mem := Font.mem;
398
		    mem := Font.mem;
384
		    Font.mem := sysfunc3(68, 12, memsize);
399
		    Font.mem := KOSAPI.sysfunc3(68, 12, memsize);
385
		    IF Font.mem # 0 THEN
400
		    IF Font.mem # 0 THEN
386
		      IF mem # 0 THEN
401
		      IF mem # 0 THEN
387
			mem := sysfunc3(68, 13, mem)
402
			mem := KOSAPI.sysfunc3(68, 13, mem)
388
		      END;
403
		      END;
389
		      zeromem(memsize DIV 4, Font.mem);
404
		      zeromem(memsize DIV 4, Font.mem);
390
		      FOR i := 0 TO 255 DO
405
		      FOR i := 0 TO 255 DO
391
			make_glyph(Font, i)
406
			make_glyph(Font, i)
392
		      END
407
		      END
Line 439... Line 454...
439
 
454
 
440
PROCEDURE Destroy*(VAR Font: TFont);
455
PROCEDURE Destroy*(VAR Font: TFont);
441
BEGIN
456
BEGIN
442
  IF Font # NIL THEN
457
  IF Font # NIL THEN
443
    IF Font.mem # 0 THEN
458
    IF Font.mem # 0 THEN
444
      Font.mem := sysfunc3(68, 13, Font.mem)
459
      Font.mem := KOSAPI.sysfunc3(68, 13, Font.mem)
445
    END;
460
    END;
446
    IF Font.data # 0 THEN
461
    IF Font.data # 0 THEN
447
      Font.data := sysfunc3(68, 13, Font.data)
462
      Font.data := KOSAPI.sysfunc3(68, 13, Font.data)
448
    END;
463
    END;
449
    DISPOSE(Font)
464
    DISPOSE(Font)
450
  END
465
  END
Line 451... Line 466...
451
END Destroy;
466
END Destroy;
452
 
467
 
453
PROCEDURE LoadFont*(file_name: ARRAY OF CHAR): TFont;
468
PROCEDURE LoadFont*(file_name: ARRAY OF CHAR): TFont;
454
VAR Font: TFont; data, size, n: INTEGER;
469
VAR Font: TFont; data, size, n: INTEGER;
455
BEGIN
470
BEGIN
456
  data := LoadFile(sys.ADR(file_name[0]), size);
471
  data := File.Load(file_name, size);
457
  IF (data # 0) & (size > 156) THEN
472
  IF (data # 0) & (size > 156) THEN
458
    NEW(Font);
473
    NEW(Font);
459
    Font.data := data;
474
    Font.data := data;
Line 466... Line 481...
466
    IF Font.font_size = 0 THEN
481
    IF Font.font_size = 0 THEN
467
      Destroy(Font)
482
      Destroy(Font)
468
    END
483
    END
469
  ELSE
484
  ELSE
470
    IF data # 0 THEN
485
    IF data # 0 THEN
471
      data := sysfunc3(68, 13, data)
486
      data := KOSAPI.sysfunc3(68, 13, data)
472
    END;
487
    END;
473
    Font := NIL
488
    Font := NIL
474
  END
489
  END
475
  RETURN Font
490
  RETURN Font
476
END LoadFont;
491
END LoadFont;