Skip to content

Commit bc20873

Browse files
committed
refactor: replace node-canvas with sharp for image processing
- Dropped `canvas` from package.json, lockfile, forge config, and vite externals. - Removed canvas-related system dependencies (`cairo`, `pango`, `libjpeg-turbo`, `giflib`, `libsvgtiny`, etc.) from Arch PKGBUILD. - Removed corresponding build inputs from Nix packaging and kept only `vips` for `sharp`. - Updated Nix `npmDepsHash` and version date. - Simplified image pixel extraction in theme generator to use `sharp` instead of canvas.
1 parent 7ed3544 commit bc20873

File tree

7 files changed

+16
-53
lines changed

7 files changed

+16
-53
lines changed

forge.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ const config: ForgeConfig = {
8282
fs.readFileSync(path.resolve(buildPath, "package.json")).toString()
8383
);
8484
packageJson.dependencies = {
85-
canvas: "^3.1.2",
8685
conf: "^14.0.0",
8786
keytar: "^7.9.0",
8887
sharp: "^0.34.3",

package-lock.json

Lines changed: 0 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
"@tailwindcss/vite": "^4.1.11",
8787
"@tanstack/react-query": "^5.84.1",
8888
"@uiw/react-color": "^2.7.3",
89-
"canvas": "^3.1.2",
9089
"chroma.ts": "^1.0.10",
9190
"class-variance-authority": "^0.7.0",
9291
"clsx": "^2.1.1",

packaging/arch/PKGBUILD

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ pkgdesc="Wallpaper and theme management application"
66
arch=("x86_64")
77
url="https://github.com/kasper24/walltone"
88
license=("GPL3")
9-
depends=("nss" "libsecret" "cairo" "pango" "libjpeg-turbo"
10-
"giflib" "libsvgtiny" "swaybg" "mpvpaper"
11-
"linux-wallpaperengine" "cage" "grim" "ffmpeg")
9+
depends=("nss" "libsecret" "swaybg" "mpvpaper" "linux-wallpaperengine" "cage" "grim" "ffmpeg")
1210
makedepends=("npm" "nodejs" "git")
1311
source=("$pkgname::git+$url.git")
1412
sha256sums=("SKIP")

packaging/nix/package.nix

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,6 @@
33
fetchurl,
44
buildNpmPackage,
55
libsecret,
6-
pixman,
7-
cairo,
8-
pango,
9-
libjpeg,
10-
libpng,
11-
librsvg,
12-
giflib,
136
pkg-config,
147
makeWrapper,
158
electron-bin,
@@ -43,11 +36,11 @@ let
4336
in
4437
buildNpmPackage rec {
4538
pname = "walltone";
46-
version = "unstable-2025-08-02";
39+
version = "unstable-2025-08-08";
4740

4841
src = ../../.;
4942

50-
npmDepsHash = "sha256-bTD9ZQ9p+Q2CGiBXRrIRQgDtz809HNilnuOhplrGtUw=";
43+
npmDepsHash = "sha256-WhiEyynQReumK4L7JGtfnunwaiiugObHuxZG7D3OppY=";
5144

5245
dontNpmBuild = true;
5346
makeCacheWritable = true;
@@ -67,17 +60,6 @@ buildNpmPackage rec {
6760

6861
buildInputs = [
6962
libsecret
70-
71-
# Node-Canvas dependencies
72-
pixman
73-
cairo
74-
pango
75-
libjpeg
76-
libpng
77-
librsvg
78-
giflib
79-
80-
# Sharp dependencies
8163
vips
8264
];
8365

src/electron/main/trpc/routes/theme/generator/index.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { parentPort } from "worker_threads";
2-
import { createCanvas, loadImage } from "canvas";
32
import quantize, { ColorMap } from "quantize";
43
import {
54
argbFromRgb,
@@ -11,18 +10,26 @@ import * as chroma from "chroma.ts";
1110
import { type SettingsSchema } from "@electron/main/trpc/routes/settings/index.js";
1211
import generateMaterialTheme from "./material.js";
1312
import generateBase16Theme from "./base16.js";
13+
import sharp from "sharp";
1414

1515
type Base16Settings = SettingsSchema["themeGeneration"]["base16"];
1616
type MaterialPixel = number;
1717
type QuantizePixel = [number, number, number];
1818
type QuantizeLib = "material" | "quantize";
1919

2020
const getBytesFromImageSrc = async (imageSrc: string) => {
21-
const image = await loadImage(imageSrc);
22-
const canvas = createCanvas(image.width, image.height);
23-
const context = canvas.getContext("2d");
24-
context.drawImage(image, 0, 0);
25-
return context.getImageData(0, 0, image.width, image.height).data;
21+
let src: string | ArrayBuffer = imageSrc;
22+
23+
if (imageSrc.startsWith("http://") || imageSrc.startsWith("https://")) {
24+
const response = await fetch(imageSrc);
25+
if (!response.ok) {
26+
throw new Error(`Failed to fetch image from ${imageSrc}`);
27+
}
28+
src = await response.arrayBuffer();
29+
}
30+
31+
const { data } = await sharp(src).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
32+
return new Uint8ClampedArray(data);
2633
};
2734

2835
const getPixelsFromBytes = (

vite.base.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ export const external = [
99
...builtins,
1010
"conf",
1111
"keytar",
12-
"canvas",
1312
"sharp",
1413
// ...Object.keys("dependencies" in pkg ? (pkg.dependencies as Record<string, unknown>) : {}),
1514
];

0 commit comments

Comments
 (0)