-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathangular-wall-painter.js
111 lines (92 loc) · 3.13 KB
/
angular-wall-painter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
(function() {
'use strict';
var wallPainterDirective = function() {
var directive = {
restrict: 'E',
template: '' +
'<div class="wall-painter-container" ng-class="{\'paint-above-image\': paintAboveImage}">' +
'<img ng-src="{{ imageUrl }}">' +
'<canvas class="walls" />' +
'<canvas class="windows" />' +
'</div>',
replace: true,
scope: {
wallPainterImg: '@',
wallPainterWalls: '@',
wallPainterColors: '@',
wallPainterWindows: '@',
wallPainterPaintAboveImage: '@'
},
link: function(scope, elem) {
var walls = JSON.parse(scope.wallPainterWalls);
var windows = scope.wallPainterWindows ? JSON.parse(scope.wallPainterWindows) : [];
var colors = JSON.parse(scope.wallPainterColors);
var imgElem = elem.find('img')[0];
var baseCanvasElem = elem.find('canvas')[0];
var windowsCanvasElem = elem.find('canvas')[1];
var bc = baseCanvasElem.getContext('2d'); // base canvas - for walls
var wc = windowsCanvasElem.getContext('2d'); // canvas for windows
var colorsWatch = scope.$watch('wallPainterColors', function(newVal, oldVal) {
if (newVal !== oldVal) {
colors = JSON.parse(newVal);
bc.clearRect(0, 0, baseCanvasElem.width, baseCanvasElem.height);
paintWalls();
}
});
scope.paintAboveImage = scope.wallPainterPaintAboveImage;
scope.imageUrl = scope.wallPainterImg;
imgElem.onload = function() {
baseCanvasElem.width = imgElem.width;
baseCanvasElem.height = imgElem.height;
windowsCanvasElem.width = imgElem.width;
windowsCanvasElem.height = imgElem.height;
paintWalls();
buildWindows();
};
scope.$on('$destroy', function() {
imgElem = null;
baseCanvasElem = null;
windowsCanvasElem = null;
bc = null;
wc = null;
colorsWatch();
});
function paintWalls() {
walls.forEach(function(points, wallIndex) {
bc.fillStyle = colors[wallIndex];
bc.beginPath();
points.forEach(function(point, pointIndex) {
if (pointIndex === 0) {
bc.moveTo(point[0], point[1]);
} else {
bc.lineTo(point[0], point[1]);
}
});
bc.closePath();
bc.fill();
});
}
function buildWindows() {
windows.forEach(function(points) {
wc.save();
wc.beginPath();
points.forEach(function(point, pointIndex) {
if (pointIndex === 0) {
wc.moveTo(point[0], point[1]);
} else {
wc.lineTo(point[0], point[1]);
}
});
wc.closePath();
wc.clip();
wc.drawImage(imgElem, 0, 0);
wc.restore();
});
}
}
};
return directive;
};
angular.module('angular-wall-painter', [])
.directive('wallPainter', wallPainterDirective);
})();