Simplified Rectangle.js and pixelUtils

This commit is contained in:
juliandescottes
2012-09-14 22:20:00 +02:00
parent 9e03290df5
commit 813b60b854
5 changed files with 48 additions and 88 deletions

View File

@ -45,6 +45,10 @@
background-image: url(../img/tools/icons/rectangle.png); background-image: url(../img/tools/icons/rectangle.png);
} }
.tool-icon.tool-circle {
background-image: url(../img/tools/cursors/circle.png);
}
.tool-icon.tool-move { .tool-icon.tool-move {
background-image: url(../img/tools/icons/hand.png); background-image: url(../img/tools/icons/hand.png);
} }
@ -77,6 +81,10 @@
cursor: url(../img/tools/cursors/rectangle.png) 4 21, pointer; cursor: url(../img/tools/cursors/rectangle.png) 4 21, pointer;
} }
.tool-circle .drawing-canvas-container:hover {
cursor: url(../img/tools/cursors/circle.png) 4 21, pointer;
}
.tool-move .drawing-canvas-container:hover { .tool-move .drawing-canvas-container:hover {
cursor: url(../img/tools/cursors/hand.png) 14 12, pointer; cursor: url(../img/tools/cursors/hand.png) 14 12, pointer;
} }

View File

@ -31,6 +31,7 @@
<li class="tool-icon tool-paint-bucket" data-tool-id="tool-paint-bucket" title="Bucket tool"></li> <li class="tool-icon tool-paint-bucket" data-tool-id="tool-paint-bucket" title="Bucket tool"></li>
<li class="tool-icon tool-stroke" data-tool-id="tool-stroke" title="Stroke tool"></li> <li class="tool-icon tool-stroke" data-tool-id="tool-stroke" title="Stroke tool"></li>
<li class="tool-icon tool-rectangle" data-tool-id="tool-rectangle" title="Rectangle tool"></li> <li class="tool-icon tool-rectangle" data-tool-id="tool-rectangle" title="Rectangle tool"></li>
<li class="tool-icon tool-circle" data-tool-id="tool-circle" title="Circle tool"></li>
<li class="tool-icon tool-move" data-tool-id="tool-move" title="Move tool"></li> <li class="tool-icon tool-move" data-tool-id="tool-move" title="Move tool"></li>
<li class="tool-icon tool-select" data-tool-id="tool-select" title="Move tool"></li> <li class="tool-icon tool-select" data-tool-id="tool-select" title="Move tool"></li>
</ul> </ul>
@ -113,12 +114,16 @@
<script src="js/selection/RectangularSelection.js"></script> <script src="js/selection/RectangularSelection.js"></script>
<script src="js/Palette.js"></script> <script src="js/Palette.js"></script>
<script src="js/Notification.js"></script> <script src="js/Notification.js"></script>
<!-- Tools-->
<script src="js/drawingtools/BaseTool.js"></script> <script src="js/drawingtools/BaseTool.js"></script>
<script src="js/drawingtools/SimplePen.js"></script> <script src="js/drawingtools/SimplePen.js"></script>
<script src="js/drawingtools/Eraser.js"></script> <script src="js/drawingtools/Eraser.js"></script>
<script src="js/drawingtools/Stroke.js"></script> <script src="js/drawingtools/Stroke.js"></script>
<script src="js/drawingtools/PaintBucket.js"></script> <script src="js/drawingtools/PaintBucket.js"></script>
<script src="js/drawingtools/Rectangle.js"></script> <script src="js/drawingtools/Rectangle.js"></script>
<script src="js/drawingtools/Circle.js"></script>
<script src="js/drawingtools/Move.js"></script> <script src="js/drawingtools/Move.js"></script>
<script src="js/drawingtools/RectangularSelect.js"></script> <script src="js/drawingtools/RectangularSelect.js"></script>
<script src="js/ToolSelector.js"></script> <script src="js/ToolSelector.js"></script>

View File

@ -15,6 +15,7 @@ pskl.ToolSelector = (function() {
"paintBucket" : new pskl.drawingtools.PaintBucket(), "paintBucket" : new pskl.drawingtools.PaintBucket(),
"stroke" : new pskl.drawingtools.Stroke(), "stroke" : new pskl.drawingtools.Stroke(),
"rectangle" : new pskl.drawingtools.Rectangle(), "rectangle" : new pskl.drawingtools.Rectangle(),
"circle" : new pskl.drawingtools.Circle(),
"move" : new pskl.drawingtools.Move(), "move" : new pskl.drawingtools.Move(),
"select" : new pskl.drawingtools.Select() "select" : new pskl.drawingtools.Select()
}; };

View File

