Skip to content

Commit 946cddd

Browse files
committed
More progress
1 parent 080dc18 commit 946cddd

File tree

9 files changed

+77
-20
lines changed

9 files changed

+77
-20
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[part="debug"] {
2+
background: #555;
3+
padding: 1rem;
4+
display: flex;
5+
}
6+
7+
[part="debug"] canvas {
8+
border: 1px solid #FFF;
9+
}

src/pg/inputPixelEditor/__examples__/basic/basic.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<code>oninput: <span part="value2"></span></code>
88
</div>
99
<div>
10+
<button part="clear">clear</button>
1011
<button part="modePixel">Pixel</button>
1112
<button part="modeLine">Line</button>
1213
<button part="modeRectangle">Rectangle</button>

src/pg/inputPixelEditor/__examples__/basic/basic.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import { Component, Part } from '@pictogrammers/element';
22
import PgInputPixelEditor from '../../inputPixelEditor';
33

44
import template from './basic.html';
5+
import style from './basic.css';
56

67
@Component({
78
selector: 'x-pg-input-pixel-editor-basic',
9+
style,
810
template
911
})
1012
export default class XPgInputPixelEditorBasic extends HTMLElement {
@@ -14,6 +16,7 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
1416
@Part() $value2: HTMLSpanElement;
1517
@Part() $debug: HTMLDivElement;
1618

19+
@Part() $clear: HTMLButtonElement;
1720
@Part() $modePixel: HTMLButtonElement;
1821
@Part() $modeLine: HTMLButtonElement;
1922
@Part() $modeRectangle: HTMLButtonElement;
@@ -34,6 +37,18 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
3437
this.$modeRectangle.addEventListener('click', () => {
3538
this.$input.inputModeRectangle();
3639
});
40+
this.$modeRectangleOutline.addEventListener('click', () => {
41+
this.$input.inputModeRectangleOutline();
42+
});
43+
this.$modeEllipse.addEventListener('click', () => {
44+
this.$input.inputModeEllipse();
45+
});
46+
this.$modeEllipseOutline.addEventListener('click', () => {
47+
this.$input.inputModeEllipseOutline();
48+
});
49+
this.$clear.addEventListener('click', () => {
50+
this.$input.clear();
51+
});
3752
}
3853

3954
handleChange(e: CustomEvent) {
@@ -47,9 +62,13 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
4762
}
4863

4964
handleDebug(e: CustomEvent) {
50-
const { baseLayer, editLayer, previewLayer } = e.detail;
65+
const { x, y, width, height, context, baseLayer, editLayer, noEditLayer, previewLayer } = e.detail;
5166
this.$debug.appendChild(baseLayer);
5267
this.$debug.appendChild(editLayer);
68+
this.$debug.appendChild(noEditLayer);
5369
this.$debug.appendChild(previewLayer);
70+
//context.strokeStyle = 'rgba(255, 0, 0, 0.3)';
71+
//context.lineWidth = 1;
72+
//context.strokeRect(x, y, width, height);
5473
}
5574
}

src/pg/inputPixelEditor/inputPixelEditor.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
canvas {
66
touch-action: none;
77
user-select: none;
8+
outline: 0;
89
}

src/pg/inputPixelEditor/inputPixelEditor.ts

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import cloneGrid from './utils/cloneGrid';
77
import getEllipseOutlinePixels from './utils/getEllipseOutlinePixels';
88
import { WHITE } from './utils/constants';
99
import getLinePixels from './utils/getLinePixels';
10-
import getRectanglePixels from './utils/getRectangleOutlinePixels';
10+
import getRectanglePixels from './utils/getRectanglePixels';
1111
import getRectangleOutlinePixels from './utils/getRectangleOutlinePixels';
1212
import fillGrid from './utils/fillGrid';
1313
import iterateGrid from './utils/interateGrid';
1414
import bitmaskToPath from './utils/bitmapToMask';
1515
import createLayer from './utils/createLayer';
16+
import diffGrid from './utils/diffGrid';
1617

