Subversion Repositories Kolibri OS

Rev

Rev 9893 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021-2023 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 <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Icons;
  21.  
  22. IMPORT
  23.         Graph, File, SYSTEM, KOSAPI;
  24.  
  25. CONST
  26.         fileName = "/sys/Icons16.png";
  27.         SIZE* = 18;
  28.  
  29.         icoNew    *=  0;
  30.         icoOpen   *=  1;
  31.         icoSave   *=  2;
  32.         icoSearch *=  3;
  33.         icoUndo   *=  4;
  34.         icoRedo   *=  5;
  35.         icoBuild  *=  6;
  36.         icoRun    *=  7;
  37.  
  38.         NumberOfIcons = 8;
  39.  
  40.  
  41. PROCEDURE [stdcall, "libimg.obj", ""] img_decode (data, size, options: INTEGER): INTEGER; END;
  42. PROCEDURE [stdcall, "Libimg.obj", ""] img_convert (src, dst, dst_type, flags, param: INTEGER): INTEGER; END;
  43. PROCEDURE [stdcall, "Libimg.obj", ""] img_destroy (img: INTEGER); END;
  44.  
  45.  
  46. PROCEDURE GetImg (ptr, size: INTEGER): INTEGER;
  47. VAR
  48.         image_data, dst, x, Type: INTEGER;
  49. BEGIN
  50.         image_data := img_decode(ptr, size, 0);
  51.         IF image_data # 0 THEN
  52.                 SYSTEM.GET(image_data + 4, x);
  53.                 ASSERT(x = SIZE);
  54.                 SYSTEM.GET(image_data + 20, Type);
  55.                 IF Type # 3 THEN
  56.                         dst := img_convert(image_data, 0, 3, 0, 0);
  57.                         img_destroy(image_data);
  58.                         image_data := dst
  59.                 END
  60.         END
  61.         RETURN image_data
  62. END GetImg;
  63.  
  64.  
  65. PROCEDURE load (): INTEGER;
  66. VAR
  67.         size, res, ptr: INTEGER;
  68. BEGIN
  69.         res := 0;
  70.         ptr := File.Load(fileName, size);
  71.         IF ptr # 0 THEN
  72.                 res := GetImg(ptr, size);
  73.                 ptr := KOSAPI.free(ptr)
  74.         END
  75.         RETURN res
  76. END load;
  77.  
  78.  
  79. PROCEDURE draw* (icons, n, x, y: INTEGER);
  80. BEGIN
  81.         KOSAPI.sysfunc7(65, icons + SIZE*SIZE*4*n, SIZE*65536 + SIZE, x*65536 + y, 32, 0, 0)
  82. END draw;
  83.  
  84.  
  85. PROCEDURE copy (img: INTEGER; n: INTEGER; dst: INTEGER; m: INTEGER);
  86. VAR
  87.         data: INTEGER;
  88. BEGIN
  89.         SYSTEM.GET(img + 24, data);
  90.         SYSTEM.MOVE(data + SIZE*SIZE*4*n, dst + SIZE*SIZE*4*m, SIZE*SIZE*4)
  91. END copy;
  92.  
  93.  
  94. PROCEDURE iconsBackColor (icons: INTEGER; BackColor: INTEGER);
  95. VAR
  96.         data, x, y, pix: INTEGER;
  97.         b, g, r, gr: BYTE;
  98. BEGIN
  99.         data := icons;
  100.         FOR y := 0 TO SIZE*NumberOfIcons - 1 DO
  101.                 FOR x := 0 TO SIZE - 1 DO
  102.                         SYSTEM.GET32(data, pix);
  103.                         Graph.getRGB(pix, r, g, b);
  104.                         gr := (r + g + b) DIV 3;
  105.                         IF BackColor = -1 THEN
  106.                                 pix := gr + 256*gr + 65536*gr
  107.                         ELSIF gr = 255 THEN
  108.                                 pix := BackColor
  109.                         END;
  110.                         SYSTEM.PUT32(data, pix);
  111.                         INC(data, 4)
  112.                 END
  113.         END
  114. END iconsBackColor;
  115.  
  116.  
  117. PROCEDURE get* (VAR icons, grayIcons: INTEGER; BackColor: INTEGER);
  118. VAR
  119.         source: INTEGER;
  120. BEGIN
  121.         source := load();
  122.         IF source # 0 THEN
  123.                 icons := KOSAPI.malloc(SIZE*SIZE*4*NumberOfIcons*2);
  124.                 grayIcons := icons + SIZE*SIZE*4*NumberOfIcons;
  125.  
  126.                 copy(source,  2, icons, icoNew);
  127.                 copy(source,  0, icons, icoOpen);
  128.                 copy(source,  5, icons, icoSave);
  129.                 copy(source, 49, icons, icoSearch);
  130.                 copy(source, 37, icons, icoUndo);
  131.                 copy(source, 36, icons, icoRedo);
  132.                 copy(source, 54, icons, icoBuild);
  133.                 copy(source, 53, icons, icoRun);
  134.                 img_destroy(source);
  135.                 source := 0;
  136.                 SYSTEM.MOVE(icons, grayIcons, SIZE*SIZE*4*NumberOfIcons);
  137.  
  138.                 iconsBackColor(grayIcons, -1);
  139.                 iconsBackColor(grayIcons, BackColor);
  140.                 iconsBackColor(icons, BackColor)
  141.         END
  142. END get;
  143.  
  144. END Icons.