28,7 → 28,7 |
// // |
//===================================================// |
|
#define T_TITLE "Icon Editor 0.35" |
#define T_TITLE "Icon Editor 0.37" |
|
#define TOOLBAR_H 24+8 |
#define PANEL_LEFT_W 16+5+5+3+3 |
111,7 → 111,10 |
|
_image image; |
|
#include "actions_history.h" |
|
libimg_image open_image; |
_ActionsHistory actionsHistory; |
|
enum { |
TOOL_NONE = -1, |
145,10 → 148,11 |
void setCurrentTool(int index) { |
resetCurrentTool(); |
|
currentTool = index; |
|
if ((index != TOOL_NONE) && (tools[index].activate != 0)) |
tools[index].activate(); |
|
currentTool = index; |
DrawLeftPanel(); |
} |
|
181,6 → 185,9 |
EventFill(mouseY-canvas.y/zoom.value, |
mouseX-canvas.x/zoom.value, active_color_2); |
|
if ((fill1) || (fill2)) |
actionsHistory.saveCurrentState(); |
|
DrawCanvas(); |
} |
} |
201,9 → 208,16 |
} |
} |
|
bool PencilTool_Drawing = false; |
|
void PencilTool_onMouseEvent(int mouseX, int mouseY, int lkm, int pkm) { |
if (canvas.hovered()) |
{ |
if ((PencilTool_Drawing == true) && (!lkm) && (!pkm)) { |
actionsHistory.saveCurrentState(); |
PencilTool_Drawing = false; |
} |
|
if (lkm) |
image.set_pixel(mouseY-canvas.y/zoom.value, |
mouseX-canvas.x/zoom.value, active_color_1); |
211,128 → 225,108 |
image.set_pixel(mouseY-canvas.y/zoom.value, |
mouseX-canvas.x/zoom.value, active_color_2); |
|
if ((lkm) || (pkm)) |
PencilTool_Drawing = true; |
|
DrawCanvas(); |
} |
} |
|
void PencilTool_reset() { |
PencilTool_Drawing = false; |
} |
|
// Line tool |
struct SimpleFigureTool_State { |
int startX, startY; |
int lastTempPosX, lastTempPosY; |
}; |
|
int LineTool_startX = -1; |
int LineTool_startY = -1; |
int LineTool_lastTempPosX = -1; |
int LineTool_lastTempPosY = -1; |
enum { |
TOOL_LINE_STATE, |
TOOL_RECT_STATE |
}; |
|
void LineTool_reset() { |
LineTool_startX = -1; |
LineTool_startY = -1; |
LineTool_lastTempPosX = -1; |
LineTool_lastTempPosY = -1; |
dword currentFigToolState = -1; |
SimpleFigureTool_State figTool_States[2]; |
|
void SimpleFigureTool_Reset() { |
if (currentTool == TOOL_LINE) |
currentFigToolState = TOOL_LINE_STATE; |
else if (currentTool == TOOL_RECT) |
currentFigToolState = TOOL_RECT_STATE; |
|
figTool_States[currentFigToolState].startX = -1; |
figTool_States[currentFigToolState].startY = -1; |
figTool_States[currentFigToolState].lastTempPosX = -1; |
figTool_States[currentFigToolState].lastTempPosY = -1; |
} |
|
void LineTool_onMouseEvent(int mouseX, int mouseY, int lkm, int pkm) { |
void SimpleFigureTool_onMouseEvent(int mouseX, int mouseY, int lkm, int pkm) { |
if (canvas.hovered()) |
{ |
if (mouse.down) && (mouse.key & MOUSE_LEFT) { |
if ((LineTool_startX < 0) || (LineTool_startY < 0)) { |
LineTool_startX = mouseX; |
LineTool_startY = mouseY; |
if (lkm) { |
if ((figTool_States[currentFigToolState].startX < 0) || (figTool_States[currentFigToolState].startY < 0)) { |
figTool_States[currentFigToolState].startX = mouseX; |
figTool_States[currentFigToolState].startY = mouseY; |
} |
else { |
if ((calc(mouseX - canvas.x/zoom.value) != figTool_States[currentFigToolState].lastTempPosX) |
|| (calc(mouseY - canvas.y/zoom.value) != figTool_States[currentFigToolState].lastTempPosY)) |
{ |
DrawCanvas(); |
} |
} |
} |
else { |
if ((figTool_States[currentFigToolState].startX >= 0) && (figTool_States[currentFigToolState].startY >= 0)) { |
// Draw line from start position to current position |
DrawLine(LineTool_startX - canvas.x/zoom.value, |
LineTool_startY - canvas.y/zoom.value, |
if (currentTool == TOOL_LINE) { |
DrawLine(figTool_States[currentFigToolState].startX - canvas.x/zoom.value, |
figTool_States[currentFigToolState].startY - canvas.y/zoom.value, |
mouseX - canvas.x/zoom.value, |
mouseY - canvas.y/zoom.value, |
active_color_1, |
1); |
DrawCanvas(); |
|
// Reset start position |
LineTool_startX = -1; |
LineTool_startY = -1; |
} |
else if (currentTool == TOOL_RECT) { |
DrawRectangleInCanvas(figTool_States[currentFigToolState].startX - canvas.x/zoom.value, |
figTool_States[currentFigToolState].startY - canvas.y/zoom.value, |
mouseX - canvas.x/zoom.value, |
mouseY - canvas.y/zoom.value, active_color_1, 1); |
} |
|
if ((LineTool_startX >= 0) && (LineTool_startY >= 0)) { |
if ((calc(mouseX - canvas.x/zoom.value) != LineTool_lastTempPosX) |
|| (calc(mouseY - canvas.y/zoom.value) != LineTool_lastTempPosY)) |
{ |
DrawCanvas(); |
|
actionsHistory.saveCurrentState(); |
|
// Reset start position |
figTool_States[currentFigToolState].startX = -1; |
figTool_States[currentFigToolState].startY = -1; |
} |
} |
} |
} |
|
void LineTool_onCanvasDraw() { |
if ((LineTool_startX >= 0) && (LineTool_startY >= 0)) { |
DrawLine(LineTool_startX - canvas.x/zoom.value, |
LineTool_startY - canvas.y/zoom.value, |
void SimpleFigureTool_onCanvasDraw() { |
if ((figTool_States[currentFigToolState].startX >= 0) && (figTool_States[currentFigToolState].startY >= 0) && (mouse.lkm)) { |
if (currentTool == TOOL_LINE) { |
DrawLine(figTool_States[currentFigToolState].startX - canvas.x/zoom.value, |
figTool_States[currentFigToolState].startY - canvas.y/zoom.value, |
mouse.x - canvas.x/zoom.value, |
mouse.y - canvas.y/zoom.value, |
active_color_1, |
2); |
LineTool_lastTempPosX = mouse.x - canvas.x/zoom.value; |
LineTool_lastTempPosY = mouse.y - canvas.y/zoom.value; |
} |
} |
|
// Rect tool |
int RectTool_startX = -1; |
int RectTool_startY = -1; |
int RectTool_lastTempPosX = -1; |
int RectTool_lastTempPosY = -1; |
|
void RectTool_reset() { |
RectTool_startX = -1; |
RectTool_startY = -1; |
RectTool_lastTempPosX = -1; |
RectTool_lastTempPosY = -1; |
} |
|
void RectTool_onMouseEvent(int mouseX, int mouseY, int lkm, int pkm) { |
if ((mouseX>canvas.x) && (mouseY>canvas.y) |
&& (mouseY<canvas.y+canvas.h) |
&& (mouseX<canvas.x+canvas.w)) |
{ |
if (mouse.down) && (mouse.key & MOUSE_LEFT) { |
if ((RectTool_startX < 0) || (RectTool_startY < 0)) { |
RectTool_startX = mouseX; |
RectTool_startY = mouseY; |
} |
else { |
// Draw line from start position to current position |
DrawRectangleInCanvas(RectTool_startX - canvas.x/zoom.value, |
RectTool_startY - canvas.y/zoom.value, |
mouseX - canvas.x/zoom.value, |
mouseY - canvas.y/zoom.value, active_color_1, 1); |
|
DrawCanvas(); |
|
// Reset start position |
RectTool_startX = -1; |
RectTool_startY = -1; |
} |
} |
|
if ((RectTool_startX >= 0) && (RectTool_startY >= 0)) { |
if ((calc(mouseX - canvas.x/zoom.value) != RectTool_lastTempPosX) |
|| (calc(mouseY - canvas.y/zoom.value) != RectTool_lastTempPosY)) |
{ |
DrawCanvas(); |
} |
} |
} |
} |
|
void RectTool_onCanvasDraw() { |
if ((RectTool_startX >= 0) && (RectTool_startY >= 0)) { |
DrawRectangleInCanvas(RectTool_startX - canvas.x/zoom.value, |
RectTool_startY - canvas.y/zoom.value, |
else if (currentTool == TOOL_RECT) { |
DrawRectangleInCanvas(figTool_States[currentFigToolState].startX - canvas.x/zoom.value, |
figTool_States[currentFigToolState].startY - canvas.y/zoom.value, |
mouse.x - canvas.x/zoom.value, |
mouse.y - canvas.y/zoom.value, active_color_1, 2); |
} |
|
RectTool_lastTempPosX = mouse.x - canvas.x/zoom.value; |
RectTool_lastTempPosY = mouse.y - canvas.y/zoom.value; |
figTool_States[currentFigToolState].lastTempPosX = mouse.x - canvas.x/zoom.value; |
figTool_States[currentFigToolState].lastTempPosY = mouse.y - canvas.y/zoom.value; |
} |
} |
|
340,6 → 334,7 |
{ |
tools[0].id = TOOL_PENCIL; |
tools[0].onMouseEvent = #PencilTool_onMouseEvent; |
tools[0].deactivate = #PencilTool_reset; |
|
tools[1].id = TOOL_PIPETTE; |
tools[1].activate = #PipetteTool_activate; |
348,17 → 343,17 |
tools[2].id = TOOL_FILL; |
tools[2].onMouseEvent = #FillTool_onMouseEvent; |
|
tools[3].id = TOOL_PENCIL; |
tools[3].activate = #LineTool_reset; |
tools[3].deactivate = #LineTool_reset; |
tools[3].onMouseEvent = #LineTool_onMouseEvent; |
tools[3].onCanvasDraw = #LineTool_onCanvasDraw; |
tools[3].id = TOOL_LINE; |
tools[3].activate = #SimpleFigureTool_Reset; |
tools[3].deactivate = #SimpleFigureTool_Reset; |
tools[3].onMouseEvent = #SimpleFigureTool_onMouseEvent; |
tools[3].onCanvasDraw = #SimpleFigureTool_onCanvasDraw; |
|
tools[4].id = TOOL_RECT; |
tools[4].activate = #RectTool_reset; |
tools[4].deactivate = #RectTool_reset; |
tools[4].onMouseEvent = #RectTool_onMouseEvent; |
tools[4].onCanvasDraw = #RectTool_onCanvasDraw; |
tools[4].activate = #SimpleFigureTool_Reset; |
tools[4].deactivate = #SimpleFigureTool_Reset; |
tools[4].onMouseEvent = #SimpleFigureTool_onMouseEvent; |
tools[4].onCanvasDraw = #SimpleFigureTool_onCanvasDraw; |
} |
|
void main() |
383,6 → 378,8 |
} |
} |
|
actionsHistory.init(); |
|
initTools(); |
setCurrentTool(TOOL_PENCIL); |
|
490,6 → 487,10 |
if (key_scancode == SCAN_CODE_KEY_F) setCurrentTool(TOOL_FILL); |
if (key_scancode == SCAN_CODE_KEY_L) setCurrentTool(TOOL_LINE); |
if (key_scancode == SCAN_CODE_KEY_R) setCurrentTool(TOOL_RECT); |
|
if (key_scancode == SCAN_CODE_KEY_S) actionsHistory.undoLastAction(); |
if (key_scancode == SCAN_CODE_KEY_C) actionsHistory.redoLastAction(); |
|
if (key_scancode == SCAN_CODE_MINUS) {zoom.click(BTN_ZOOM_OUT); DrawEditArea();} |
if (key_scancode == SCAN_CODE_PLUS) {zoom.click(BTN_ZOOM_IN); DrawEditArea();} |
break; |