1718
type Pixel = { x: number, y: number };
1819

@@ -40,6 +41,9 @@ export default class PgInputPixelEditor extends HTMLElement {
4041
#startY: number = -1;
4142
#x: number = -1;
4243
#y: number = -1;
44+
#isCtrl: boolean = false;
45+
#isShift: boolean = false;
46+
#isAlt: boolean = false;
4347
#data: number[][] = [];
4448
#undoHistory: [number, number, number][][] = [];
4549
#redoHistory: [number, number, number][][] = [];
@@ -61,11 +65,11 @@ export default class PgInputPixelEditor extends HTMLElement {
6165
this.#context = context;
6266
// Wire Up Events
6367
this.$canvas.addEventListener(
64-
'contextMenu',
68+
'contextmenu',
6569
this.handleContextMenu.bind(this)
6670
);
6771
this.$canvas.addEventListener(
68-
'doubleClick',
72+
'doubleclick',
6973
this.handleDoubleClick.bind(this)
7074
);
7175
this.$canvas.addEventListener(
@@ -193,17 +197,22 @@ export default class PgInputPixelEditor extends HTMLElement {
193197
maxY: Math.max(previous.maxY, current.y, previousY)
194198
};
195199
}, { minX: this.width, maxX: 0, minY: this.height, maxY: 0 });
200+
const x = minX * totalSize;
201+
const y = minY * totalSize;
202+
const width = (maxX - minX + 1) * totalSize;
203+
const height = (maxY - minY + 1) * totalSize;
204+
this.#context.clearRect(x, y, width, height);
196205
// base layer to main canvas
197206
this.#context.drawImage(
198207
this.#baseLayer,
199-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize,
200-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize
208+
x, y, width, height,
209+
x, y, width, height
201210
);
202211
// edit to main canvas
203212
this.#context.drawImage(
204213
this.#editLayer,
205-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize,
206-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize
214+
x, y, width, height,
215+
x, y, width, height
207216
);
208217
// preview layer
209218
this.#previewLayerContext.clearRect(0, 0, actualWidth, actualHeight);
@@ -222,20 +231,28 @@ export default class PgInputPixelEditor extends HTMLElement {
222231
// preview layer to main canvas
223232
this.#context.drawImage(
224233
this.#previewLayer,
225-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize,
226-
minX * totalSize, minY * totalSize, maxX * totalSize, maxY * totalSize
234+
x, y, width, height,
235+
x, y, width, height
227236
);
237+
// Debug
228238
this.dispatchEvent(new CustomEvent('debug', {
229239
detail: {
240+
x,
241+
y,
242+
width,
243+
height,
244+
canvas: this.$canvas,
245+
context: this.#context,
230246
editLayer: this.#editLayer,
247+
noEditLayer: this.#noEditLayer,
231248
baseLayer: this.#baseLayer,
232249
previewLayer: this.#previewLayer
233250
}
234251
}));
235-
console.log('render preview', minX, minY, maxX, maxY);
236252
}
237253

