-
- building {{ indexCounter }}
- Build Index
-
-
-
-
+
+
+
+
+ building {{ indexCounter }}
+ Build Index
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Files/FilesAside.vue b/src/components/Files/FilesAside.vue
index 97c128f..e840565 100644
--- a/src/components/Files/FilesAside.vue
+++ b/src/components/Files/FilesAside.vue
@@ -2,13 +2,15 @@
@@ -25,13 +27,22 @@
+
\ No newline at end of file
diff --git a/src/components/Map/MapRenderer.vue b/src/components/Map/MapRenderer.vue
new file mode 100644
index 0000000..8bfed8a
--- /dev/null
+++ b/src/components/Map/MapRenderer.vue
@@ -0,0 +1,52 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Map/helpers.ts b/src/components/Map/helpers.ts
new file mode 100644
index 0000000..6b92b62
--- /dev/null
+++ b/src/components/Map/helpers.ts
@@ -0,0 +1,98 @@
+async function loadImage(src: string | File): Promise {
+ if (src instanceof File) {
+ console.log('Creating object URL');
+ src = URL.createObjectURL(src);
+ }
+ try {
+ return await new Promise((resolve, reject) => {
+ const img = new Image();
+ img.onload = () => resolve(img);
+ img.onerror = (err) => reject(err);
+ img.src = src;
+ });
+ } finally {
+ URL.revokeObjectURL(src);
+ }
+}
+
+/**
+ * number of 1 inch squares in the map
+ */
+interface GameDimensions {
+ w: number | undefined;
+ h: number | undefined;
+}
+
+interface MapImageOptions {
+ gameDimensions: GameDimensions;
+}
+
+export class MapImage implements MapDrawable {
+ file: HTMLCanvasElement;
+ gameDimensions: GameDimensions;
+
+ constructor(file: HTMLCanvasElement, {gameDimensions}: MapImageOptions) {
+ this.file = file;
+ this.gameDimensions = gameDimensions;
+ if (!gameDimensions.w && !gameDimensions.h) {
+ gameDimensions.w = 40;
+ }
+
+ if (!gameDimensions.h) {
+ gameDimensions.h = gameDimensions.w! * (file.height / file.width);
+ }
+ if (!gameDimensions.w) {
+ gameDimensions.w = gameDimensions.h! * (file.width / file.height);
+ }
+ }
+
+ static async fromImageFile(file: File, options: MapImageOptions) {
+ const canvas = document.createElement('canvas');
+ const img = await loadImage(file);
+ canvas.width = img.naturalWidth;
+ canvas.height = img.naturalHeight;
+ const ctx = canvas.getContext('2d');
+ if (!ctx) {
+ console.log('Failed to get 2d context');
+ throw new Error('Failed to get 2d context');
+ }
+ ctx.drawImage(img, 0, 0);
+ return new MapImage(canvas, options);
+ }
+
+ draw(mapContext: MapContext) {
+ const {ctx, dpi, virtualWidth, virtualHeight, offsetX, offsetY} = mapContext;
+ const naturalWidth = this.file.width;
+ const naturalHeight = this.file.height;
+ const w = this.gameDimensions.w!;
+ const h = this.gameDimensions.h!;
+ const imageDpi = naturalWidth / w;
+ const dpiScale = dpi / imageDpi;
+
+ const targetWidth = w * imageDpi * dpiScale;
+ const targetHeight = h * imageDpi * dpiScale;
+ const basicOffsetX = (virtualWidth - targetWidth) / 2;
+ const basicOffsetY = (virtualHeight - targetHeight) / 2;
+
+ ctx.drawImage(
+ this.file,
+ 0, 0, naturalWidth, naturalHeight,
+ basicOffsetX + offsetX, basicOffsetY + offsetY, w * imageDpi * dpiScale, h * imageDpi * dpiScale,
+ );
+
+ }
+}
+
+export interface MapContext {
+ ctx: CanvasRenderingContext2D;
+ dpi: number;
+ virtualWidth: number;
+ virtualHeight: number;
+ scale: number;
+ offsetX: number;
+ offsetY: number;
+}
+
+export interface MapDrawable {
+ draw(ctx: MapContext): void;
+}
diff --git a/src/components/Map/types.ts b/src/components/Map/types.ts
new file mode 100644
index 0000000..09aac16
--- /dev/null
+++ b/src/components/Map/types.ts
@@ -0,0 +1,4 @@
+export interface MapLayer {
+ file: HTMLCanvasElement;
+ name: string;
+}
\ No newline at end of file
diff --git a/src/components/ScreenManager/RemoteScreen.vue b/src/components/ScreenManager/RemoteScreen.vue
index d09306b..116e27f 100644
--- a/src/components/ScreenManager/RemoteScreen.vue
+++ b/src/components/ScreenManager/RemoteScreen.vue
@@ -121,8 +121,6 @@ async function onDrop(event: DragEvent) {
await loadFile(meta, file);
}
}
-
-
console.log('files', event.dataTransfer?.files);
console.log('drop', event.dataTransfer?.getData('application/json'));
}
diff --git a/src/modules/controls/ControlApp.vue b/src/modules/controls/ControlApp.vue
index 789b337..525693a 100644
--- a/src/modules/controls/ControlApp.vue
+++ b/src/modules/controls/ControlApp.vue
@@ -1,6 +1,6 @@
-
+
-
-
+
+
+
@@ -40,8 +42,12 @@
+
+
+
+
-
+