diff --git a/index.js b/index.js index e380c57..7482e63 100644 --- a/index.js +++ b/index.js @@ -77,6 +77,7 @@ const { sam, settings_tab_ts, one_button_prompt, + enum_ts, } = require('./typescripts/dist/bundle') const io = require('./utility/io') diff --git a/package-lock.json b/package-lock.json index 9d7bf08..e2d4a9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", + "changedpi": "^1.0.4", "fastify": "^4.10.2", "jimp": "^0.16.2", "madge": "^6.0.0", @@ -3879,6 +3880,11 @@ "node": ">=4" } }, + "node_modules/changedpi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/changedpi/-/changedpi-1.0.4.tgz", + "integrity": "sha512-9r6MNQrbg+cFURvEy10wo9Q35PD5GVj2GvXCbUYv8mU0Uf/NbkR7KlzMrjT4Ycd8a2nxApFJXQX2lTOPRFyG2g==" + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -12180,6 +12186,11 @@ "supports-color": "^5.3.0" } }, + "changedpi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/changedpi/-/changedpi-1.0.4.tgz", + "integrity": "sha512-9r6MNQrbg+cFURvEy10wo9Q35PD5GVj2GvXCbUYv8mU0Uf/NbkR7KlzMrjT4Ycd8a2nxApFJXQX2lTOPRFyG2g==" + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", diff --git a/package.json b/package.json index bfef60b..e059028 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", + "changedpi": "^1.0.4", "fastify": "^4.10.2", "jimp": "^0.16.2", "madge": "^6.0.0", diff --git a/typescripts/@types/changedpi.d.ts b/typescripts/@types/changedpi.d.ts new file mode 100644 index 0000000..13ef93d --- /dev/null +++ b/typescripts/@types/changedpi.d.ts @@ -0,0 +1 @@ +declare module 'changedpi' diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 9f327c7..b2a2b8e 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -19,5 +19,5 @@ export * as sd_tab_ts from './sd_tab/sd_tab' export * as sam from './sam/sam' export * as settings_tab_ts from './settings/settings' export * as one_button_prompt from './one_button_prompt/one_button_prompt' - +export * as enum_ts from './util/ts/enum' export { toJS } from 'mobx' diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index 39ad6af..a4f4713 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -18,6 +18,7 @@ import { import { app } from 'photoshop' import { ErrorBoundary } from '../util/errorBoundary' import Locale from '../locale/locale' +import { settings_tab_ts } from '../entry' declare let g_sd_url: string export async function getSamMap(base64: string, prompt: string) { @@ -119,30 +120,32 @@ export class Sam extends React.Component<{ ComponentType: PenSvg, callback: async (index: number) => { try { - // await psapi.unSelectMarqueeExe() - // const base64 = general.base64UrlToBase64( - // store.data.thumbnails[index] - // ) + await psapi.unSelectMarqueeExe() + const base64 = general.base64UrlToBase64( + store.data.thumbnails[index] + ) - // await selectionFromBlackAndWhiteImage( - // base64, - // store.data.selection_info_list[index] - // ) + await selectionFromBlackAndWhiteImage( + base64, + store.data.selection_info_list[index], + settings_tab_ts.store.data + .b_borders_or_corners + ) - try { - const base64 = - general.base64UrlToBase64( - store.data.thumbnails[index] - ) - await selection.base64ToLassoSelection( - base64, - store.data.selection_info_list[ - index - ] - ) - } catch (e) { - console.warn(e) - } + // try { + // const base64 = + // general.base64UrlToBase64( + // store.data.thumbnails[index] + // ) + // await selection.base64ToLassoSelection( + // base64, + // store.data.selection_info_list[ + // index + // ] + // ) + // } catch (e) { + // console.warn(e) + // } //@ts-ignore await eventHandler() // this will trigger the recalculation of the width and height sliders } catch (e) { diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index 94efd4d..7475d9d 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -10,6 +10,7 @@ import { io } from '../util/oldSystem' import { reaction } from 'mobx' import { storage } from 'uxp' import { ErrorBoundary } from '../util/errorBoundary' +import { MaskModeEnum } from '../util/ts/enum' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -40,7 +41,7 @@ export const store = new AStore({ should_log_to_file: JSON.parse(storage.localStorage.getItem('should_log_to_file')) || false, delete_log_file_timer_id: null, - b_borders_or_corners: false, + b_borders_or_corners: MaskModeEnum.Transparent, }) function onShouldLogToFileChange(event: any) { @@ -138,17 +139,19 @@ export class Settings extends React.Component<{}> { style={{ display: 'flex' }} selected={store.data.b_borders_or_corners} onClick={(event: any) => { - store.data.b_borders_or_corners = JSON.parse( - event.target.value - ) + store.data.b_borders_or_corners = event.target.value }} > {Locale('Mask Layer Mode:')} {[ - { label: 'keep borders', value: false }, - { label: 'keep corners', value: true }, + { + label: 'fully transparent', + value: MaskModeEnum.Transparent, + }, + { label: 'keep borders', value: MaskModeEnum.Borders }, + { label: 'keep corners', value: MaskModeEnum.Corners }, ].map((mode: any, index: number) => { console.log('mode:', mode.label, ' index:', index) return ( diff --git a/typescripts/util/ts/enum.ts b/typescripts/util/ts/enum.ts index a20cc7d..2984e0f 100644 --- a/typescripts/util/ts/enum.ts +++ b/typescripts/util/ts/enum.ts @@ -7,3 +7,9 @@ export enum GenerationModeEnum { LassoInpaint = 'lasso_inpaint', LassoOutpaint = 'lasso_outpaint', } + +export enum MaskModeEnum { + Transparent = 'transparent', + Borders = 'border', + Corners = 'corner', +} diff --git a/typescripts/util/ts/selection.ts b/typescripts/util/ts/selection.ts index 543e011..9f228c4 100644 --- a/typescripts/util/ts/selection.ts +++ b/typescripts/util/ts/selection.ts @@ -3,6 +3,7 @@ import { io, layer_util } from '../oldSystem' import { session_ts } from '../../entry' import { action, core } from 'photoshop' +import { MaskModeEnum } from './enum' const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay @@ -10,7 +11,7 @@ export async function applyMaskFromBlackAndWhiteImage( black_and_white_base64: string, layer_id: any, selectionInfo: any, - b_borders_or_corners: boolean = false + b_borders_or_corners: MaskModeEnum = MaskModeEnum.Transparent ) { let mask_layer try { @@ -100,7 +101,7 @@ export async function applyMaskFromBlackAndWhiteImage( export async function selectionFromBlackAndWhiteImage( black_and_white_base64: string, selectionInfo: any, - b_borders_or_corners: boolean = false + b_borders_or_corners: MaskModeEnum = MaskModeEnum.Transparent ) { let mask_layer try { diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index e0147a3..bf1d79c 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -18,7 +18,7 @@ import { io, layer_util, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' import { progress, session_ts, settings_tab_ts } from '../entry' import { reaction } from 'mobx' -import { GenerationModeEnum } from '../util/ts/enum' +import { GenerationModeEnum, MaskModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' import { action, app, core } from 'photoshop' import Locale from '../locale/locale' @@ -193,22 +193,37 @@ const add = async (base64: string, mask?: string) => { await convertGrayscaleToWhiteAndTransparent( session_ts.store.data.expanded_mask ) + if ( + settings_tab_ts.store.data.b_borders_or_corners === + MaskModeEnum.Transparent + ) { + //will use colorRange() which may or may not break + const mask_layer = await moveImageToLayer( + channel_mask_monochrome.base64, + session_ts.store.data.selectionInfo + ) - const mask_layer = await moveImageToLayer( - channel_mask_monochrome.base64, - session_ts.store.data.selectionInfo - ) - if (!mask_layer) { - throw new Error('mask_layer is empty') + if (!mask_layer) { + throw new Error('mask_layer is empty') + } + + await selection.black_white_layer_to_mask_multi_batchplay( + mask_layer.id, + layer.id, + 'mask' + ) + await layer_util.deleteLayers([mask_layer]) + } else { + // if MaskModeEnum.Borders or MaskModeEnum.Corners + // another option that doesn't use colorRange() + await applyMaskFromBlackAndWhiteImage( + channel_mask_monochrome.base64, + layer.id, + session_ts.store.data.selectionInfo, + settings_tab_ts.store.data.b_borders_or_corners + ) } - await selection.black_white_layer_to_mask_multi_batchplay( - mask_layer.id, - layer.id, - 'mask' - ) - await layer_util.deleteLayers([mask_layer]) - return layer } } diff --git a/utility/io.js b/utility/io.js index c21dc22..f8bf3ae 100644 --- a/utility/io.js +++ b/utility/io.js @@ -1304,7 +1304,7 @@ async function convertGrayscaleToMonochrome(base64) { async function convertBlackToTransparentKeepBorders( base64, - b_borders_or_corners = false // false for borders, true for corners + b_borders_or_corners = enum_ts.MaskModeEnum.Transparent // false for borders, true for corners ) { try { let jimp_mask = await Jimp.read(Buffer.from(base64, 'base64')) @@ -1317,7 +1317,7 @@ async function convertBlackToTransparentKeepBorders( width, height, function (x, y, idx) { - if (b_borders_or_corners === false) { + if (b_borders_or_corners === enum_ts.MaskModeEnum.Borders) { // keep borders if ( x === 0 || @@ -1326,7 +1326,9 @@ async function convertBlackToTransparentKeepBorders( y === height - 1 ) return - } else { + } else if ( + b_borders_or_corners === enum_ts.MaskModeEnum.Corners + ) { // keep corners if ( (x === 0 && y === 0) || @@ -1336,6 +1338,7 @@ async function convertBlackToTransparentKeepBorders( ) return } + const red = this.bitmap.data[idx + 0] const green = this.bitmap.data[idx + 1] const blue = this.bitmap.data[idx + 2]