From a0b04e96465993ceb321b76766034cdd6832cc8f Mon Sep 17 00:00:00 2001 From: "Ron B. Yeh" Date: Fri, 9 Dec 2022 13:38:39 -0800 Subject: [PATCH 1/5] Image comparison tool so we can more easily review visual diffs between current and reference builds. --- tools/compare/compare.js | 195 +++++++++++++++++++++++++++++++++++++++ tools/compare/index.html | 88 ++++++++++++++++++ 2 files changed, 283 insertions(+) create mode 100644 tools/compare/compare.js create mode 100644 tools/compare/index.html diff --git a/tools/compare/compare.js b/tools/compare/compare.js new file mode 100644 index 0000000000..6695aa64fa --- /dev/null +++ b/tools/compare/compare.js @@ -0,0 +1,195 @@ +// Author: Ron B. Yeh + +// See: https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API + +// store a reference to our file handle +let fileHandle; + +// Images we discovered in the vexflow/build/images/current folder. +const currentImages = {}; // FileSystemFileHandle +const currentImagesNames = []; +// Images we discovered in the vexflow/build/images/reference folder. +const referenceImages = {}; // FileSystemFileHandle +const referenceImagesNames = []; + +let filterStrings = []; + +async function getFile() { + // open file picker + [fileHandle] = await window.showOpenFilePicker(); + + if (fileHandle.kind === 'file') { + // run file code + } else if (fileHandle.kind === 'directory') { + // run directory code + } +} + +const pickerOpts = { + types: [ + { + description: 'Images', + accept: { + 'image/*': ['.png', '.gif', '.jpeg', '.jpg'], + }, + }, + ], + excludeAcceptAllOption: true, + multiple: false, +}; + +async function openTheFolder() { + // Ask the user to choose a folder. + // Window.showDirectoryPicker() returns a handle for the directory. + try { + const dirHandle = await window.showDirectoryPicker(); + listDirectoryContents(dirHandle); + } catch (err) { + // console.error(err.name, err.message); // AbortError The user aborted a request. + console.log('The user closed the dialog without selecting a folder.'); + } +} + +function addListeners() { + document.addEventListener('dragover', (e) => { + // Prevent navigation. + e.preventDefault(); + }); + + document.addEventListener('drop', async (e) => { + // Prevent navigation. + e.preventDefault(); + // Process all of the items. + for (const item of e.dataTransfer.items) { + // Careful: `kind` will be 'file' for both file _and_ directory entries. + if (item.kind === 'file') { + const handle = await item.getAsFileSystemHandle(); + if (handle.kind === 'directory') { + listDirectoryContents(handle); + } + } + } + }); +} + +async function listDirectoryContents(dirHandle) { + // Get a list of entries in the directory. + const entries = await dirHandle.values(); + for await (const entry of entries) { + if (entry.kind === 'directory') { + if (entry.name === 'current') { + await getImagesFromCurrentFolder(entry); + } else if (entry.name === 'reference') { + await getImagesFromReferenceFolder(entry); + } + } + } + + populateSelectBoxes(); +} + +async function getImagesFromCurrentFolder(dirHandle) { + const entries = await dirHandle.values(); + for await (const entry of entries) { + const fileName = entry.name; + currentImages[fileName] = entry; + currentImagesNames.push(fileName); + } + + currentImagesNames.sort(); +} +async function getImagesFromReferenceFolder(dirHandle) { + const entries = await dirHandle.values(); + for await (const entry of entries) { + const fileName = entry.name; + referenceImages[fileName] = entry; + referenceImagesNames.push(fileName); + } + + referenceImagesNames.sort(); +} + +function populateSelectBoxes() { + // Left Side: Current Images + document.getElementById('currentImages').innerHTML = buildOptionsHTMLString(currentImagesNames, 'current_'); + + // Right Side: Reference Images + document.getElementById('referenceImages').innerHTML = buildOptionsHTMLString(referenceImagesNames, 'reference_'); +} + +// Uses filterStrings to filter the list of images. +// Returns a string of HTML that match the filter. +function buildOptionsHTMLString(imageNamesArray, idPrefix) { + let options = ''; + + for (let imageName of imageNamesArray) { + const lowerCaseImageName = imageName.toLowerCase(); + const allFiltersMatch = filterStrings.every((filter) => lowerCaseImageName.includes(filter)); + if (allFiltersMatch) { + options += ``; + } + } + return options; +} + +let timeoutID = 0; +function filterResults() { + let filterString = document.getElementById('filter').value; + filterString = filterString.toLowerCase().replace(/,/g, ' '); + filterStrings = filterString.split(' '); + console.log(filterStrings); + + // Filter the list with at least a 400ms delay after the last letter was typed. + clearTimeout(timeoutID); + timeoutID = setTimeout(() => { + populateSelectBoxes(); + }, 400); +} + +async function selectedCurrentImage() { + let selectBox = document.getElementById('currentImages'); + + // Select the corresponding item on the right side. + let selectedImageFileName = selectBox.options[selectBox.selectedIndex].value; + let referenceImage = document.getElementById('reference_' + selectedImageFileName); + referenceImage.selected = true; + + showImages(selectedImageFileName); +} + +async function selectedReferenceImage() { + let selectBox = document.getElementById('referenceImages'); + + // Select the corresponding item on the left side. + let selectedImageFileName = selectBox.options[selectBox.selectedIndex].value; + let currentImage = document.getElementById('current_' + selectedImageFileName); + currentImage.selected = true; + + showImages(selectedImageFileName); +} + +async function showImages(selectedImageFileName) { + const currentFileHandle = currentImages[selectedImageFileName]; + const referenceFileHandle = referenceImages[selectedImageFileName]; + + const cFile = await currentFileHandle.getFile(); + const rFile = await referenceFileHandle.getFile(); + + const cURL = URL.createObjectURL(cFile); + const rURL = URL.createObjectURL(rFile); + + const imagesContainer = document.getElementById('images'); + + // Clear the images container. + while (imagesContainer.firstChild) { + imagesContainer.removeChild(imagesContainer.firstChild); + } + + // Add the two new images. + const imgC = document.createElement('img'); + imgC.src = cURL; + imagesContainer.appendChild(imgC); + const imgR = document.createElement('img'); + imgR.src = rURL; + imagesContainer.appendChild(imgR); +} diff --git a/tools/compare/index.html b/tools/compare/index.html new file mode 100644 index 0000000000..3cb71099bd --- /dev/null +++ b/tools/compare/index.html @@ -0,0 +1,88 @@ + + + + + + + + +

