Small changes & fixes from VM integration

Changes include:
- Implement pen clear
- Upack pen-related location parameters
- Fix inverted vertical position on pen actions
- Remove canvas debug content
- Set `strokeStyle` instead of `fillStyle`
- Remove location parameter from stamp operation: always stamp in place
This commit is contained in:
Christopher Willis-Ford 2017-01-19 11:22:32 -08:00
parent 1531ea8ae6
commit 3bdb1fff1f
2 changed files with 55 additions and 48 deletions

View File

@ -84,39 +84,51 @@ class PenSkin extends Skin {
} }
/** /**
* Draw a point on the pen layer. * Clear the pen layer.
* @param {[number, number]} location - where the point should be drawn.
* @param {PenAttributes} penAttributes - how the point should be drawn.
*/ */
drawPoint (location, penAttributes) { clear () {
// Canvas renders a zero-length line as two end-caps back-to-back, which is what we want. const ctx = this._canvas.getContext('2d');
this.drawLine(location, location, penAttributes); ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);
} }
/** /**
* Draw a point on the pen layer. * Draw a point on the pen layer.
* @param {[number, number]} location0 - where the line should start. * @param {PenAttributes} penAttributes - how the point should be drawn.
* @param {[number, number]} location1 - where the line should end. * @param {number} x - the X coordinate of the point to draw.
* @param {PenAttributes} penAttributes - how the line should be drawn. * @param {number} y - the Y coordinate of the point to draw.
*/ */
drawLine (location0, location1, penAttributes) { drawPoint (penAttributes, x, y) {
// Canvas renders a zero-length line as two end-caps back-to-back, which is what we want.
this.drawLine(penAttributes, x, y, x, y);
}
/**
* Draw a point on the pen layer.
* @param {PenAttributes} penAttributes - how the line should be drawn.
* @param {number} x0 - the X coordinate of the beginning of the line.
* @param {number} y0 - the Y coordinate of the beginning of the line.
* @param {number} x1 - the X coordinate of the end of the line.
* @param {number} y1 - the Y coordinate of the end of the line.
*/
drawLine (penAttributes, x0, y0, x1, y1) {
const ctx = this._canvas.getContext('2d'); const ctx = this._canvas.getContext('2d');
this._setAttributes(ctx, penAttributes); this._setAttributes(ctx, penAttributes);
ctx.moveTo(location0[0] + this._rotationCenter[0], location0[1] + this._rotationCenter[1]);
ctx.beginPath(); ctx.beginPath();
ctx.lineTo(location1[0] + this._rotationCenter[0], location1[1] + this._rotationCenter[1]); ctx.moveTo(this._rotationCenter[0] + x0, this._rotationCenter[1] - y0);
ctx.lineTo(this._rotationCenter[0] + x1, this._rotationCenter[1] - y1);
ctx.stroke(); ctx.stroke();
this._canvasDirty = true; this._canvasDirty = true;
} }
/** /**
* Stamp an image onto the pen layer. * Stamp an image onto the pen layer.
* @param {[number, number]} location - where the stamp should be drawn.
* @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} stampElement - the element to use as the stamp. * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} stampElement - the element to use as the stamp.
* @param {number} x - the X coordinate of the stamp to draw.
* @param {number} y - the Y coordinate of the stamp to draw.
*/ */
drawStamp (location, stampElement) { drawStamp (stampElement, x, y) {
const ctx = this._canvas.getContext('2d'); const ctx = this._canvas.getContext('2d');
ctx.drawImage(stampElement, location[0] + this._rotationCenter[0], location[1] + this._rotationCenter[1]); ctx.drawImage(stampElement, this._rotationCenter[0] + x, this._rotationCenter[1] - y);
this._canvasDirty = true; this._canvasDirty = true;
} }
@ -152,27 +164,6 @@ class PenSkin extends Skin {
} }
); );
this._canvasDirty = true; this._canvasDirty = true;
const ctx = this._canvas.getContext('2d');
ctx.strokeStyle = 'red';
ctx.beginPath();
ctx.moveTo(-2, 0);
ctx.lineTo(width - 2, height);
ctx.stroke();
ctx.strokeStyle = 'green';
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(width + 0, height);
ctx.stroke();
ctx.strokeStyle = 'blue';
ctx.beginPath();
ctx.moveTo(2, 0);
ctx.lineTo(width + 2, height);
ctx.stroke();
ctx.strokeStyle = 'purple';
ctx.moveTo(2, height / 10);
ctx.lineTo(width / 10, height / 5);
ctx.stroke();
} }
_setAttributes (context, penAttributes) { _setAttributes (context, penAttributes) {
@ -185,7 +176,7 @@ class PenSkin extends Skin {
const b = Math.round(color4f[2] * 255); const b = Math.round(color4f[2] * 255);
const a = Math.round(color4f[3] * 255); const a = Math.round(color4f[3] * 255);
context.fillStyle = `rgba(${r},${g},${b},${a})`; context.strokeStyle = `rgba(${r},${g},${b},${a})`;
context.lineCap = 'round'; context.lineCap = 'round';
context.lineWidth = diameter; context.lineWidth = diameter;
} }

View File

@ -732,36 +732,52 @@ class RenderWebGL extends EventEmitter {
drawable.updateProperties(properties); drawable.updateProperties(properties);
} }
/**
* Clear a pen layer.
* @param {int} penSkinID - the unique ID of a Pen Skin.
*/
penClear (penSkinID) {
const skin = /** @type {PenSkin} */ this._allSkins[penSkinID];
skin.clear();
}
/** /**
* Draw a point on a pen layer. * Draw a point on a pen layer.
* @param {int} penSkinID - the unique ID of a Pen Skin. * @param {int} penSkinID - the unique ID of a Pen Skin.
* @param {[number, number]} location - where the point should be drawn.
* @param {PenAttributes} penAttributes - how the point should be drawn. * @param {PenAttributes} penAttributes - how the point should be drawn.
* @param {number} x - the X coordinate of the point to draw.
* @param {number} y - the Y coordinate of the point to draw.
*/ */
penPoint (penSkinID, location, penAttributes) { penPoint (penSkinID, penAttributes, x, y) {
const skin = /** @type {PenSkin} */ this._allSkins[penSkinID]; const skin = /** @type {PenSkin} */ this._allSkins[penSkinID];
skin.drawPoint(location, penAttributes); skin.drawPoint(penAttributes, x, y);
} }
/** /**
* Draw a line on a pen layer. * Draw a line on a pen layer.
* @param {int} penSkinID - the unique ID of a Pen Skin. * @param {int} penSkinID - the unique ID of a Pen Skin.
* @param {[number, number]} location0 - where the line should start.
* @param {[number, number]} location1 - where the line should end.
* @param {PenAttributes} penAttributes - how the line should be drawn. * @param {PenAttributes} penAttributes - how the line should be drawn.
* @param {number} x0 - the X coordinate of the beginning of the line.
* @param {number} y0 - the Y coordinate of the beginning of the line.
* @param {number} x1 - the X coordinate of the end of the line.
* @param {number} y1 - the Y coordinate of the end of the line.
*/ */
penLine (penSkinID, location0, location1, penAttributes) { penLine (penSkinID, penAttributes, x0, y0, x1, y1) {
const skin = /** @type {PenSkin} */ this._allSkins[penSkinID]; const skin = /** @type {PenSkin} */ this._allSkins[penSkinID];
skin.drawLine(location0, location1, penAttributes); skin.drawLine(penAttributes, x0, y0, x1, y1);
} }
/** /**
* Draw a point on a pen layer. * Stamp a Drawable onto a pen layer.
* @param {int} penSkinID - the unique ID of a Pen Skin. * @param {int} penSkinID - the unique ID of a Pen Skin.
* @param {[number, number]} location - where the point should be drawn.
* @param {int} stampID - the unique ID of the Drawable to use as the stamp. * @param {int} stampID - the unique ID of the Drawable to use as the stamp.
*/ */
penStamp (penSkinID, location, stampID) { penStamp (penSkinID, stampID) {
const stampDrawable = this._allDrawables[stampID];
if (!stampDrawable) {
return;
}
const bounds = this._touchingBounds(stampID); const bounds = this._touchingBounds(stampID);
if (!bounds) { if (!bounds) {
return; return;
@ -798,7 +814,7 @@ class RenderWebGL extends EventEmitter {
stampImageData.data.set(stampPixels); stampImageData.data.set(stampPixels);
stampContext.putImageData(stampImageData, 0, 0); stampContext.putImageData(stampImageData, 0, 0);
skin.drawStamp(location, stampCanvas); skin.drawStamp(stampCanvas, bounds.left, bounds.top);
} }
/* ****** /* ******