238254
handleKeyDown(event: KeyboardEvent) {
255+
console.log(event.shiftKey, event.ctrlKey, event.altKey, event.key);
239256
if (event.key === ' ') {
240257
console.log('space!')
241258
}
@@ -259,6 +276,11 @@ export default class PgInputPixelEditor extends HTMLElement {
259276
event.stopPropagation();
260277
return;
261278
}
279+
// Update Modifiers
280+
this.#isAlt = event.altKey;
281+
this.#isCtrl = event.ctrlKey;
282+
this.#isShift = event.shiftKey;
283+
// Drawing
262284
const rect = this.$canvas.getBoundingClientRect();
263285
const totalSize = this.size + this.gridSize;
264286
let newX = Math.floor((event.clientX - rect.left) / totalSize);
@@ -273,6 +295,7 @@ export default class PgInputPixelEditor extends HTMLElement {
273295
this.#x = newX;
274296
this.#y = newY;
275297
const color = event.buttons === 32 ? 0 : 1;
298+
console.log(this.#colors, this.#colors[color], event.buttons);
276299
switch (this.#inputMode) {
277300
case InputMode.Pixel:
278301
this.#setPixel(newX, newY, color);
@@ -337,6 +360,9 @@ export default class PgInputPixelEditor extends HTMLElement {
337360
handlePointerMove(event: PointerEvent) {
338361
const canvas = this.$canvas;
339362
if (this.#isPressed) {
363+
this.#isAlt = event.altKey;
364+
this.#isCtrl = event.ctrlKey;
365+
this.#isShift = event.shiftKey;
340366
const data = this.#data;
341367
const rect = canvas.getBoundingClientRect();
342368
const totalSize = this.size + this.gridSize;
@@ -427,14 +453,15 @@ export default class PgInputPixelEditor extends HTMLElement {
427453
// base layer to main canvas
428454
this.#context.drawImage(this.#baseLayer, 0, 0);
429455
// editing layer to main canvas
430-
this.#context.drawImage(this.#editLayer, 0, 0);
456+
this.#context.drawImage(this.#noEditLayer, 0, 0);
431457
}
432458

433459
mergeColor(fromIndex: number, toIndex: number) {
434460
// ToDo: Code this
435461
}
436462
clear() {
437463
this.#data = fillGrid(this.width, this.height);
464+
this.#updateGrid();
438465
}
439466
clearHistory() {
440467
this.#undoHistory = [];

src/pg/inputPixelEditor/utils/diffGrid.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* @returns list of changes [[x, y, color], ...]
77
*/
88
export default function diffGrid(oldData: number[][], newData: number[][]): number[][] {
9-
const changes = [];
9+
const changes: [number, number, number, number][] = [];
1010
// Loop the larger grid
1111
const oldWidth = oldData[0].length;
1212
const oldHeight = oldData.length;

src/pg/inputPixelEditor/utils/getEllipsePixels.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default function getEllipsePixels(x0: number, y0: number, x1: number, y1:
77
if (y0 > y1) y0 = y1; /* .. exchange them */
88
y0 += (b + 1) / 2; y1 = y0 - b1; /* starting pixel */
99
a *= 8 * a; b1 = 8 * b * b;
10-
const pixels = [];
10+
const pixels: { x: number, y: number }[] = [];
1111
do {
1212
pixels.push({ x: x1, y: y0 }); /* I. Quadrant */
1313
pixels.push({ x: x0, y: y0 }); /* II. Quadrant */

src/pg/inputPixelEditor/utils/getRectangleOutlinePixels.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
export default function getRectanglePixels(x0: number, y0: number, x1: number, y1: number) {
1+
export default function getRectangleOutlinePixels(x0: number, y0: number, x1: number, y1: number) {
22
const pixels: { x: number, y: number }[] = [];
33
const oX = Math.min(x0, x1);
44
const oY = Math.min(y0, y1);
5-
var w = Math.abs(x1 - x0) + 1;
6-
var h = Math.abs(y1 - y0) + 1;
5+
var w = Math.abs(x1 - x0);
6+
var h = Math.abs(y1 - y0);
77

88
// Vertical
9-
for (var y = oY; y < oY + h; y++) {
9+
for (var y = oY; y <= oY + h; y++) {
1010
pixels.push({ x: oX, y });
1111
pixels.push({ x: oX + w, y });
1212
}
1313
// Horizontal (minus the vertical squares)
14-
for (var x = oX + 1; x < oX + w - 1; x++) {
14+
for (var x = oX + 1; x <= oX + w - 1; x++) {
1515
pixels.push({ x, y: oY });
1616
pixels.push({ x, y: oY + h });
1717
}

src/pg/inputPixelEditor/utils/getRectanglePixels.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export default function getRectanglePixels(x0: number, y0: number, x1: number, y1: number) {
2-
const pixels = [];
2+
const pixels: { x: number, y: number }[] = [];
33
const oX = Math.min(x0, x1);
44
const oY = Math.min(y0, y1);
55
var w = Math.abs(x1 - x0) + 1;

0 commit comments

Comments
 (0)