+ Open the vexflow/build/images/ folder, which contains current, diff, reference. +

+

When the pop-up appears, click View Files.

+

+

+ You can also drag and drop the vexflow/build/images/ folder onto this page. +

+
+
+
+
+ + +
+

+ LEFT / RIGHT arrow keys flip between current / reference images.
UP / DOWN arrow keys selects the next / + previous image to compare.
ESC shows images side by side. +

+
+ + From 2c4f8f8e024176f4e47ba9e6c19dce9eac47b119 Mon Sep 17 00:00:00 2001 From: "Ron B. Yeh" Date: Sat, 10 Dec 2022 01:54:49 -0800 Subject: [PATCH 2/5] Show images side by side, or overlaid on top of each other. --- tools/compare/compare.js | 104 ++++++++++++++++++++++++++++----------- tools/compare/index.html | 56 ++++++++++++++++----- 2 files changed, 120 insertions(+), 40 deletions(-) diff --git a/tools/compare/compare.js b/tools/compare/compare.js index 6695aa64fa..804138746d 100644 --- a/tools/compare/compare.js +++ b/tools/compare/compare.js @@ -14,29 +14,12 @@ const referenceImagesNames = []; let filterStrings = []; -async function getFile() { - // open file picker - [fileHandle] = await window.showOpenFilePicker(); - - if (fileHandle.kind === 'file') { - // run file code - } else if (fileHandle.kind === 'directory') { - // run directory code - } -} +let currentIMGElement; +let referenceIMGElement; -const pickerOpts = { - types: [ - { - description: 'Images', - accept: { - 'image/*': ['.png', '.gif', '.jpeg', '.jpg'], - }, - }, - ], - excludeAcceptAllOption: true, - multiple: false, -}; +const SIDE_BY_SIDE = 0; +const OVERLAY = 1; +let viewMode = SIDE_BY_SIDE; async function openTheFolder() { // Ask the user to choose a folder. @@ -70,6 +53,24 @@ function addListeners() { } } }); + + document.addEventListener('keydown', (e) => { + e = e || window.event; + switch (e.key) { + case 'Enter': + openTheFolder(); + break; + case 'ArrowLeft': + case 'ArrowRight': + flipBetweenImages(); + break; + case ' ': // SPACE BAR + toggleViewMode(); + break; + default: + break; + } + }); } async function listDirectoryContents(dirHandle) { @@ -186,10 +187,57 @@ async function showImages(selectedImageFileName) { } // Add the two new images. - const imgC = document.createElement('img'); - imgC.src = cURL; - imagesContainer.appendChild(imgC); - const imgR = document.createElement('img'); - imgR.src = rURL; - imagesContainer.appendChild(imgR); + currentIMGElement = document.createElement('img'); + currentIMGElement.id = 'currentImage'; + currentIMGElement.src = cURL; + currentIMGElement.style.zIndex = 1; + imagesContainer.appendChild(currentIMGElement); + + referenceIMGElement = document.createElement('img'); + referenceIMGElement.id = 'referenceImage'; + referenceIMGElement.src = rURL; + referenceIMGElement.style.zIndex = -1; + imagesContainer.appendChild(referenceIMGElement); + + updateImagesForViewMode(); + updateLabelsForViewMode(); +} + +function flipBetweenImages() { + currentIMGElement.style.zIndex = -1 * currentIMGElement.style.zIndex; + referenceIMGElement.style.zIndex = -1 * referenceIMGElement.style.zIndex; + updateLabelsForViewMode(); +} + +function toggleViewMode() { + viewMode = 1 - viewMode; + updateImagesForViewMode(); + updateLabelsForViewMode(); +} + +function updateImagesForViewMode() { + if (viewMode === SIDE_BY_SIDE) { + currentIMGElement.style.position = 'static'; + referenceIMGElement.style.position = 'static'; + } else { + currentIMGElement.style.position = 'absolute'; + referenceIMGElement.style.position = 'absolute'; + } +} + +function updateLabelsForViewMode() { + if (viewMode === SIDE_BY_SIDE) { + document.getElementById('labelCurrent').style.opacity = 1; + document.getElementById('labelReference').style.opacity = 1; + } else { + if (currentIMGElement.style.zIndex > referenceIMGElement.style.zIndex) { + console.log('CURRENT!!!'); + document.getElementById('labelCurrent').style.opacity = 1; + document.getElementById('labelReference').style.opacity = 0.4; + } else { + console.log('REFERENCE'); + document.getElementById('labelCurrent').style.opacity = 0.4; + document.getElementById('labelReference').style.opacity = 1; + } + } } diff --git a/tools/compare/index.html b/tools/compare/index.html index 3cb71099bd..12a39d1572 100644 --- a/tools/compare/index.html +++ b/tools/compare/index.html @@ -4,9 +4,10 @@

- Open the vexflow/build/images/ folder, which contains current, diff, reference. + Click here to open the vexflow/build/images/ folder + (the one which contains current/, diff/, reference/).

-

When the pop-up appears, click View Files.

-

+

If a "Let site view files?" pop-up appears, choose View Files.

You can also drag and drop the vexflow/build/images/ folder onto this page.

@@ -80,9 +109,12 @@

- LEFT / RIGHT arrow keys flip between current / reference images.
UP / DOWN arrow keys selects the next / - previous image to compare.
ESC shows images side by side. + SPACE BAR - Toggle between overlaying images or showing images side by side.
UP / DOWN arrow + keys - Select the previous / next image in the list. LEFT / RIGHT arrow keys - Flip between current / + reference images, in overlay mode.

+
CURRENT
+
REFERENCE
From 8c29e03728cc6c3d579387d889ad0fa8bdee8965 Mon Sep 17 00:00:00 2001 From: "Ron B. Yeh" Date: Sat, 10 Dec 2022 02:19:32 -0800 Subject: [PATCH 3/5] Add some comments. --- tools/compare/compare.js | 18 +++++++++++++++++- tools/compare/index.html | 19 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/tools/compare/compare.js b/tools/compare/compare.js index 804138746d..c967aba4d4 100644 --- a/tools/compare/compare.js +++ b/tools/compare/compare.js @@ -1,7 +1,16 @@ // Author: Ron B. Yeh - +// MIT License // See: https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API +// To generate current/ and reference/ images, follow these steps: +// `git checkout` a stable "reference" version of VexFlow (e.g., a recent release). +// `grunt reference` builds VexFlow and copies the build/ to the reference/ folder +// `git checkout` the new branch you are working on. +// `grunt` builds your latest "current" version. +// `grunt generate:current` +// `grunt generate:reference` +// Now you can use this tool to compare the current/ and reference/ images. + // store a reference to our file handle let fileHandle; @@ -241,3 +250,10 @@ function updateLabelsForViewMode() { } } } + +function showInfoTemporarily() { + document.getElementById('info').style.display = 'block'; + setTimeout(() => { + document.getElementById('info').style.display = 'none'; + }, 6500); +} diff --git a/tools/compare/index.html b/tools/compare/index.html index 12a39d1572..514e2e2c4d 100644 --- a/tools/compare/index.html +++ b/tools/compare/index.html @@ -2,6 +2,7 @@ + - + + +
+
images/
+
current/
+
reference/
+
+ + + ??? +

- Click here to open the vexflow/build/images/ folder - (the one which contains current/, diff/, reference/). [ - ? ] + Click to open: + vexflow/build/images/
If a "Let site view files?" pop-up appears, choose View Files.

-

+ You can also drag & drop the vexflow/build/images/ or current/ or + reference/ folders onto this page.

-

If a "Let site view files?" pop-up appears, choose View Files.

- You can also drag and drop the vexflow/build/images/ folder onto this page. + Number Keys: 1, 2, 3, 4 - Change view modes (side-by-side | alternate | stacked | diff).
+ Arrow Keys: UP / DOWN - Select the previous / next image in the list. LEFT / RIGHT - Flip between + current / reference images, in alternating or stacked view modes.

+

+
- - + + +
+
+ +
-

- SPACE BAR - Toggle between overlaying images or showing images side by side.
UP / DOWN arrow - keys - Select the previous / next image in the list. LEFT / RIGHT arrow keys - Flip between current / - reference images, in overlay mode. -

-
CURRENT
-
REFERENCE
From b369ee93b37c87b9119ade0ae3a50013108cbf19 Mon Sep 17 00:00:00 2001 From: "Ron B. Yeh" Date: Wed, 14 Dec 2022 17:16:11 -0800 Subject: [PATCH 5/5] Add test images. --- tools/compare/compare.js | 402 ++++++++++++++---------- tools/compare/index.html | 33 +- tools/compare/test/current/Image1.png | Bin 0 -> 12921 bytes tools/compare/test/current/Image2.png | Bin 0 -> 14283 bytes tools/compare/test/current/Image3.png | Bin 0 -> 19268 bytes tools/compare/test/reference/Image1.png | Bin 0 -> 34881 bytes tools/compare/test/reference/Image2.png | Bin 0 -> 12964 bytes tools/compare/test/reference/Image3.png | Bin 0 -> 15373 bytes 8 files changed, 253 insertions(+), 182 deletions(-) create mode 100644 tools/compare/test/current/Image1.png create mode 100644 tools/compare/test/current/Image2.png create mode 100644 tools/compare/test/current/Image3.png create mode 100644 tools/compare/test/reference/Image1.png create mode 100644 tools/compare/test/reference/Image2.png create mode 100644 tools/compare/test/reference/Image3.png diff --git a/tools/compare/compare.js b/tools/compare/compare.js index 77d4bbe0b8..24a5583f7b 100644 --- a/tools/compare/compare.js +++ b/tools/compare/compare.js @@ -21,6 +21,11 @@ // TODO: If this tool gets any more complicated, we should use something like React :-). +// Helper function. +function $(id) { + return document.getElementById(id); +} + // Images we discovered in the vexflow/build/images/current folder. let currentImages = {}; // FileSystemFileHandle let currentImagesNames = []; @@ -31,21 +36,34 @@ let referenceImagesNames = []; let filterStrings = []; -let currentIMGElement; -let referenceIMGElement; +// elements so we can display the current & reference images. +let currentImageElement; +let referenceImageElement; -// Helper function. -function $(id) { - return document.getElementById(id); -} +// Use canvas for the image diff. +let currentCanvas; +let currentContext; +let currentImageWidth = 0; +let currentImageHeight = 0; + +let referenceCanvas; +let referenceContext; +let referenceImageWidth = 0; +let referenceImageHeight = 0; + +let diffHelperFunction; +let diffCanvas; +let diffContext; + +let imagesContainer; ////////////////////////////////////////////////////////////////////////////////////////////////// // View Mode -const SIDE_BY_SIDE = 0; -const ALTERNATE = 1; -const STACK = 2; -const DIFF = 3; +const SIDE_BY_SIDE = 0; // Show current / reference images side-by-side. +const ALTERNATE = 1; // Alternate between current / reference images. +const STACK = 2; // Show current / reference images stacked on top of each other. The top image is translucent with 80% opacity. +const DIFF = 3; // Show a visual diff between the current / reference images. let viewMode = loadCurrentViewMode(); @@ -79,69 +97,45 @@ let cursor = 0; ////////////////////////////////////////////////////////////////////////////////////////////////// // Open Folders +// IMAGES +// Choose a folder that contains two subfolders: current/ and reference/. +// Usually, this is the vexflow/build/images/ folder. +// CURRENT +// Choose any folder that contains the current images. The folder does not need to be called 'current'. +// REFERENCE +// Choose any folder that contains the reference images. The folder does not need to be called 'reference'. +function getDirectoryPicker(processCallback) { + return async function () { + // Ask the user to choose a folder. + // Window.showDirectoryPicker() returns a handle for the directory. + try { + const dirHandle = await window.showDirectoryPicker(); + processCallback(dirHandle); + } catch (err) { + // console.error(err.name, err.message); // AbortError The user aborted a request. + console.log('The user closed the dialog without selecting a folder.'); + } + }; +} -// Choose a folder that contains two subfolders: current/ and reference/. -// Usually, this is the vexflow/build/images/ folder. -async function openImagesFolder() { - // Ask the user to choose a folder. - // Window.showDirectoryPicker() returns a handle for the directory. - try { - const dirHandle = await window.showDirectoryPicker(); - processImagesFolder(dirHandle); - } catch (err) { - // console.error(err.name, err.message); // AbortError The user aborted a request. - console.log('The user closed the dialog without selecting a folder.'); - } +function openImagesFolder() { + getDirectoryPicker(processImagesFolder)(); } -// Choose any folder that contains the current images. The folder does not need to be called 'current'. -async function openCurrentFolder() { - // Ask the user to choose a folder. - // Window.showDirectoryPicker() returns a handle for the directory. - try { - const dirHandle = await window.showDirectoryPicker(); - console.log(dirHandle); - } catch (err) { - // console.error(err.name, err.message); // AbortError The user aborted a request. - console.log('The user closed the dialog without selecting a folder.'); - } +function openCurrentFolder() { + getDirectoryPicker(processCurrentFolder)(); } -// Choose any folder that contains the reference images. The folder does not need to be called 'reference'. -async function openReferenceFolder() { - // Ask the user to choose a folder. - // Window.showDirectoryPicker() returns a handle for the directory. - try { - const dirHandle = await window.showDirectoryPicker(); - console.log(dirHandle); - } catch (err) { - // console.error(err.name, err.message); // AbortError The user aborted a request. - console.log('The user closed the dialog without selecting a folder.'); - } +function openReferenceFolder() { + getDirectoryPicker(processReferenceFolder)(); } ////////////////////////////////////////////////////////////////////////////////////////////////// -function droppedFilesOnImagesDropTarget() {} - -function droppedFilesOnSelectBoxCurrent(e) { - [...e.dataTransfer.items].forEach((item, i) => { - // If dropped items aren't files, reject them - if (item.kind === 'file') { - const file = item.getAsFile(); - console.log(`CURR: file[${i}].name = ${file.name}`); - } - }); -} - -function droppedFilesOnSelectBoxReference(e) { - [...e.dataTransfer.items].forEach((item, i) => { - // If dropped items aren't files, reject them - if (item.kind === 'file') { - const file = item.getAsFile(); - console.log(`REF: file[${i}].name = ${file.name}`); - } - }); +function addClickListeners() { + $('chooseImagesFolder').addEventListener('click', getDirectoryPicker(processImagesFolder)); + $('chooseCurrentFolder').addEventListener('click', getDirectoryPicker(processCurrentFolder)); + $('chooseReferenceFolder').addEventListener('click', getDirectoryPicker(processReferenceFolder)); } let dragCounter = 0; @@ -186,65 +180,44 @@ function hideDropTargets() { } function addDropTargets() { - $('drop-target-images').addEventListener('drop', async (e) => { - // Prevent navigation. - e.preventDefault(); - - // Process all of the items. - for (const item of e.dataTransfer.items) { - // Careful: `kind` will be 'file' for both file _and_ directory entries. - if (item.kind === 'file') { - const handle = await item.getAsFileSystemHandle(); - if (handle.kind === 'directory') { - processImagesFolder(handle); - } - } - } - }); - - $('drop-target-current').addEventListener('drop', async (e) => { + const getProcessFolderHandler = (processCallback) => async (e) => { // Prevent navigation. e.preventDefault(); - // Process all of the items. + // Process all items, but stop once we find the first folder. for (const item of e.dataTransfer.items) { - // Careful: `kind` will be 'file' for both file _and_ directory entries. + // item.kind will be 'file' for both file _and_ directory entries. if (item.kind === 'file') { const handle = await item.getAsFileSystemHandle(); if (handle.kind === 'directory') { - console.log(handle); - // processImagesFolder(handle); + processCallback(handle); + return; } } } - }); + }; - $('drop-target-reference').addEventListener('drop', async (e) => { - // Prevent navigation. - e.preventDefault(); + $('drop-target-images').addEventListener('drop', getProcessFolderHandler(processImagesFolder)); + $('drop-target-current').addEventListener('drop', getProcessFolderHandler(processCurrentFolder)); + $('drop-target-reference').addEventListener('drop', getProcessFolderHandler(processReferenceFolder)); +} - // Process all of the items. - for (const item of e.dataTransfer.items) { - // Careful: `kind` will be 'file' for both file _and_ directory entries. - if (item.kind === 'file') { - const handle = await item.getAsFileSystemHandle(); - if (handle.kind === 'directory') { - console.log(handle); - // processImagesFolder(handle); - } - } - } - }); +function app(diffFunction) { + imagesContainer = $('images'); + addListeners(); + setDiffFunction(diffFunction); } function addListeners() { + addClickListeners(); addWindowDragListeners(); addDropTargets(); // Keyboard Shortcuts document.addEventListener('keydown', (e) => { e = e || window.event; - const isAltKeyPressed = e.altKey; + const isControlOrMetaKeyPressed = e.ctrlKey || e.metaKey; + const isShiftKeyPressed = e.shiftKey; const key = e.key.toLowerCase(); switch (key) { case 'escape': @@ -253,21 +226,21 @@ function addListeners() { document.activeElement.blur(); break; case 'c': - if (isAltKeyPressed) { - console.log('Open the current/ folder.'); + if (isControlOrMetaKeyPressed && isShiftKeyPressed) { + e.preventDefault(); openCurrentFolder(); } break; case 'r': - if (isAltKeyPressed) { - console.log('Open the reference/ folder.'); + if (isControlOrMetaKeyPressed && isShiftKeyPressed) { + e.preventDefault(); openReferenceFolder(); } break; case 'o': case 'i': - if (isAltKeyPressed) { - console.log('Open the images/ folder.'); + if (isControlOrMetaKeyPressed && isShiftKeyPressed) { + e.preventDefault(); openImagesFolder(); } break; @@ -310,8 +283,7 @@ function addListeners() { // Nothing for now. break; default: - // Nothing for now. - console.log('Unhandled Shortcut:', key); + // console.log('Unhandled Shortcut:', key); break; } }); @@ -342,6 +314,9 @@ async function processCurrentFolder(dirHandle) { const entries = await dirHandle.values(); for await (const entry of entries) { const fileName = entry.name; + if (entry.kind === 'directory') { + continue; + } currentImages[fileName] = entry; currentImagesNames.push(fileName); } @@ -358,6 +333,9 @@ async function processReferenceFolder(dirHandle) { const entries = await dirHandle.values(); for await (const entry of entries) { const fileName = entry.name; + if (entry.kind === 'directory') { + continue; + } referenceImages[fileName] = entry; referenceImagesNames.push(fileName); } @@ -408,10 +386,12 @@ function filterResults() { async function selectedCurrentImage() { let selectBox = $('selectBoxCurrent'); - // Select the corresponding item on the right side. + // Select the corresponding item on the right side, if it exists. let selectedImageFileName = selectBox.options[selectBox.selectedIndex].value; - let referenceImage = $('reference_' + selectedImageFileName); - referenceImage.selected = true; + let correspondingElement = $('reference_' + selectedImageFileName); + if (correspondingElement) { + correspondingElement.selected = true; + } showImages(selectedImageFileName); } @@ -419,14 +399,25 @@ async function selectedCurrentImage() { async function selectedReferenceImage() { let selectBox = $('selectBoxReference'); - // Select the corresponding item on the left side. + // Select the corresponding item on the left side, if it exists. let selectedImageFileName = selectBox.options[selectBox.selectedIndex].value; - let currentImage = $('current_' + selectedImageFileName); - currentImage.selected = true; + let correspondingElement = $('current_' + selectedImageFileName); + if (correspondingElement) { + correspondingElement.selected = true; + } showImages(selectedImageFileName); } +function createCanvas(w, h) { + const canvas = document.createElement('canvas'); + canvas.width = w; + canvas.height = h; + canvas.style.width = w + 'px'; + canvas.style.height = h + 'px'; + return canvas; +} + async function showImages(selectedImageFileName) { const currentFileHandle = currentImages[selectedImageFileName]; const referenceFileHandle = referenceImages[selectedImageFileName]; @@ -434,35 +425,58 @@ async function showImages(selectedImageFileName) { const cFile = await currentFileHandle.getFile(); const rFile = await referenceFileHandle.getFile(); - const cURL = URL.createObjectURL(cFile); - const rURL = URL.createObjectURL(rFile); - - const imagesContainer = $('images'); - // Clear the images container. while (imagesContainer.firstChild) { imagesContainer.removeChild(imagesContainer.firstChild); } - // Add the two new images. - currentIMGElement = document.createElement('img'); - currentIMGElement.id = 'currentImage'; - currentIMGElement.src = cURL; - currentIMGElement.style.zIndex = 1; - imagesContainer.appendChild(currentIMGElement); - - referenceIMGElement = document.createElement('img'); - referenceIMGElement.id = 'referenceImage'; - referenceIMGElement.src = rURL; - referenceIMGElement.style.zIndex = -1; - imagesContainer.appendChild(referenceIMGElement); + const cURL = URL.createObjectURL(cFile); + const rURL = URL.createObjectURL(rFile); + currentImageElement = new Image(); + currentImageElement.src = cURL; + currentImageElement.onload = () => { + currentImageElement.id = 'currentImage'; + currentImageElement.style.zIndex = 1; + const w = currentImageElement.naturalWidth; + const h = currentImageElement.naturalHeight; + // Make a canvas of the same size and assign it to currentCanvas. + currentCanvas = createCanvas(w, h); + // Draw the image onto the canvas. + currentContext = currentCanvas.getContext('2d', { + willReadFrequently: true, + }); + currentContext.drawImage(currentImageElement, 0, 0, w, h); + currentImageWidth = w; + currentImageHeight = h; + }; + + referenceImageElement = new Image(); + referenceImageElement.src = rURL; + referenceImageElement.onload = () => { + referenceImageElement.id = 'referenceImage'; + referenceImageElement.style.zIndex = -1; + const w = referenceImageElement.naturalWidth; + const h = referenceImageElement.naturalHeight; + // Make a canvas of the same size and assign it to referenceCanvas. + referenceCanvas = createCanvas(w, h); + // Draw the image onto the canvas. + referenceContext = referenceCanvas.getContext('2d', { + willReadFrequently: true, + }); + referenceContext.drawImage(referenceImageElement, 0, 0, w, h); + referenceImageWidth = w; + referenceImageHeight = h; + }; + + await currentImageElement.decode(); + await referenceImageElement.decode(); updateUIForViewMode(); } function flipBetweenImages() { - currentIMGElement.style.zIndex = cursor; - referenceIMGElement.style.zIndex = 1 - cursor; + currentImageElement.style.zIndex = cursor; + referenceImageElement.style.zIndex = 1 - cursor; updateLabelsForViewMode(); } @@ -478,44 +492,47 @@ function hideHelpText() { // Different View Modes function updateUIForViewMode() { - switch (viewMode) { - case SIDE_BY_SIDE: - console.log('Show current / reference images side by side.'); - break; - case ALTERNATE: - console.log('Alternate between current / reference images.'); - break; - case STACK: - console.log( - 'Show current / reference images stacked on top of each other. The top image is translucent with 50% opacity.' - ); - break; - case DIFF: - console.log('Show a visual diff between the current / reference images.'); - break; - default: - console.log('Unknown view mode.'); - break; - } - updateImagesForViewMode(); updateLabelsForViewMode(); } +function addImageElements() { + imagesContainer.appendChild(currentImageElement); + imagesContainer.appendChild(referenceImageElement); +} + +function removeImageElements() { + if (currentImageElement && currentImageElement.parentNode === imagesContainer) { + imagesContainer.removeChild(currentImageElement); + } + if (referenceImageElement && referenceImageElement.parentNode === imagesContainer) { + imagesContainer.removeChild(referenceImageElement); + } +} + function updateImagesForViewMode() { + currentImageElement.style.opacity = 1.0; + referenceImageElement.style.opacity = 1.0; + switch (viewMode) { case SIDE_BY_SIDE: - currentIMGElement.style.position = 'static'; - referenceIMGElement.style.position = 'static'; + removeDiffCanvas(); + addImageElements(); + currentImageElement.style.position = 'static'; + referenceImageElement.style.position = 'static'; break; case ALTERNATE: - currentIMGElement.style.position = 'absolute'; - referenceIMGElement.style.position = 'absolute'; + removeDiffCanvas(); + addImageElements(); + updateAlternatingImages(); break; case STACK: + removeDiffCanvas(); + addImageElements(); updateStackedImages(); break; case DIFF: + updateDiff(); break; default: console.log('Unknown view mode.'); @@ -526,35 +543,86 @@ function updateImagesForViewMode() { function updateLabelsForViewMode() { switch (viewMode) { case SIDE_BY_SIDE: + case DIFF: $('labelCurrent').style.opacity = 1; $('labelReference').style.opacity = 1; break; case ALTERNATE: - break; case STACK: - if (currentIMGElement.style.zIndex > referenceIMGElement.style.zIndex) { - console.log('CURRENT!!!'); + if (currentImageElement.style.zIndex > referenceImageElement.style.zIndex) { $('labelCurrent').style.opacity = 1; $('labelReference').style.opacity = 0.4; } else { - console.log('REFERENCE'); $('labelCurrent').style.opacity = 0.4; $('labelReference').style.opacity = 1; } break; - case DIFF: - break; default: console.log('Unknown view mode.'); break; } } +function updateAlternatingImages() { + currentImageElement.style.position = 'absolute'; + referenceImageElement.style.position = 'absolute'; + currentImageElement.style.opacity = 1.0; + referenceImageElement.style.opacity = 1.0; + if (cursor === 0) { + currentImageElement.style.zIndex = 1; + referenceImageElement.style.zIndex = -1; + } else { + referenceImageElement.style.zIndex = 1; + currentImageElement.style.zIndex = -1; + } +} + function updateStackedImages() { - currentIMGElement.style.position = 'absolute'; - referenceIMGElement.style.position = 'absolute'; + currentImageElement.style.position = 'absolute'; + referenceImageElement.style.position = 'absolute'; + if (cursor === 0) { + currentImageElement.style.zIndex = 1; + currentImageElement.style.opacity = 0.8; + referenceImageElement.style.zIndex = -1; + referenceImageElement.style.opacity = 1.0; + } else { + referenceImageElement.style.zIndex = 1; + referenceImageElement.style.opacity = 0.8; + currentImageElement.style.zIndex = -1; + currentImageElement.style.opacity = 1.0; + } +} + +function removeDiffCanvas() { + if (diffCanvas && diffCanvas.parentNode) { + diffCanvas.parentNode.removeChild(diffCanvas); + } +} + +function updateDiff() { + removeImageElements(); + + const c = currentContext.getImageData(0, 0, currentImageWidth, currentImageHeight); + const r = referenceContext.getImageData(0, 0, referenceImageWidth, referenceImageHeight); + + const maxW = Math.max(currentImageWidth, referenceImageWidth); + const maxH = Math.max(currentImageHeight, referenceImageHeight); + + removeDiffCanvas(); + diffCanvas = createCanvas(maxW, maxH); + diffContext = diffCanvas.getContext('2d'); + + const diffImage = diffContext.createImageData(maxW, maxH); + diffHelperFunction(c.data, r.data, diffImage.data, maxW, maxH, { threshold: 0.1 }); + + diffContext.putImageData(diffImage, 0, 0); + imagesContainer.appendChild(diffCanvas); } function isFocusedOnInput() { return document.activeElement.tagName === 'INPUT'; } + +function setDiffFunction(fcn) { + diffHelperFunction = fcn; +} diff --git a/tools/compare/index.html b/tools/compare/index.html index 4a0df867b0..ec80409252 100644 --- a/tools/compare/index.html +++ b/tools/compare/index.html @@ -97,8 +97,8 @@ #images img { background-color: white; - margin: 4px; - padding: 4px; + margin: 5px; + padding: 6px; border: 1px solid #777; } @@ -194,9 +194,8 @@ @@ -218,14 +217,14 @@     grunt generate:current
    grunt generate:reference

Shortcuts:
-     Alt + I - select the images/ folder. This folder needs to - contain current/ and reference/ subfolders.
-     Alt + C - select the current/ folder. This can be any folder, - and does not need to be named "current". This allows you to choose arbitrary folders to compare (e.g., from two - different repos).
-     Alt + R - select the reference/ folder. This can be any folder, - and does not need to be named "reference". This allows you to choose arbitrary folders to compare (e.g., from two - different repos).

+     CTRL + SHIFT + I - select the images/ folder. This folder needs + to contain current/ and reference/ subfolders.
+     CTRL + SHIFT + C - select the current/ folder. This can be any + folder, and does not need to be named "current". This allows you to choose arbitrary folders to compare (e.g., + from two different repos).
+     CTRL + SHIFT + R - select the reference/ folder. This can be any + folder, and does not need to be named "reference". This allows you to choose arbitrary folders to compare (e.g., + from two different repos).

    1 - Show images side-by-side
    2 - Flip between current / reference image. Use LEFT | RIGHT arrow keys.
@@ -240,7 +239,7 @@

Click to open: - vexflow/build/images/vexflow/build/images/
If a "Let site view files?" pop-up appears, choose View Files.

@@ -263,8 +262,12 @@

diff --git a/tools/compare/test/current/Image1.png b/tools/compare/test/current/Image1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4a4d0994530c702e117740db53686d20e37295 GIT binary patch literal 12921 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 literal 0 HcmV?d00001 diff --git a/tools/compare/test/current/Image2.png b/tools/compare/test/current/Image2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4e4a39d40641a6858ec5e6996878d7ae9b5d3a GIT binary patch literal 14283 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 literal 0 HcmV?d00001 diff --git a/tools/compare/test/reference/Image2.png b/tools/compare/test/reference/Image2.png new file mode 100644 index 0000000000000000000000000000000000000000..729403ffeca221a54308a014b329ecf641a89a26 GIT binary patch literal 12964 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 literal 0 HcmV?d00001