fix eyedropper interactions and remove unused code

Signed-off-by: Victor Seiji Hariki <victorseijih@gmail.com>
This commit is contained in:
Victor Seiji Hariki 2022-12-04 00:22:29 -03:00
parent 4d414186c0
commit 583f9245b6
4 changed files with 45 additions and 191 deletions

View file

@ -20,30 +20,6 @@ body {
overflow: clip; overflow: clip;
} }
.container {
position: relative;
}
.backgroundCanvas {
background-color: #ccc;
}
.mainHSplit {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: repeat(2, 1fr);
grid-column-gap: 5px;
grid-row-gap: 5px;
}
.uiWrapper {
display: grid;
grid-template-columns: 1fr 15fr;
grid-template-rows: 1fr;
grid-column-gap: 5px;
grid-row-gap: 5px;
}
.collapsible { .collapsible {
background-color: rgb(0, 0, 0); background-color: rgb(0, 0, 0);
color: rgb(255, 255, 255); color: rgb(255, 255, 255);
@ -88,28 +64,6 @@ body {
cursor: auto; cursor: auto;
} }
.canvasHolder {
position: relative;
width: 2560px;
height: 1440px;
}
.mainCanvases {
position: absolute;
top: 0px;
left: 0px;
width: 2560px;
height: 1440px;
}
.masks {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 1fr;
grid-column-gap: 0px;
grid-row-gap: 0px;
}
/* Mask colors for mask inversion */ /* Mask colors for mask inversion */
/* Filters are some magic acquired at https://codepen.io/sosuke/pen/Pjoqqp */ /* Filters are some magic acquired at https://codepen.io/sosuke/pen/Pjoqqp */
.mask-canvas { .mask-canvas {
@ -135,13 +89,6 @@ body {
brightness(103%) contrast(108%); brightness(103%) contrast(108%);
} }
.strokeText {
-webkit-text-stroke: 1px #000;
font-size: 150%;
font-weight: 600;
color: #fff;
}
.wideSelect { .wideSelect {
width: 100%; width: 100%;
text-overflow: ellipsis; text-overflow: ellipsis;

View file

@ -114,7 +114,6 @@ function startup() {
changeSampler(); changeSampler();
changeMaskBlur(); changeMaskBlur();
changeSeed(); changeSeed();
changeOverMaskPx();
changeHiResFix(); changeHiResFix();
} }
@ -340,106 +339,10 @@ function newImage(evt) {
}); });
} }
function prevImg(evt) {
if (imageIndex == 0) {
imageIndex = totalImagesReturned;
}
changeImg(false);
}
function nextImg(evt) {
if (imageIndex == totalImagesReturned - 1) {
imageIndex = -1;
}
changeImg(true);
}
function changeImg(forward) {
const img = new Image();
tempCtx.clearRect(0, 0, tempCtx.width, tempCtx.height);
img.onload = function () {
tempCtx.drawImage(img, tmpImgXYWH.x, tmpImgXYWH.y); //imgCtx for actual image, tmp for... holding?
};
var tmpIndex = document.getElementById("currentImgIndex");
if (forward) {
imageIndex++;
} else {
imageIndex--;
}
tmpIndex.innerText = imageIndex + 1;
// load the image data after defining the closure
img.src = "data:image/png;base64," + returnedImages[imageIndex]; //TODO need way to dream batches and select from results
}
function removeChoiceButtons(evt) {
const element = document.getElementById("veryTempDiv");
element.remove();
tempCtx.clearRect(0, 0, tempCanvas.width, tempCanvas.height);
}
function backupAndClearMask(x, y, w, h) {
var clearArea = maskPaintCtx.createImageData(w, h);
backupMaskChunk = maskPaintCtx.getImageData(x, y, w, h);
backupMaskX = x;
backupMaskY = y;
var clearD = clearArea.data;
for (i = 0; i < clearD.length; i += 4) {
clearD[i] = 0;
clearD[i + 1] = 0;
clearD[i + 2] = 0;
clearD[i + 3] = 0;
}
maskPaintCtx.putImageData(clearArea, x, y);
}
function restoreBackupMask() {
// reapply mask if exists
if (backupMaskChunk != null && backupMaskX != null && backupMaskY != null) {
// backup mask data exists
var iData = new ImageData(
backupMaskChunk.data,
backupMaskChunk.height,
backupMaskChunk.width
);
maskPaintCtx.putImageData(iData, backupMaskX, backupMaskY);
}
}
function clearBackupMask() {
// clear backupmask
backupMaskChunk = null;
backupMaskX = null;
backupMaskY = null;
}
function clearImgMask() {
imgCtx.clearRect(0, 0, imgCanvas.width, imgCanvas.height);
}
function clearPaintedMask() { function clearPaintedMask() {
maskPaintCtx.clearRect(0, 0, maskPaintCanvas.width, maskPaintCanvas.height); maskPaintCtx.clearRect(0, 0, maskPaintCanvas.width, maskPaintCanvas.height);
} }
function placeImage() {
const img = new Image();
img.onload = function () {
commands.runCommand("drawImage", "Image Dream", {
x: tmpImgXYWH.x,
y: tmpImgXYWH.y,
image: img,
});
tmpImgXYWH = {};
returnedImages = null;
};
// load the image data after defining the closure
img.src = "data:image/png;base64," + returnedImages[imageIndex];
}
function sleep(ms) {
// what was this even for, anyway?
return new Promise((resolve) => setTimeout(resolve, ms));
}
function march(bb) { function march(bb) {
const expanded = {...bb}; const expanded = {...bb};
expanded.x--; expanded.x--;
@ -563,10 +466,6 @@ makeSlider(
makeSlider("Steps", document.getElementById("steps"), "steps", 1, 70, 5, 30, 1); makeSlider("Steps", document.getElementById("steps"), "steps", 1, 70, 5, 30, 1);
function changeSnapMode() {
snapToGrid = document.getElementById("cbxSnap").checked;
}
function changeMaskBlur() { function changeMaskBlur() {
stableDiffusionData.mask_blur = parseInt( stableDiffusionData.mask_blur = parseInt(
document.getElementById("maskBlur").value document.getElementById("maskBlur").value
@ -579,11 +478,6 @@ function changeSeed() {
localStorage.setItem("seed", stableDiffusionData.seed); localStorage.setItem("seed", stableDiffusionData.seed);
} }
function changeOverMaskPx() {
// overMaskPx = document.getElementById("overMaskPx").value;
// localStorage.setItem("overmask_px", overMaskPx);
}
function changeHiResFix() { function changeHiResFix() {
stableDiffusionData.enable_hr = Boolean( stableDiffusionData.enable_hr = Boolean(
document.getElementById("cbxHRFix").checked document.getElementById("cbxHRFix").checked
@ -936,15 +830,6 @@ function loadSettings() {
? false ? false
: localStorage.getItem("enable_hr") : localStorage.getItem("enable_hr")
); );
var _enable_erase = Boolean(
localStorage.getItem("enable_erase") == (null || "false")
? false
: localStorage.getItem("enable_erase")
);
var _overmask_px =
localStorage.getItem("overmask_px") == null
? 0
: localStorage.getItem("overmask_px");
// set the values into the UI // set the values into the UI
document.getElementById("prompt").value = String(_prompt); document.getElementById("prompt").value = String(_prompt);
@ -955,7 +840,6 @@ function loadSettings() {
document.getElementById("maskBlur").value = Number(_mask_blur); document.getElementById("maskBlur").value = Number(_mask_blur);
document.getElementById("seed").value = Number(_seed); document.getElementById("seed").value = Number(_seed);
document.getElementById("cbxHRFix").checked = Boolean(_enable_hr); document.getElementById("cbxHRFix").checked = Boolean(_enable_hr);
// document.getElementById("overMaskPx").value = Number(_overmask_px);
} }
imageCollection.element.addEventListener( imageCollection.element.addEventListener(

View file

@ -77,8 +77,6 @@ const layers = {
size, size,
resolution: options.resolution, resolution: options.resolution,
active: null,
/** /**
* Registers a new layer * Registers a new layer
* *
@ -87,6 +85,7 @@ const layers = {
* @param {string} options.name * @param {string} options.name
* @param {?BoundingBox} options.bb * @param {?BoundingBox} options.bb
* @param {{w: number, h: number}} options.resolution * @param {{w: number, h: number}} options.resolution
* @param {?string} options.group
* @param {object} options.after * @param {object} options.after
* @returns * @returns
*/ */
@ -101,9 +100,12 @@ const layers = {
// Bounding box for layer // Bounding box for layer
bb: {x: 0, y: 0, w: collection.size.w, h: collection.size.h}, bb: {x: 0, y: 0, w: collection.size.w, h: collection.size.h},
// Bounding box for layer // Resolution for layer
resolution: null, resolution: null,
// Group for the layer ("group/subgroup/subsubgroup")
group: null,
// If set, will insert the layer after the given one // If set, will insert the layer after the given one
after: null, after: null,
}); });
@ -168,6 +170,24 @@ const layers = {
canvas, canvas,
ctx, ctx,
/**
* Moves this layer to another level (after given layer)
*
* @param {Layer} layer Will move layer to after this one
*/
moveAfter(layer) {
layer.canvas.after(this.canvas);
},
/**
* Moves this layer to another level (before given layer)
*
* @param {Layer} layer Will move layer to before this one
*/
moveBefore(layer) {
layer.canvas.before(this.canvas);
},
/** /**
* Moves this layer to another location * Moves this layer to another location
* *
@ -204,14 +224,8 @@ const layers = {
unhide() { unhide() {
this.canvas.style.display = "block"; this.canvas.style.display = "block";
}, },
// Activates this layer
activate() {
collection.active = this;
}, },
}, _layerlogpath
_layerlogpath,
["active"]
); );
// Add to indexers // Add to indexers
@ -260,8 +274,7 @@ const layers = {
else console.debug(`[layers] Anonymous layer '${lobj.id}' deleted`); else console.debug(`[layers] Anonymous layer '${lobj.id}' deleted`);
}, },
}, },
_logpath, _logpath
["active"]
); );
layers._collections.push(collection); layers._collections.push(collection);
@ -271,11 +284,6 @@ const layers = {
`[layers] Collection '${options.name}' at ${_logpath} registered` `[layers] Collection '${options.name}' at ${_logpath} registered`
); );
// We must create a layer to select
collection
.registerLayer(options.initLayer.key, options.initLayer.options)
.activate();
return collection; return collection;
}, },
}; };

View file

@ -44,7 +44,7 @@ const colorBrushTool = () =>
resolution: {w: 7, h: 7}, resolution: {w: 7, h: 7},
after: maskPaintLayer, after: maskPaintLayer,
}); });
state.glassLayer.canvas.style.display = "none"; state.glassLayer.hide();
state.glassLayer.canvas.style.imageRendering = "pixelated"; state.glassLayer.canvas.style.imageRendering = "pixelated";
state.glassLayer.canvas.style.borderRadius = "50%"; state.glassLayer.canvas.style.borderRadius = "50%";
@ -55,10 +55,11 @@ const colorBrushTool = () =>
after: imgLayer, after: imgLayer,
}); });
state.eraseLayer.canvas.style.display = "none"; state.eraseLayer.canvas.style.display = "none";
state.eraseLayer.hide();
state.eraseBackup = imageCollection.registerLayer(null, { state.eraseBackup = imageCollection.registerLayer(null, {
after: imgLayer, after: imgLayer,
}); });
state.eraseBackup.canvas.style.display = "none"; state.eraseBackup.hide();
// Start Listeners // Start Listeners
mouse.listen.world.onmousemove.on(state.movecb); mouse.listen.world.onmousemove.on(state.movecb);
@ -131,13 +132,13 @@ const colorBrushTool = () =>
state.enableDropper = () => { state.enableDropper = () => {
state.eyedropper = true; state.eyedropper = true;
state.movecb(lastMouseMoveEvn); state.movecb(lastMouseMoveEvn);
state.glassLayer.canvas.style.display = "block"; state.glassLayer.unhide();
}; };
state.disableDropper = () => { state.disableDropper = () => {
state.eyedropper = false; state.eyedropper = false;
state.movecb(lastMouseMoveEvn); state.movecb(lastMouseMoveEvn);
state.glassLayer.canvas.style.display = "none"; state.glassLayer.hide();
}; };
let lastMouseMoveEvn = {x: 0, y: 0}; let lastMouseMoveEvn = {x: 0, y: 0};
@ -218,6 +219,13 @@ const colorBrushTool = () =>
state.setColor( state.setColor(
"#" + ((dat[0] << 16) | (dat[1] << 8) | dat[2]).toString(16) "#" + ((dat[0] << 16) | (dat[1] << 8) | dat[2]).toString(16)
); );
state.disableDropper();
}
};
state.rightclickcb = (evn) => {
if (evn.target === imageCollection.inputElement && state.eyedropper) {
state.disableDropper();
} }
}; };
@ -255,6 +263,8 @@ const colorBrushTool = () =>
}; };
state.erasestartcb = (evn) => { state.erasestartcb = (evn) => {
if (state.eyedropper) return;
state.erasing = true;
if (state.affectMask) _mask_brush_erase_callback(evn, state); if (state.affectMask) _mask_brush_erase_callback(evn, state);
// Make a backup of the current image to apply erase later // Make a backup of the current image to apply erase later
@ -270,6 +280,7 @@ const colorBrushTool = () =>
}; };
state.erasecb = (evn) => { state.erasecb = (evn) => {
if (state.eyedropper || !state.erasing) return;
if (state.affectMask) _mask_brush_erase_callback(evn, state); if (state.affectMask) _mask_brush_erase_callback(evn, state);
imgCtx.globalCompositeOperation = "destination-out"; imgCtx.globalCompositeOperation = "destination-out";
_color_brush_erase_callback(evn, state, imgCtx); _color_brush_erase_callback(evn, state, imgCtx);
@ -278,6 +289,9 @@ const colorBrushTool = () =>
}; };
state.eraseendcb = (evn) => { state.eraseendcb = (evn) => {
if (!state.erasing) return;
state.erasing = false;
const canvas = state.eraseLayer.canvas; const canvas = state.eraseLayer.canvas;
const ctx = state.eraseLayer.ctx; const ctx = state.eraseLayer.ctx;
@ -364,7 +378,8 @@ const colorBrushTool = () =>
"eyedropper" "eyedropper"
); );
brushColorEyeDropper.addEventListener("click", () => { brushColorEyeDropper.addEventListener("click", () => {
state.enableDropper(); if (state.eyedropper) state.disableDropper();
else state.enableDropper();
}); });
brushColorPickerWrapper.appendChild(brushColorPicker); brushColorPickerWrapper.appendChild(brushColorPicker);