@ -29,20 +29,12 @@
ns.Rectangle.prototype.moveToolAt = function(col, row, color, frame, overlay) { ns.Rectangle.prototype.moveToolAt = function(col, row, color, frame, overlay) {
overlay.clear(); overlay.clear();
// When the user moussemove (before releasing), we dynamically compute the
// pixel to draw the line and draw this line in the overlay :
var strokePoints = pskl.PixelUtils.getBoundRectanglePixels(this.startCol, this.startRow, col, row);
if(color == Constants.TRANSPARENT_COLOR) { if(color == Constants.TRANSPARENT_COLOR) {
color = Constants.SELECTION_TRANSPARENT_COLOR; color = Constants.SELECTION_TRANSPARENT_COLOR;
} }
// Drawing current stroke: // draw in overlay
for(var i = 0; i< strokePoints.length; i++) { this.drawRectangle(col, row, color, overlay);
overlay.setPixel(strokePoints[i].col, strokePoints[i].row, color);
}
}; };
/** /**
@ -50,52 +42,17 @@
*/ */
ns.Rectangle.prototype.releaseToolAt = function(col, row, color, frame, overlay) { ns.Rectangle.prototype.releaseToolAt = function(col, row, color, frame, overlay) {
overlay.clear(); overlay.clear();
// If the stroke tool is released outside of the canvas, we cancel the stroke: if(frame.containsPixel(col, row)) { // cancel if outside of canvas
if(frame.containsPixel(col, row)) { // draw in frame to finalize
var strokePoints = pskl.PixelUtils.getBoundRectanglePixels(this.startCol, this.startRow, col, row); this.drawRectangle(col, row, color, frame);
for(var i = 0; i< strokePoints.length; i++) {
// Change model:
frame.setPixel(strokePoints[i].col, strokePoints[i].row, color);
}
// The user released the tool to draw a line. We will compute the pixel coordinate, impact
// the model and draw them in the drawing canvas (not the fake overlay anymore)
} }
}; };
/** ns.Rectangle.prototype.drawRectangle = function (col, row, color, targetFrame) {
* Get an array of pixels representing the rectangle. var strokePoints = pskl.PixelUtils.getBoundRectanglePixels(this.startCol, this.startRow, col, row);
* for(var i = 0; i< strokePoints.length; i++) {
* @private // Change model:
*/ targetFrame.setPixel(strokePoints[i].col, strokePoints[i].row, color);
ns.Rectangle.prototype.getRectanglePixels_ = function(x0, x1, y0, y1) {
var pixels = [];
var swap;
if(x0 > x1) {
swap = x0;
x0 = x1;
x1 = swap;
} }
if(y0 > y1) { }
swap = y0;
y0 = y1;
y1 = swap;
}
// Creating horizontal sides of the rectangle:
for(var x = x0; x <= x1; x++) {
pixels.push({"col": x, "row": y0});
pixels.push({"col": x, "row": y1});
}
// Creating vertical sides of the rectangle:
for(var y = y0; y <= y1; y++) {
pixels.push({"col": x0, "row": y});
pixels.push({"col": x1, "row": y});
}
return pixels;
};
})(); })();

View File

@ -4,22 +4,11 @@
ns.PixelUtils = { ns.PixelUtils = {
getRectanglePixels : function (x0, y0, x1, y1) { getRectanglePixels : function (x0, y0, x1, y1) {
var rectangle = this.getOrderedRectangleCoordinates(x0, y0, x1, y1);
var pixels = []; var pixels = [];
var swap;
if(x0 > x1) {
swap = x0;
x0 = x1;
x1 = swap;
}
if(y0 > y1) {
swap = y0;
y0 = y1;
y1 = swap;
}
for(var x = x0; x <= x1; x++) { for(var x = rectangle.x0; x <= rectangle.x1; x++) {
for(var y = y0; y <= y1; y++) { for(var y = rectangle.y0; y <= rectangle.y1; y++) {
pixels.push({"col": x, "row": y}); pixels.push({"col": x, "row": y});
} }
} }
@ -28,33 +17,33 @@
}, },
getBoundRectanglePixels : function (x0, y0, x1, y1) { getBoundRectanglePixels : function (x0, y0, x1, y1) {
var rectangle = this.getOrderedRectangleCoordinates(x0, y0, x1, y1);
var pixels = []; var pixels = [];
var swap;
if(x0 > x1) {
swap = x0;
x0 = x1;
x1 = swap;
}
if(y0 > y1) {
swap = y0;
y0 = y1;
y1 = swap;
}
// Creating horizontal sides of the rectangle: // Creating horizontal sides of the rectangle:
for(var x = x0; x <= x1; x++) { for(var x = rectangle.x0; x <= rectangle.x1; x++) {
pixels.push({"col": x, "row": y0}); pixels.push({"col": x, "row": rectangle.y0});
pixels.push({"col": x, "row": y1}); pixels.push({"col": x, "row": rectangle.y1});
} }
// Creating vertical sides of the rectangle: // Creating vertical sides of the rectangle:
for(var y = y0; y <= y1; y++) { for(var y = rectangle.y0; y <= rectangle.y1; y++) {
pixels.push({"col": x0, "row": y}); pixels.push({"col": rectangle.x0, "row": y});
pixels.push({"col": x1, "row": y}); pixels.push({"col": rectangle.x1, "row": y});
} }
return pixels; return pixels;
} },
/**
* Return an object of ordered rectangle coordinate.
* In returned object {x0, y0} => top left corner - {x1, y1} => bottom right corner
* @private
*/
getOrderedRectangleCoordinates : function (x0, y0, x1, y1) {
return {
x0 : Math.min(x0, x1), y0 : Math.min(y0, y1),
x1 : Math.max(x0, x1), y1 : Math.max(y0, y1),
};
}
}; };
})(); })();