diff --git a/src/lib/contexts/image.svelte.ts b/src/lib/contexts/image.svelte.ts index d72a2f2..4b9434f 100644 --- a/src/lib/contexts/image.svelte.ts +++ b/src/lib/contexts/image.svelte.ts @@ -1,6 +1,7 @@ import { getContext, setContext } from 'svelte' import type { FilesContext } from './files.svelte' import { toast } from 'svelte-sonner' +import { INKCLIP_HEIGHT, INKCLIP_WIDTH } from '$lib/constants' export interface ImageContext { image: ImageBitmap | null @@ -39,3 +40,8 @@ export function createImageContext(filesCtx: FilesContext): Readonly -
+
+

Write to Inkclip

+ diff --git a/src/lib/layouts/edit/controls/ControlsSection.svelte b/src/lib/layouts/edit/controls/ControlsSection.svelte index bba1110..c555c4c 100644 --- a/src/lib/layouts/edit/controls/ControlsSection.svelte +++ b/src/lib/layouts/edit/controls/ControlsSection.svelte @@ -13,19 +13,14 @@ import BiasSlider from './conversion/BiasSlider.svelte' import { getConversionConfig } from '$lib/contexts/config.svelte' - import { getImageContext } from '$lib/contexts/image.svelte' - import { INKCLIP_HEIGHT, INKCLIP_WIDTH } from '$lib/constants' + import { getImageContext, imageIsCorrectRatio } from '$lib/contexts/image.svelte' import { DEFAULT_DITHERING_KERNEL } from '$lib/image/quantizer' const imageCtx = getImageContext() const config = getConversionConfig() const transformDisabled = $derived(imageCtx.image === null) - - function imageNonSquare() { - if (imageCtx.image === null) return false - return imageCtx.image.height * INKCLIP_WIDTH !== imageCtx.image.width * INKCLIP_HEIGHT - } + const imageNonSquare = $derived(!imageIsCorrectRatio(imageCtx)) function restoreDefaultImageSettings() { config.scaleMode = 'fit' @@ -40,23 +35,23 @@

Edit image

- {#if imageNonSquare()} + {#if imageNonSquare} {/if}
- {#if imageNonSquare()} + {#if imageNonSquare} {/if}
- + - + @@ -68,7 +63,7 @@ {/if} - + + + {/if} diff --git a/src/lib/layouts/edit/preview/common.svelte.ts b/src/lib/layouts/edit/preview/common.svelte.ts index 9321b9e..88676cc 100644 --- a/src/lib/layouts/edit/preview/common.svelte.ts +++ b/src/lib/layouts/edit/preview/common.svelte.ts @@ -1,4 +1,7 @@ import { INKCLIP_HEIGHT, INKCLIP_WIDTH } from '$lib/constants' +import type { ConversionConfig } from '$lib/contexts/config.svelte' +import type { FilesContext } from '$lib/contexts/files.svelte' +import { imageIsCorrectRatio, type ImageContext } from '$lib/contexts/image.svelte' export function freshContext(el: HTMLCanvasElement) { const ctx = el.getContext('2d')! @@ -6,6 +9,47 @@ export function freshContext(el: HTMLCanvasElement) { return ctx } +export function makeAltText(filesCtx: FilesContext, imageCtx: ImageContext, config: ConversionConfig): string { + if (filesCtx.files.length < 1) return 'No image selected for e-paper preview' + + const file = filesCtx.files[0] + + const output = [`${INKCLIP_WIDTH}-by-${INKCLIP_HEIGHT}-pixels e-paper preview of "${file.name}"`] + + if (!imageIsCorrectRatio(imageCtx)) { + if (config.scaleMode === 'fit') output.push('letterboxed') + else if (config.scaleMode === 'crop') output.push('cropped to fit') + else if (config.scaleMode === 'distort') output.push('stretched to fit') + } + + if (config.transform.side === 'reverse') output.push('flipped horizontally') + + if (config.transform.rotation !== 0) output.push(`rotated ${config.transform.rotation} degrees`) + + if (config.ditheringKernel === null) output.push('no dithering') + else output.push('with dithering') + + if (config.ditheringKernel !== null) { + if (config.contrast >= 0.75) output.push('with very high contrast') + else if (config.contrast >= 0.25) output.push('with high contrast') + } + + if (config.contrast > 0 || config.ditheringKernel === null) { + const biasScaleFactor = config.ditheringKernel === null ? 1 : config.contrast + const scaledBias = config.bias * biasScaleFactor + + if (scaledBias >= 0.5) output.push('extremely biased towards black') + else if (scaledBias >= 0.25) output.push('biased towards black') + else if (scaledBias >= 0.1) output.push('slightly biased towards black') + + if (scaledBias <= -0.5) output.push('extremely biased towards white') + else if (scaledBias <= -0.25) output.push('biased towards white') + else if (scaledBias <= -0.1) output.push('slightly biased towards white') + } + + return output.join(', ') +} + export function drawQuantizedData(ctx: CanvasRenderingContext2D, data: number[]) { const imageData = ctx.createImageData(INKCLIP_WIDTH, INKCLIP_HEIGHT)