IconEdit 0.7 Beta: open image of any color depth, bugfixes

lib/patterns/libimg_load_skin.h: convert into object

git-svn-id: svn://kolibrios.org@7977 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2020-05-24 16:46:26 +00:00
parent b75bb6ed4d
commit 25c205ad05
14 changed files with 120 additions and 76 deletions

View File

@ -207,19 +207,19 @@ void Write_Error(int error_number)
void LoadIcons()
{
//ICONS16.PNG
Libimg_LoadImage(#icons16_default, "/sys/icons16.png");
Libimg_LoadImage(#icons16_selected, "/sys/icons16.png");
Libimg_ReplaceColor(icons16_selected.image, icons16_selected.w, icons16_selected.h, 0xffFFFfff, col.selec);
Libimg_ReplaceColor(icons16_selected.image, icons16_selected.w, icons16_selected.h, 0xffCACBD6, MixColors(col.selec, 0, 200));
icons16_default.load("/sys/icons16.png");
icons16_selected.load("/sys/icons16.png");
icons16_selected.replace_color(0xffFFFfff, col.selec);
icons16_selected.replace_color(0xffCACBD6, MixColors(col.selec, 0, 200));
if (col.list_bg!=0xFFFfff) {
Libimg_ReplaceColor(icons16_default.image, icons16_selected.w, icons16_selected.h, 0xffFFFfff, col.list_bg);
Libimg_ReplaceColor(icons16_default.image, icons16_selected.w, icons16_selected.h, 0xffCACBD6, MixColors(col.list_bg, 0, 200));
icons16_default.replace_color(0xffFFFfff, col.list_bg);
icons16_default.replace_color(0xffCACBD6, MixColors(col.list_bg, 0, 200));
}
//ICONS32.PNG
Libimg_LoadImage(#icons32_default, "/sys/icons32.png");
Libimg_LoadImage(#icons32_selected, "/sys/icons32.png");
Libimg_ReplaceColor(icons32_default.image, icons32_selected.w, icons32_selected.h, 0x00000000, col.list_bg);
Libimg_ReplaceColor(icons32_selected.image, icons32_selected.w, icons32_selected.h, 0x00000000, col.selec);
icons32_default.load("/sys/icons32.png");
icons32_selected.load("/sys/icons32.png");
icons32_default.replace_color(0x00000000, col.list_bg);
icons32_selected.replace_color(0x00000000, col.selec);
}
void SetAppColors()

View File

@ -165,7 +165,7 @@ dword _image::get_pixel(int _r, _c)
void _image::set_image(dword _inbuf)
{
dword i;
for (i = 0; i < columns*rows; i++;)
for (i = 0; i < columns*rows-1; i++;)
{
// mas[i] = ESDWORD[i*4+_inbuf] & 0x00FFFFFF; //for x32 bit color
mas[i] = ESDWORD[i*3+_inbuf] & 0xFFFFFF;

View File

@ -9,7 +9,7 @@ cls
@del lang.h--
if exist iconedit (
"C:\Program Files (x86)\WinImage\winimage.exe" "C:\Users\Leency\Desktop\kolibri.img" /H /Q /I iconedit
"C:\Program Files (x86)\WinImage\winimage.exe" "D:\Kolibri\Desktop\kolibri.img" /H /Q /I iconedit
d:
cd "D:\Kolibri\Infrastructure\QEMU"
call "z_kos.bat"

View File

@ -9,7 +9,7 @@ cls
@del lang.h--
if exist iconedit (
"C:\Program Files (x86)\WinImage\winimage.exe" "C:\Users\Leency\Desktop\kolibri.img" /H /Q /I iconedit
"C:\Program Files (x86)\WinImage\winimage.exe" "D:\Kolibri\Desktop\kolibri.img" /H /Q /I iconedit
d:
cd "D:\Kolibri\Infrastructure\QEMU"
call "z_kos.bat"

View File

@ -32,12 +32,16 @@
//===================================================//
#ifdef LANG_RUS
char edit_menu_items[] =
"‚ë१ âì|Ctrl+X
Š®¯¨à®¢ âì|Ctrl+C
áâ ¢¨âì|Ctrl+V";
char image_menu_items[] =
"Š®«¨ç¥á⢮ ¨á¯®«ì§®¢ ­­ëå 梥⮢
 ¬¥­¨âì ¢á¥ æ¢¥â  1 ­  2";
?define T_MENU_IMAGE "ˆª®­ª "
?define T_TEST_ICON "<EFBFBD>஢¥à¨âì ¨ª®­ªã"
?define T_TITLE "<EFBFBD>¥¤ ªâ®à ¨ª®­®ª 0.60 Alpha"
?define T_TITLE "<EFBFBD>¥¤ ªâ®à ¨ª®­®ª 0.70 Beta"
?define T_UNIC_COLORS_COUNT "'“­¨ª «ì­ëå 梥⮢: %i.' -I"
?define T_TOO_BIG_IMAGE_FOR_PREVIEW "'IconEdit
ˆ§®¡à ¦¥­¨¥ ᫨誮¬ ¡®«ì讥 ¤«ï ¯à¥¤¯à®á¬®âà !' -tE"
@ -45,12 +49,16 @@ char image_menu_items[] =
?define T_ERROR_IMA_ICONEDIT "'<27>â® ¯à®á⮠। ªâ®à ¨ª®­®ª, ¢ë¡à ­®¥
¨§®¡à ¦¥­¨¥ ᫨誮¬ ¢¥«¨ª® ¤«ï ­¥£®!' -E"
#else
char edit_menu_items[] =
"Cut|Ctrl+X
Copy|Ctrl+C
Paste|Ctrl+V";
char image_menu_items[] =
"Count colors used
Replace all colors equal to 1 by 2";
?define T_MENU_IMAGE "Icon"
?define T_TEST_ICON "Test Icon"
?define T_TITLE "Icon Editor 0.60 Alpha"
?define T_TITLE "Icon Editor 0.70 Beta"
?define T_UNIC_COLORS_COUNT "'Image has %i unique colors.' -I"
?define T_TOO_BIG_IMAGE_FOR_PREVIEW "'IconEdit
Image is too big for preview!' -tE"
@ -160,28 +168,26 @@ void main()
{
word btn;
libimg_image open_image;
dword bg_col;
load_dll(libio, #libio_init, 1);
load_dll(libimg, #libimg_init, 1);
load_dll(boxlib, #box_lib_init,0);
Libimg_LoadImage(#top_icons, "/sys/icons16.png");
Libimg_LoadImage(#left_icons, "/sys/icons16.png");
top_icons.load("/sys/icons16.png");
left_icons.load("/sys/icons16.png");
sc.get();
bg_col = sc.work;
bg_dark = skin_is_dark();
semi_white = MixColors(sc.work, 0xFFFfff, bg_dark*90 + 96);
Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffFFFfff, semi_white);
Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffCACBD6, MixColors(semi_white, 0, 220));
top_icons.replace_color(0xffFFFfff, semi_white);
top_icons.replace_color(0xffCACBD6, MixColors(semi_white, 0, 220));
Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffFFFfff, sc.work);
Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffCACBD6, MixColors(sc.work, 0, 200));
left_icons.replace_color(0xffFFFfff, sc.work);
left_icons.replace_color(0xffCACBD6, MixColors(sc.work, 0, 200));
//fix line and rectandle color for dark skins
if (bg_dark) Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xff545454, 0xffD3D3D4);
if (bg_dark) left_icons.replace_color(0xff545454, 0xffD3D3D4);
EventSetActiveColor(1, color1);
@ -190,7 +196,7 @@ void main()
}
else
{
Libimg_LoadImage(#open_image, #param);
open_image.load_as24b(#param);
if (open_image.w*open_image.h>MAX_CELL_SIZE*MAX_CELL_SIZE) {
notify(T_ERROR_IMA_ICONEDIT);
@ -369,14 +375,13 @@ void DrawWindow()
DrawBar(0, 0, Form.cwidth, TOPBAR_H-1, sc.work);
DrawBar(0, TOPBAR_H-1, Form.cwidth, 1, sc.work_graph);
tx.n = 5-GAPH;
DrawTopPanelButton(#EventCreateNewIcon, ECTRL + SCAN_CODE_KEY_N, tx.inc(GAPH), 2);
DrawTopPanelButton(#EventCreateNewIcon, ECTRL + SCAN_CODE_KEY_N, tx.set(5), 2);
DrawTopPanelButton(#EventOpenIcon, ECTRL + SCAN_CODE_KEY_O, tx.inc(GAPH), 0);
DrawTopPanelButton(#EventSaveIconToFile, ECTRL + SCAN_CODE_KEY_S, tx.inc(GAPH), 5);
DrawTopPanelButton(#EventMoveLeft, ECTRL + SCAN_CODE_LEFT, tx.inc(GAPH+BLOCK_SPACE), 30);
DrawTopPanelButton(#EventMoveLeft, ECTRL + SCAN_CODE_LEFT, tx.inc(GAPH+BLOCK_SPACE), 30);
DrawTopPanelButton(#EventMoveRight, ECTRL + SCAN_CODE_RIGHT, tx.inc(GAPH), 31);
DrawTopPanelButton(#EventMoveUp, ECTRL + SCAN_CODE_UP, tx.inc(GAPH), 32);
DrawTopPanelButton(#EventMoveDown, ECTRL + SCAN_CODE_DOWN, tx.inc(GAPH), 33);
DrawTopPanelButton(#EventMoveUp, ECTRL + SCAN_CODE_UP, tx.inc(GAPH), 32);
DrawTopPanelButton(#EventMoveDown, ECTRL + SCAN_CODE_DOWN, tx.inc(GAPH), 33);
DrawTopPanelButton(#EventFlipHor, 0, tx.inc(GAPH+BLOCK_SPACE), 34);
DrawTopPanelButton(#EventFlipVer, 0, tx.inc(GAPH), 35);
DrawTopPanelButton(#EventRotateLeft, ECTRL + SCAN_CODE_KEY_L, tx.inc(GAPH), 37);
@ -384,7 +389,7 @@ void DrawWindow()
DrawTopPanelButton(#EventTestIcon, ECTRL + SCAN_CODE_KEY_T, tx.inc(GAPH+BLOCK_SPACE), 12);
DrawTopPanelButton(#EventCrop, 0, tx.inc(GAPH+BLOCK_SPACE), 46);
image_menu_btn.x = tx.n;
image_menu_btn.x = tx.inc(GAPH+BLOCK_SPACE);
image_menu_btn.w = DrawFlatPanelButton(button.add(#EventShowImageMenu), image_menu_btn.x, image_menu_btn.y, T_MENU_IMAGE);
//tx.inc(image_menu_btn.w + BLOCK_SPACE);
@ -742,6 +747,12 @@ void EventShowImageMenu()
image_menu_btn.y + image_menu_btn.h, MENU_ALIGN_TOP_LEFT, NULL, #image_menu_items);
}
void EventShowEditMenu()
{
open_lmenu(Form.left+5 + image_menu_btn.x, Form.top+skin_height +
image_menu_btn.y + image_menu_btn.h, MENU_ALIGN_TOP_LEFT, NULL, #edit_menu_items);
}
void EventCheckMenuItemSelected()
{
switch(get_menu_click()) {
@ -794,14 +805,14 @@ void EventFlipVer() { EventMove(FLIP_VER); }
void EventRotateLeft() { EventMove(ROTATE_LEFT); }
void EventRotateRight() { EventMove(ROTATE_RIGHT); }
void EventSelectToolPencil() { setCurrentTool(TOOL_PENCIL); DrawLeftPanelSelection(); }
void EventSelectToolPick() { setCurrentTool(TOOL_PIPETTE); DrawLeftPanelSelection(); }
void EventSelectToolFill() { setCurrentTool(TOOL_FILL); DrawLeftPanelSelection(); }
void EventSelectToolLine() { setCurrentTool(TOOL_LINE); DrawLeftPanelSelection(); }
void EventSelectToolRect() { setCurrentTool(TOOL_RECT); DrawLeftPanelSelection(); }
void EventSelectToolBar() { setCurrentTool(TOOL_BAR); DrawLeftPanelSelection(); }
void EventSelectToolSelect() { setCurrentTool(TOOL_SELECT); DrawLeftPanelSelection(); }
void EventSelectToolScrCopy() { setCurrentTool(TOOL_SCREEN_COPY); DrawLeftPanelSelection(); }
void EventSelectToolPencil() { setCurrentTool(TOOL_PENCIL); }
void EventSelectToolPick() { setCurrentTool(TOOL_PIPETTE); }
void EventSelectToolFill() { setCurrentTool(TOOL_FILL); }
void EventSelectToolLine() { setCurrentTool(TOOL_LINE); }
void EventSelectToolRect() { setCurrentTool(TOOL_RECT); }
void EventSelectToolBar() { setCurrentTool(TOOL_BAR); }
void EventSelectToolSelect() { setCurrentTool(TOOL_SELECT); }
void EventSelectToolScrCopy() { setCurrentTool(TOOL_SCREEN_COPY); }
char test_icon_stak22[4096];

View File

@ -2,7 +2,7 @@
#define TOCANVAS 2
struct Tool {
struct TOOL {
int id;
dword cursor;
void (*activate)();
@ -10,11 +10,10 @@ struct Tool {
void (*onMouseEvent)(int x, int y, int lkm, int pkm);
void (*onKeyEvent)(dword keycode);
void (*onCanvasDraw)();
};
} tools[8];
int previousTool = -1;
int currentTool = -1;
Tool tools[8];
enum {
TOOL_NONE = -1,
@ -108,6 +107,7 @@ void setCurrentTool(int index) {
Cursor.Restore();
if (wrapper.hovered()) SetCursor();
DrawCanvas();
DrawLeftPanelSelection();
}
void SetCursor()

View File

@ -30,6 +30,7 @@ dword img_destroy = #aimg_destroy;
dword img_draw = #aimg_draw;
dword img_create = #aimg_create;
dword img_encode = #aimg_encode;
dword img_convert = #aimg_convert;
//dword img_flip = #aimg_flip;
//dword img_rotate = #aimg_rotate;
@ -42,11 +43,14 @@ char aimg_to_rgb2[] = "img_to_rgb2";
char aimg_decode[] = "img_decode";
char aimg_destroy[] = "img_destroy";
char aimg_draw[] = "img_draw";
char aimg_create[] = "img_create";
char aimg_encode[] = "img_encode";
char aimg_create[] = "img_create";
char aimg_encode[] = "img_encode";
char aimg_convert[] = "img_convert";
//char aimg_flip[] = "img_flip";
//char aimg_rotate[] = "img_rotate ";
//invoke img.scale, ebx, 0, 0, [ebx + Image.Width], [ebx + Image.Height], 0, LIBIMG_SCALE_TYPE_STRETCH, LIBIMG_SCALE_ALG_BILINEAR, edx, ecx
#define LIBIMG_FORMAT_BMP 1
#define LIBIMG_FORMAT_ICO 2
#define LIBIMG_FORMAT_CUR 3
@ -236,6 +240,13 @@ struct _Image
}
}
:dword convert_image(dword _image_pointer, _w, _h, _path)
{
img_convert stdcall(_image_pointer, 0, Image_bpp32, 0, 0);
if (EAX!=0)
mov [image_converted], eax
}
#ifndef INCLUDE_LIBIMG_LOAD_SKIN_H
#include "../lib/patterns/libimg_load_skin.h"
#endif

View File

@ -7,38 +7,60 @@
:struct libimg_image {
dword image, w, h, imgsrc;
void load_as24b();
void load();
void replace_color();
void fill_transparent();
} skin;
:void Libimg_LoadImage(dword struct_pointer, file_path)
:void libimg_image::load_as24b(dword file_path)
{
dword image_pointer;
image_pointer = load_image(file_path);
dword image_pointer = load_image(file_path);
if (!image_pointer) notify("'Error: Image not loaded' -E");
ESDWORD[struct_pointer] = image_pointer;
ESDWORD[struct_pointer+4] = DSWORD[image_pointer+4];
ESDWORD[struct_pointer+8] = DSWORD[image_pointer+8];
ESDWORD[struct_pointer+12] = ESDWORD[image_pointer+24];
img_convert stdcall(image_pointer, 0, Image_bpp24, 0, 0);
if (!EAX) {
notify("'Error: Image can not be converted to 24b' -E");
} else {
image = image_pointer = EAX;
w = DSWORD[image_pointer+4];
h = DSWORD[image_pointer+8];
imgsrc = ESDWORD[image_pointer+24];
}
}
:void Libimg_ReplaceColor(dword struct_pointer, w, h, old_color, new_color)
:void libimg_image::load(dword file_path)
{
dword i, max_i, image_data;
image_data = ESDWORD[struct_pointer + 24];
max_i = w * h * 4 + image_data;
for (i = image_data; i < max_i; i += 4) if (DSDWORD[i]==old_color) DSDWORD[i] = new_color;
dword image_pointer = load_image(file_path);
if (!EAX) {
notify("'Error: Image not loaded' -E");
} else {
image = image_pointer = EAX;
w = DSWORD[image_pointer+4];
h = DSWORD[image_pointer+8];
imgsrc = ESDWORD[image_pointer+24];
}
}
:void Libimg_FillTransparent(dword struct_pointer, w, h, new_color)
:void libimg_image::replace_color(dword old_color, new_color)
{
if (new_color!=0) Libimg_ReplaceColor(struct_pointer, w, h, 0, new_color);
dword i, max_i;
max_i = w * h * 4 + imgsrc;
for (i = imgsrc; i < max_i; i += 4) if (DSDWORD[i]==old_color) DSDWORD[i] = new_color;
}
:void libimg_image::fill_transparent(new_color)
{
if (new_color) replace_color(0, new_color);
}
:libimg_image icons32draw;
:void DrawIcon32(dword x,y, bg, icon_n) {
//load_dll(libimg, #libimg_init,1);
if (!icons32draw.image) {
Libimg_LoadImage(#icons32draw, "/sys/icons32.png");
Libimg_FillTransparent(icons32draw.image, icons32draw.w, icons32draw.h, bg);
icons32draw.load("/sys/icons32.png");
icons32draw.fill_transparent(bg);
}
if (icon_n>=0) img_draw stdcall(icons32draw.image, x, y, 32, 32, 0, icon_n*32);
}
@ -47,9 +69,9 @@
:void DrawIcon16(dword x,y, bg, icon_n) {
//load_dll(libimg, #libimg_init,1);
if (!icons16draw.image) {
Libimg_LoadImage(#icons16draw, "/sys/icons16.png");
Libimg_ReplaceColor(icons16draw.image, icons16draw.w, icons16draw.h, 0xffFFFfff, bg);
Libimg_ReplaceColor(icons16draw.image, icons16draw.w, icons16draw.h, 0xffCACBD6, MixColors(bg, 0, 220));
icons16draw.load("/sys/icons16.png");
icons16draw.replace_color(0xffFFFfff, bg);
icons16draw.replace_color(0xffCACBD6, MixColors(bg, 0, 220));
}
if (icon_n>=0) img_draw stdcall(icons16draw.image, x, y, 16, 16, 0, icon_n*16);
}

View File

@ -6,14 +6,14 @@ unsigned int DrawTopPanelButton(dword _button_id, _x, _y, signed int _icon_n, bo
static dword semi_white=0, bg_col_light, bg_col_dark;
int i;
if (!semi_white) {
Libimg_LoadImage(#top_icons, "/sys/icons16.png");
top_icons.load("/sys/icons16.png");
semi_white = MixColors(sc.work, 0xFFFfff, skin_is_dark()*90 + 96);
bg_col_dark = MixColors(sc.work, sc.work_graph, 90);
bg_col_light = MixColors(semi_white, 0xFFFfff, skin_is_dark()*90 + 10);
Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffFFFfff, semi_white);
Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffCACBD6, MixColors(semi_white, 0, 220));
top_icons.replace_color(0xffFFFfff, semi_white);
top_icons.replace_color(0xffCACBD6, MixColors(semi_white, 0, 220));
}
DrawWideRectangle(_x+1, _y+1, TSZE, TSZE, 5, semi_white);

View File

@ -44,8 +44,8 @@ void main()
load_dll(libio, #libio_init,1);
load_dll(libimg, #libimg_init,1);
Libimg_LoadImage(#skin, "/sys/icons32.png");
Libimg_FillTransparent(skin.image, skin.w, skin.h, COLOR_CELL_BG);
skin.load("/sys/icons32.png");
skin.fill_transparent(COLOR_CELL_BG);
NewGame();

View File

@ -151,8 +151,8 @@ void SetAppColors()
void LoadImages()
{
Libimg_LoadImage(#skin, "/sys/icons32.png");
Libimg_FillTransparent(skin.image, skin.w, skin.h, swc.list_bg);
skin.load("/sys/icons32.png");
skin.fill_transparent(swc.list_bg);
}

View File

@ -27,7 +27,7 @@ void LoadIniConfig()
win_y_small = ini.GetInt("win_y_small", -1);
ini.GetString("last_folder", #work_folder, sizeof(work_folder), NULL);
Libimg_LoadImage(#skin, abspath("pixieskn.png"));
skin.load(abspath("pixieskn.png"));
skin.w = 322;
theme.color_top_panel_bg = 0x242424;
theme.color_top_panel_folder_name = 0xEEEeee;

View File

@ -64,8 +64,8 @@ void main()
load_dll(libimg, #libimg_init,1);
load_dll(libini, #lib_init,1);
Libimg_LoadImage(#skin, "/sys/icons32.png");
Libimg_FillTransparent(skin.image, skin.w, skin.h, COLOR_BG);
skin.load("/sys/icons32.png");
skin.fill_transparent(COLOR_BG);
ini_get_int stdcall ("/sys/appicons.ini", "taskbar", "attachement", ATTACHEMENT_BOTTOM);
attachement = EAX;

View File

@ -126,9 +126,9 @@ void main()
load_dll(libio, #libio_init,1);
load_dll(libimg, #libimg_init,1);
Libimg_LoadImage(#menu, abspath("menu.png"));
Libimg_LoadImage(#road, abspath("road.png"));
Libimg_LoadImage(#objects, abspath("objects.png"));
menu.load(abspath("menu.png"));
road.load(abspath("road.png"));
objects.load(abspath("objects.png"));
loop()
{