Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions utip.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
.brush_button {
width: 30px;
height: 30px;
margin: 2px;
border-radius: 3px;
display: inline-block;
text-align: center;
vertical-align: middle;
}
.brush_button_background {
background: lightgray;
}
.brush_size {
text-align: center;
background: black;
}
38 changes: 38 additions & 0 deletions utip.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Тестовое задание Боровенников</title>
<link rel="stylesheet" type="text/css" href="utip.css"/>
<script src="utip.js"></script>
</head>
<body onload="on_load();">
<div id="canvas_container" style="width: 300px; height: 150px; margin: 5px; border-style: solid">
<canvas id="canvas"></canvas>
</div>
<div id="palette" style="margin: 5px; border-style: groove; width: 300px">
Цвет
<div id="red" class="brush_button" style="background: red" onclick="set_brush('red');"></div>
<div id="green" class="brush_button" style="background: green" onclick="set_brush('green');"></div>
<div id="blue" class="brush_button" style="background: blue" onclick="set_brush('blue');"></div>
<div id="black" class="brush_button" style="background: black" onclick="set_brush('black');"></div>
<div id="gray" class="brush_button" style="background: gray" onclick="set_brush('gray');"></div>
</div>
<div id="brush" style="margin: 5px; border-style: groove; width: 300px">
Кисть
<div id="small" class="brush_button brush_button_background" onclick="set_brush('small');">
<div class="brush_size" style="width: 4px; height: 4px; border-radius: 2px; margin: 13px"></div>
</div>
<div id="medium" class="brush_button brush_button_background" onclick="set_brush('medium');">
<div class="brush_size" style="width: 10px; height: 10px; border-radius: 5px; margin: 10px"></div>
</div>
<div id="large" class="brush_button brush_button_background" onclick="set_brush('large');">
<div class="brush_size" style="width: 20px; height: 20px; border-radius: 10px; margin: 5px"></div>
</div>
</div>
<div id="buttons" style="margin: 5px;">
<button onclick="save_canvas();">Сохранить</button>
<button onclick="clear_canvas();">Очистить</button>
</div>
</body>
</html>
130 changes: 130 additions & 0 deletions utip.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
function on_load() {
set_brush('red');
set_brush('small');
window.canvas_element = document.getElementById("canvas");
window.ctx = window.canvas_element.getContext('2d');
window.ctx.lineCap = 'round';
window.canvas_element.addEventListener('mousedown', begin_draw);
window.canvas_element.addEventListener('mousemove', continue_draw);
window.canvas_element.addEventListener('mouseup', end_draw);
load_image_data();
window.addEventListener("storage", storage_handler);
}

function storage_handler() {
load_image_data();
}

function set_brush(sender_id) {

var set_color_selection = function () {
['red', 'green', 'blue', 'black', 'gray'].forEach(function (color) {
var button = document.getElementById(color);
if (button) {
if (color == window.selected_color)
button.style.borderStyle = 'solid';
else
button.style.borderStyle = 'inset';
}
});
};

var set_brush_size_selection = function () {
['small', 'medium', 'large'].forEach(function (color) {
var button = document.getElementById(color);
if (button) {
if (color == window.selected_brush)
button.style.borderStyle = 'solid';
else
button.style.borderStyle = 'inset';
}
});
};

switch (sender_id) {
case 'red':
case 'green':
case 'blue':
case 'black':
case 'gray':
window.selected_color = sender_id;
set_color_selection();
break;
case 'small':
case 'medium':
case 'large':
window.selected_brush = sender_id;
set_brush_size_selection();
break;
}
}

function begin_draw(e) {
var size = 0;
switch (window.selected_brush) {
case 'small':
size = 4;
break;
case 'medium':
size = 10;
break;
case 'large':
size = 20;
break;
}
window.ctx.strokeStyle = window.selected_color;
window.drawing = true;
window.ctx.beginPath();
window.ctx.lineWidth = 1;
window.ctx.arc(e.x - window.canvas_element.offsetLeft, e.y - window.canvas_element.offsetTop, size / 2, 0, 2 * Math.PI);
window.ctx.fillStyle = window.selected_color;
window.ctx.fill();
window.ctx.stroke();
window.ctx.beginPath();
window.ctx.moveTo(e.x - window.canvas_element.offsetLeft, e.y - window.canvas_element.offsetTop);
window.ctx.lineWidth = size;
}

function continue_draw(e) {
if (window.drawing) {
window.ctx.lineTo(e.x - window.canvas_element.offsetLeft, e.y - window.canvas_element.offsetTop);
window.ctx.stroke();
window.ctx.beginPath();
window.ctx.moveTo(e.x - window.canvas_element.offsetLeft, e.y - window.canvas_element.offsetTop);
}
}

function end_draw(e) {
window.ctx.fillStyle = window.selected_color;
window.ctx.lineTo(e.x - window.canvas_element.offsetLeft, e.y - window.canvas_element.offsetTop);
window.ctx.stroke();
window.drawing = false;
}

function save_canvas() {
var image_data = window.ctx.getImageData(0, 0, window.canvas_element.width, window.canvas_element.height);
localStorage['utip.canvas'] = image_data.data.toString();
}

function clear_canvas() {
window.ctx.clearRect(0, 0, window.canvas_element.width, window.canvas_element.height);
}

function load_image_data() {
var saved_image_data = localStorage['utip.canvas'];
if (saved_image_data) {
var image_data = window.ctx.getImageData(0, 0, window.canvas_element.width, window.canvas_element.height);
var array = saved_image_data.split(',');
if (array.length == image_data.data.length) {
for (var i = 0; i < array.length; i += 4) {
if (array[i] != '0' || array[i + 1] != '0' || array[i + 2] != '0') {
image_data.data[i] = parseInt(array[i]); //red
image_data.data[i + 1] = parseInt(array[i + 1]); // blue
image_data.data[i + 2] = parseInt(array[i + 2]); // green
image_data.data[i + 3] = parseInt(array[i + 3]); // alpha
}
}
window.ctx.putImageData(image_data, 0, 0);
}
}
}