diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5c4b087..fb9108e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -67,17 +67,23 @@ jobs:
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
continue-on-error: false
- - name: Generating `macOS Big Sur` Cursor Theme
+ - name: Generating `macOSBigSur` Cursor Theme
run: python build.py
+ - name: Uploading `macOSBigSur` Build Log artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: logs
+ path: build.log
+
- name: Uploading `bitmaps` artifact
uses: actions/upload-artifact@v2
with:
name: bitmaps
path: bitmaps/*
- - name: Uploading `macOS Big Sur` Packages artifact
+ - name: Uploading `macOSBigSur` Theme artifact
uses: actions/upload-artifact@v2
with:
- name: macOS Big Sur
- path: packages
+ name: macOSBigSur
+ path: themes
diff --git a/.gitignore b/.gitignore
index ffe783c..0c12ae6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
########## Custom
bitmaps
-packages
+themes
########## Python
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c9c9933..f0511d6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,10 +14,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Color palette Icons Changed to Semi-Circle
- Node Script with `yarn-or-npm` package ([2b026ea](https://github.com/ful1e5/apple_cursor/commit/2b026eab2cb96ff89839176297eacf80b340c7d6))
- Window **Config** Sorted ([acbbea2](https://github.com/ful1e5/apple_cursor/commit/acbbea24238fbfd43b405e4af73cc9f8b0101a59))
+- Store actual data in `install.inf` in Windows Cursors.
+- Build Logs stored to the `build.log` file
+- Out Directories are `themes` and `bitmaps`
+- Windows Cursors Package is Redesign
+- `config.ts` cleanup
### Added
-- Table Of Content in `README.md`([476c64a](https://github.com/ful1e5/apple_cursor/commit/476c64afda50ec48c576b566ce729b575608c529#diff-04c6e90faac2675aa89e2176d2eec7d8))
+- Builder Version in `build` script
+- Main method in `render`
+- Bitmaps **Pixel** check in `Animated Cursors`
+- New `utils` for **Frames Save**
+- **OCS** Install support **as default** for Linux users
## [1.0.2] - 10 August 2020
@@ -37,6 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- CODE_OF_CONDUCT.md
- Quick Install (Windows & Linux) Documents @ [README.md](https://github.com/ful1e5/apple_cursor/blob/master/README.md) ([686bde5](https://github.com/ful1e5/apple_cursor/commit/686bde5eda5c4d913dd8c9df49aa94c20d24d9bf), [f36656d](https://github.com/ful1e5/apple_cursor/commit/f36656d1fbcce5c822d78f5964938daf1ad0c4c0))
- **install.sh** and **windows.inf**(automated installtion files) added in `scripts` directory.
+- Table Of Content in `README.md`([476c64a](https://github.com/ful1e5/apple_cursor/commit/476c64afda50ec48c576b566ce729b575608c529#diff-04c6e90faac2675aa89e2176d2eec7d8))
## [1.0.1-beta] - 3 August 2020
diff --git a/README.md b/README.md
index 2f4639c..3f98fcd 100644
--- a/README.md
+++ b/README.md
@@ -148,8 +148,8 @@ bash <(wget -qO- "https://raw.githubusercontent.com/ful1e5/apple_cursor/master/s
-->
```bash
-# extract `macOSBigSur.tar`
-mkdir macOSBigSur && tar -xvf macOSBigSur.tar -C macOSBigSur
+# extract `macOSBigSur.tar.gz`
+tar -xvf macOSBigSur.tar.gz
# For local users
mv macOSBigSur ~/.icons/
@@ -226,6 +226,8 @@ sudo dnf install libx11-devel libxcursor-devel libpng-devel
#### devDependencies
- [@types/puppeteer](https://www.npmjs.com/package/@types/puppeteer)
+- [@types/pngjs](https://www.npmjs.com/package/@types/pngjs)
+- [@types/pixelmatch](https://www.npmjs.com/package/@types/pixelmatch)
- [nodemon](https://www.npmjs.com/package/nodemon)
- [ts-node](https://www.npmjs.com/package/ts-node)
- [tslint](https://www.npmjs.com/package/tslint)
@@ -234,6 +236,8 @@ sudo dnf install libx11-devel libxcursor-devel libpng-devel
#### dependencies
- [puppeteer](https://www.npmjs.com/package/puppeteer)
+- [pngjs](https://www.npmjs.com/package/pngjs)
+- [pixelmatch](https://www.npmjs.com/package/pixelmatch)
### PyPi Packages
@@ -270,7 +274,6 @@ deactivate
yarn install # Install all Node Packages
yarn py_install # Install all PyPi Packages
yarn compile # Compile the cursor theme
-yarn unpack # To extract`./packages/macOSBigSur.tar` file
```
##### Using npm
@@ -279,19 +282,18 @@ yarn unpack # To extract`./packages/mac
npm install # Install all Node Packages
npm py_install # Install all PyPi Packages
npm compile # Compile the cursor theme
-npm unpack # To extract`./packages/macOSBigSur.tar` file
```
-After build `bitmaps` and `packages` directory are generated at project **root**.
+After build `bitmaps` and `themes` directory are generated at project **root**.
### Install Build Theme
-All builded cursor packages are available inside `packages` directory.
+All builded cursor themes are available inside `themes` directory.
#### Linux
```bash
-cd ./packages
+cd ./themes
rm -rf ~/.icons/macOSBigSur && cp macOSBigSur ~/.icons/ # installing Theme to local user(recommend)
```
diff --git a/build.py b/build.py
index fb3f371..7679079 100644
--- a/build.py
+++ b/build.py
@@ -1,4 +1,5 @@
import json
+import log
from clickgen import build_cursor_theme
from config import name, sizes, delay, bitmaps_dir, temp_folder
diff --git a/config.py b/config.py
index 93c53f4..af93462 100644
--- a/config.py
+++ b/config.py
@@ -2,11 +2,12 @@ import tempfile
import json
# Build Config
-delay = 35
+delay = 50
name = "macOSBigSur"
sizes = [24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96]
bitmaps_dir = "./bitmaps"
+package_dir = "./themes"
temp_folder = tempfile.mkdtemp()
# Cleanup Configs
@@ -20,26 +21,25 @@ with open("./package.json") as f:
# Windows Cursors Config
windows_cursors = {
- "all-scroll.cur": "move.cur",
- "bd_double_arrow.cur": "diagonal-resize-1.cur",
- "bottom_left_corner.cur": "diagonal-resize-2.cur",
- "bottom_side.cur": "vertical-resize.cur",
- "circle.cur": "unavailable.cur",
- "crosshair.cur": "precision-select.cur",
- "dnd-ask.cur": "help-select.cur",
- "hand2.cur": "link-select.cur",
- "left_ptr.cur": "normal-select.cur",
- "left_ptr_watch.ani": "working-in-background.ani",
- "pencil.cur": "handwriting.cur",
- "right_side.cur": "horizontal-resize.cur",
- "sb_up_arrow.cur": "alt-select.cur",
- "wait.ani": "busy.ani",
- "x_cursor.cur": "pirate.cur",
- "xterm.cur": "text-select.cur"
+ "left_ptr_watch.ani": "AppStarting.ani",
+ "left_ptr.cur": "Arrow.cur",
+ "crosshair.cur": "Cross.cur",
+ "hand2.cur": "Hand.cur",
+ "pencil.cur": "Handwriting.cur",
+ "dnd-ask.cur": "Help.cur",
+ "xterm.cur": "IBeam.cur",
+ "circle.cur": "NO.cur",
+ "all-scroll.cur": "SizeAll.cur",
+ "bd_double_arrow.cur": "SizeNESW.cur",
+ "sb_v_double_arrow.cur": "SizeNS.cur",
+ "fd_double_arrow.cur": "SizeNWSE.cur",
+ "sb_h_double_arrow.cur": "SizeWE.cur",
+ "sb_up_arrow.cur": "UpArrow.cur",
+ "wait.ani": "Wait.ani",
}
# Windows install.inf file content
with open("./scripts/windows.inf") as f:
data = f.read()
- window_install_inf = data.replace(
+ window_install_inf_content = data.replace(
"", name+" Cursors").replace("", author)
diff --git a/helper.py b/helper.py
index 2b3b642..cdf4c20 100644
--- a/helper.py
+++ b/helper.py
@@ -2,11 +2,10 @@ import shutil
import json
import sys
-from config import name, temp_folder, bitmaps_dir, win_out, x11_out, window_install_inf, windows_cursors
+from config import name, temp_folder, bitmaps_dir, win_out, x11_out, window_install_inf_content, windows_cursors, package_dir
from os import path, listdir, rename, remove
-package_dir = "./packages"
x11_out_dir = path.join(package_dir, x11_out)
win_out_dir = path.join(package_dir, win_out)
@@ -26,7 +25,7 @@ def window_bundle() -> None:
# creating install.inf file
install_inf_path = path.join(win_out_dir, "install.inf")
with open(install_inf_path, "w") as file:
- file.write(install_inf_path)
+ file.write(window_install_inf_content)
def init_build() -> None:
@@ -37,7 +36,7 @@ def init_build() -> None:
with open("./package.json", "r") as package_file:
data = json.loads(package_file.read())
version = data['version']
- print("ā” Build Version %s" % version)
+ print("ā” Apple Cursor Version %s" % version)
# cleanup old packages
if path.exists(package_dir):
@@ -60,16 +59,3 @@ def pack_it() -> None:
# create install.inf file in Windows Theme
window_bundle()
-
- # Packaging
- # - .tar archive for X11
- # - .zip archive for Windows
- shutil.make_archive(x11_out_dir, "tar", x11_out_dir)
- shutil.make_archive(win_out_dir, "zip", win_out_dir)
-
- # Clenaup
- shutil.rmtree(temp_folder)
- for f in listdir(package_dir):
- f_path = path.join(package_dir, f)
- if path.isdir(f_path):
- shutil.rmtree(f_path)
diff --git a/log.py b/log.py
new file mode 100644
index 0000000..e59183c
--- /dev/null
+++ b/log.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+
+import logging
+
+logging.basicConfig(filename='build.log', filemode='w',
+ format='%(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
diff --git a/package.json b/package.json
index bb248f9..6cfb933 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,16 @@
{
"name": "apple_cursor",
- "version": "1.0.2",
+ "version": "1.0.3",
"description": "Enjoy upcoming `macOS Big Sur` Cursor Theme š„³",
"main": "index.js",
"scripts": {
- "install:clean": "sudo rm -rf ~/.icons/macOSBigSur /usr/share/icons/macOSBigSur",
- "unpack": "cd ./packages && mkdir macOSBigSur && tar -xvf macOSBigSur.tar -C macOSBigSur && cd ..",
- "compile": "yon clean && yon render && yon build",
- "clean": "rm -rf packages bitmaps",
+ "clean": "rm -rf bitmaps themes",
+ "dev": "nodemon src/index.ts",
+ "watch": "nodemon --inspect src/index.ts",
+ "py_install": "pip install -r requirements.txt",
"render": "npx ts-node src/index.ts",
"build": "python build.py",
- "dev": "nodemon src/index.ts",
- "dev:debug": "nodemon --inspect src/index.ts",
- "py_install": "pip install -r requirements.txt"
+ "compile": "yon clean && yon render && yon build"
},
"repository": "git@github.com:ful1e5/apple_cursor.git",
"author": "Kaiz Khatri",
@@ -27,6 +25,10 @@
"yarn-or-npm": "^3.0.1"
},
"dependencies": {
+ "@types/pixelmatch": "^5.2.1",
+ "@types/pngjs": "^3.4.2",
+ "pixelmatch": "^5.2.1",
+ "pngjs": "^5.0.0",
"puppeteer": "^5.2.1"
}
}
diff --git a/scripts/install.sh b/scripts/install.sh
index 93bf3e8..ae1a373 100755
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -5,9 +5,9 @@ INPUT=$1
ROOT_UID=0
DEST_DIR=
-URL="https://github.com/ful1e5/apple_cursor/releases/download/1.0.2/macOSBigSur.tar"
+URL="https://github.com/ful1e5/apple_cursor/releases/download/1.0.3/macOSBigSur.tar.gz"
macOSBigSur="./macOSBigSur"
-DOWNLOAD_FILE_NAME="$macOSBigSur.tar"
+DOWNLOAD_FILE_NAME="$macOSBigSur.tar.gz"
cd "$( dirname "${BASH_SOURCE[0]}" )" || exitt
@@ -45,13 +45,13 @@ end() {
# -------------------- Helpers --------------------
continue() {
case ${INPUT} in
- '-a' )
+ ( '-a' )
:
;;
- '-h' )
+ ( '-h' )
echo " -a - Auto-install for all users!"
;;
- * )
+ ( * )
show_question "\nDo you want to continue? (Y)es, (N)o : \n"
read INPUT
case $INPUT in
@@ -101,13 +101,11 @@ function download {
function unpack {
echo -e "\nUnpacking Theme..."
file=$1
- dir=${file%.*}
- echo "$dir"
- # creating dir and extract .tar file content to it
- mkdir "$dir" && tar -xvf "$file" -C "$dir"
+ # extract .tar.gz file content to it
+ tar -xvf "$file"
- # remove .tar file
+ # remove .tar.gz file
rm -rf $file
if [ $? -eq 0 ]; then
@@ -121,7 +119,7 @@ install() {
# Cecking old version exits or not
if [ -f "$DOWNLOAD_FILE_NAME" ] || [ -f "$macOSBigSur" ]; then
- echo -e "\nmacOSBigSur.tar file already exists"
+ echo -e "\nmacOSBigSur.tar.gz file already exists"
show_question "\nDownload Fresh Theme OR Continue with existing file? (D)ownload File (recommended), (E)xisting File : \n "
read INPUT
case $INPUT in
@@ -198,13 +196,13 @@ remove() {
main() {
# Cases
case ${INPUT} in
- '-a' )
+ ( '-a' )
install
;;
- '-h' )
+ ( '-h' )
echo " -a - Auto-install for all users!"
;;
- * )
+ ( * )
show_question "What you want to do: (I)nstall, (R)emove : \n"
read INPUT
case $INPUT in
diff --git a/scripts/windows.inf b/scripts/windows.inf
index fad7e73..0586241 100644
--- a/scripts/windows.inf
+++ b/scripts/windows.inf
@@ -1,55 +1,52 @@
-; By
-; Right click on the file "install.inf" and select "Install". Then apply in Control Panel > Appearance and Personalization > Personalization > Change mouse pointers.
-
[Version]
signature="$CHICAGO$"
+ By Kaiz Khatri
+https://github.com/ful1e5/apple_cursor
[DefaultInstall]
-CopyFiles = Scheme.Cur, Scheme.Txt
+CopyFiles = Scheme.Cur
AddReg = Scheme.Reg
[DestinationDirs]
Scheme.Cur = 10,"%CUR_DIR%"
-Scheme.Txt = 10,"%CUR_DIR%"
[Scheme.Reg]
-HKCU,"Control Panel\Cursors\Schemes","%SCHEME_NAME%",,"%10%\%CUR_DIR%\%pointer%,%10%\%CUR_DIR%\%help%,%10%\%CUR_DIR%\%work%,%10%\%CUR_DIR%\%busy%,%10%\%CUR_DIR%\%cross%,%10%\%CUR_DIR%\%Text%,%10%\%CUR_DIR%\%Hand%,%10%\%CUR_DIR%\%unavailiable%,%10%\%CUR_DIR%\%Vert%,%10%\%CUR_DIR%\%Horz%,%10%\%CUR_DIR%\%Dgn1%,%10%\%CUR_DIR%\%Dgn2%,%10%\%CUR_DIR%\%move%,%10%\%CUR_DIR%\%alternate%,%10%\%CUR_DIR%\%link%"
+HKCU,"Control Panel\Cursors\Schemes","%SCHEME_NAME%",,"%10%\%CUR_DIR%\%pointer%,%10%\%CUR_DIR%\%help%,%10%\%CUR_DIR%\%work%,%10%\%CUR_DIR%\%busy%,%10%\%CUR_DIR%\%Cross%,%10%\%CUR_DIR%\%Text%,%10%\%CUR_DIR%\%Hand%,%10%\%CUR_DIR%\%Unavailiable%,%10%\%CUR_DIR%\%Vert%,%10%\%CUR_DIR%\%Horz%,%10%\%CUR_DIR%\%Dgn1%,%10%\%CUR_DIR%\%Dgn2%,%10%\%CUR_DIR%\%move%,%10%\%CUR_DIR%\%alternate%,%10%\%CUR_DIR%\%link%"
; -- Installed files
[Scheme.Cur]
-busy.ani
-working-in-background.ani
-normal-select.cur
-help-select.cur
-link-select.cur
-move.cur
-diagonal-resize-2.cur
-Install.inf
-vertical-resize.cur
-horizontal-resize.cur
-diagonal-resize-1.cur
-handwriting.cur
-precision-select.cur
-text-select.cur
-unavailable.cur
-alt-select.cur
+"Arrow.cur"
+"Help.cur"
+"AppStarting.ani"
+"Wait.ani"
+"Cross.cur"
+"IBeam.cur"
+"Handwriting.cur"
+"NO.cur"
+"SizeNS.cur"
+"SizeWE.cur"
+"SizeNWSE.cur"
+"SizeNESW.cur"
+"SizeAll.cur"
+"UpArrow.cur"
+"Hand.cur"
[Strings]
CUR_DIR = "Cursors\"
SCHEME_NAME = ""
-pointer = "normal-select.cur"
-help = "help-select.cur"
-work = "working-in-background.ani"
-busy = "busy.ani"
-text = "text-select.cur"
-unavailiable = "unavailable.cur"
-vert = "vertical-resize.cur"
-horz = "horizontal-resize.cur"
-dgn1 = "diagonal-resize-1.cur"
-dgn2 = "diagonal-resize-2.cur"
-move = "move.cur"
-link = "link-select.cur"
-cross = "precision-select.cur"
-hand = "handwriting.cur"
-alternate = "alt-select.cur"
\ No newline at end of file
+pointer = "Arrow.cur"
+help = "Help.cur"
+work = "AppStarting.ani"
+busy = "Wait.ani"
+cross = "Cross.cur"
+text = "IBeam.cur"
+hand = "Handwriting.cur"
+unavailiable = "NO.cur"
+vert = "SizeNS.cur"
+horz = "SizeWE.cur"
+dgn1 = "SizeNWSE.cur"
+dgn2 = "SizeNESW.cur"
+move = "SizeAll.cur"
+alternate = "UpArrow.cur"
+link = "Hand.cur"
\ No newline at end of file
diff --git a/src/config.ts b/src/config.ts
index a567e37..843b7b5 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -1,17 +1,31 @@
-import path from "path";
-import fs from "fs";
-import { staticCursors, animatedCursors, animatedClip } from "./cursors.json";
+import { resolve } from "path";
+import { readdirSync, existsSync } from "fs";
// Source Directory
-const svgsDir = path.resolve(__dirname, "svg");
+const svgsDir = resolve(__dirname, "svg");
+if (!existsSync(svgsDir)) {
+ console.log("Source .svg files not found");
+}
-// Resolve Paths for svg
-const staticSvgs = staticCursors.map((svg: string) =>
- path.resolve(svgsDir, svg)
-);
+const staticCursorsDir = resolve(svgsDir, "static");
+const animatedCursorsDir = resolve(svgsDir, "animated");
// Out Directory
-const bitmapsDir = path.resolve(process.cwd(), "bitmaps");
-if (!fs.existsSync(bitmapsDir)) fs.mkdirSync(bitmapsDir);
+const bitmapsDir = resolve(__dirname, "../", "bitmaps");
-export { staticSvgs, animatedCursors, svgsDir, bitmapsDir, animatedClip };
+// Cursors
+const staticCursors = readdirSync(staticCursorsDir).map((f) =>
+ resolve(staticCursorsDir, f)
+);
+const animatedCursors = readdirSync(animatedCursorsDir).map((f) =>
+ resolve(animatedCursorsDir, f)
+);
+
+// Animated Config
+const animatedClip = {
+ x: 4,
+ y: 4,
+ width: 200,
+ height: 200,
+};
+export { staticCursors, animatedCursors, bitmapsDir, animatedClip };
diff --git a/src/cursors.json b/src/cursors.json
deleted file mode 100644
index d173e5a..0000000
--- a/src/cursors.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "staticCursors": [
- "all_scroll.svg",
- "bd_double_arrow.svg",
- "bottom_left_corner.svg",
- "bottom_right_corner.svg",
- "bottom_side.svg",
- "bottom_tee.svg",
- "center_ptr.svg",
- "circle.svg",
- "context_menu.svg",
- "copy.svg",
- "cross.svg",
- "crossed_circle.svg",
- "crosshair.svg",
- "dnd_ask.svg",
- "dnd_copy.svg",
- "dnd_link.svg",
- "dnd_move.svg",
- "dnd_no_drop.svg",
- "dnd_none.svg",
- "dotbox.svg",
- "fd_double_arrow.svg",
- "grabbing.svg",
- "hand1.svg",
- "hand2.svg",
- "left_ptr.svg",
- "left_side.svg",
- "left_tee.svg",
- "link.svg",
- "ll_angle.svg",
- "lr_angle.svg",
- "move.svg",
- "pencil.svg",
- "plus.svg",
- "pointer_move.svg",
- "question_arrow.svg",
- "right_ptr.svg",
- "right_side.svg",
- "right_tee.svg",
- "sb_down_arrow.svg",
- "sb_h_double_arrow.svg",
- "sb_left_arrow.svg",
- "sb_right_arrow.svg",
- "sb_up_arrow.svg",
- "sb_v_double_arrow.svg",
- "tcross.svg",
- "top_left_corner.svg",
- "top_right_corner.svg",
- "top_side.svg",
- "top_tee.svg",
- "ul_angle.svg",
- "ur_angle.svg",
- "vertical_text.svg",
- "wayland_cursor.svg",
- "x_cursor.svg",
- "xterm.svg",
- "zoom_in.svg",
- "zoom_out.svg"
- ],
- "animatedCursors": {
- "left_ptr_watch.svg": {
- "frames": 62
- },
- "wait.svg": {
- "frames": 62
- }
- },
- "animatedClip": {
- "x": 4,
- "y": 4,
- "width": 200,
- "height": 200
- }
-}
diff --git a/src/index.ts b/src/index.ts
index 2b53358..291bc30 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -2,49 +2,41 @@ import fs from "fs";
import path from "path";
import puppeteer from "puppeteer";
-import { generateRenderTemplate } from "./helpers/htmlTemplate";
+import { generateRenderTemplate } from "./utils/htmlTemplate";
import {
- staticSvgs,
+ staticCursors,
bitmapsDir,
- svgsDir,
animatedCursors,
animatedClip,
} from "./config";
+import { matchImages } from "./utils/matchImages";
+import { saveFrames, Frames } from "./utils/saveFrames";
+import { getKeyName } from "./utils/getKeyName";
-// --------------------------- Helpers
-const frameNumber = (number: number, length: number) => {
- var str = "" + number;
- while (str.length < length) {
- str = "0" + str;
- }
- return str;
-};
-
-// --------------------------- Main
-(async () => {
+const main = async () => {
const browser = await puppeteer.launch({
ignoreDefaultArgs: [" --single-process ", "--no-sandbox"],
- executablePath:
- process.env.NODE_ENV == "development"
- ? "/usr/bin/google-chrome-stable"
- : "",
headless: true,
});
+ if (!fs.existsSync(bitmapsDir)) {
+ fs.mkdirSync(bitmapsDir);
+ }
+
try {
console.log("šø Rendering Static Cursors...");
- // Rendering satic .svg files
- for (let svg of staticSvgs) {
- const buffer = fs.readFileSync(path.resolve(svgsDir, svg), "utf8");
- if (!buffer) throw new Error(`${svg} File Read error`);
- const data = buffer.toString();
+ for (let svgPath of staticCursors) {
+ const buffer = fs.readFileSync(path.resolve(svgPath), "utf8");
+ if (!buffer) throw new Error(`${svgPath} File Read error`);
+
// Generating HTML Template
+ const data = buffer.toString();
const template = generateRenderTemplate(data);
// config
- const bitmap = `${path.basename(svg, ".svg")}.png`;
- const out = path.resolve(bitmapsDir, bitmap);
+ const bitmapName = `${path.basename(svgPath, ".svg")}.png`;
+ const out = path.resolve(bitmapsDir, bitmapName);
// Render
const page = await browser.newPage();
@@ -52,60 +44,81 @@ const frameNumber = (number: number, length: number) => {
await page.waitForSelector("#container");
const svgElement = await page.$("#container svg");
-
if (!svgElement) throw new Error("svg element not found");
-
await svgElement.screenshot({ omitBackground: true, path: out });
- // console.log(`Static Cursor rendered at ${out}`);
await page.close();
}
console.log("š„ Rendering Animated Cursors...");
- // Rendering animated .svg files
- for (let [svg, { frames }] of Object.entries(animatedCursors)) {
- const buffer = fs.readFileSync(path.resolve(svgsDir, svg), "utf8");
- if (!buffer) throw new Error(`${svg} File Read error`);
+ for (let svgPath of animatedCursors) {
+ const buffer = fs.readFileSync(svgPath, "utf8");
+ if (!buffer) throw new Error(`${svgPath} File Read error`);
- const data = buffer.toString();
// Generating HTML Template
+ const data = buffer.toString();
const template = generateRenderTemplate(data);
const page = await browser.newPage();
- await page.setContent(template);
+ await page.setContent(template, { waitUntil: "networkidle2" });
await page.waitForSelector("#container");
const svgElement = await page.$("#container svg");
-
if (!svgElement) throw new Error("svg element not found");
- // Render Frames
- for (let index = 1; index <= frames; index++) {
- // config
- const frame = frameNumber(index, frames.toString().length);
- const bitmap =
- frames == 1
- ? `${path.basename(svg, ".svg")}.png`
- : `${path.basename(svg, ".svg")}-${frame}.png`;
+ // Render Config
+ let index = 1;
+ let breakRendering = false;
+ const frames: Frames = {};
+ const firstKey = getKeyName(index, svgPath);
- const out = path.resolve(bitmapsDir, bitmap);
+ console.log("Rendering", path.basename(svgPath), "...");
+ console.log(firstKey);
- // Render
- await svgElement.screenshot({
+ // 1st Frame
+ frames[firstKey] = {
+ buffer: await svgElement.screenshot({
omitBackground: true,
- path: out,
clip: animatedClip,
+ encoding: "binary",
+ }),
+ };
+
+ // Pushing frames until it match to 1st frame
+ index++;
+ while (!breakRendering) {
+ const newFrame = await svgElement.screenshot({
+ omitBackground: true,
+ clip: animatedClip,
+ encoding: "binary",
});
- // console.log(`${svg} frame ${frame}/${frames} rendered at ${out}`);
+ const key = getKeyName(index, svgPath);
+ console.log(key);
+ const diff = matchImages({
+ img1Buff: frames[firstKey].buffer,
+ img2Buff: newFrame,
+ });
+
+ if (!(diff < 700)) {
+ frames[key] = { buffer: newFrame };
+ } else {
+ breakRendering = true;
+ }
+ index++;
}
+ saveFrames(frames);
+
await page.close();
}
- } catch (error) {
- console.error(error);
- } finally {
+
console.log(`\nBitmaps stored at ${bitmapsDir}\n\nš Render Done.`);
process.exit(0);
+ } catch (error) {
+ console.error(error);
+ process.exit(1);
}
-})();
+};
+
+main();
diff --git a/src/svg/README.md b/src/svg/README.md
index 40dee25..323b808 100644
--- a/src/svg/README.md
+++ b/src/svg/README.md
@@ -2,50 +2,50 @@
## Symbolic Cursors
-| Preview | Source | Symbolic links | Windows Cursor name |
-| :------------------------------------------------: | :---------------------: | :-------------------------------------------------------------: | :------------------------------------: |
-|
| all_scroll.svg | `None` | `move.cur` |
-|
| bottom_left_corner.svg | `fd_double_arrow.svg` `top_right_corner.svg` | `diagonal-resize-2.cur` |
-|
| bottom_right_corner.svg | `bd_double_arrow.svg` `top_left_corner.svg` | `diagonal-resize-1.cur` |
-|
| bottom_tee.svg | `None` | |
-|
| center_ptr.svg | `None` | |
-|
| circle.svg | `crossed_circle.svg` `dnd_no_drop.svg` | `unavailable.cur` |
-|
| context_menu.svg | `None` | |
-|
| copy.svg | `dnd_copy.svg` | |
-|
| cross.svg | `tcross.svg` | |
-|
| crosshair.svg | `None` | `precision-select.cur` |
-|
| dotbox.svg | `None` | |
-|
| hand1.svg | `None` | |
-|
| hand2.svg | `None` | `link-select.cur` |
-|
| left_ptr.svg | `None` | `normal-select.cur` |
-|
| left_side.svg | `right_side.svg` | `horizontal-resize.cur` |
-|
| left_tee.svg | `None` | |
-|
| link.svg | `dnd_link.svg` | |
-|
| ll_angle.svg | `None` | |
-|
| lr_angle.svg | `None` | |
-|
| move.svg | `dnd_move.svg` `dnd_none.svg` `grabbing.svg` `pointer_move.svg` | |
-|
| pencil.svg | `None` | `handwriting.cur` |
-|
| plus.svg | `None` | |
-|
| question_arrow.svg | `dnd_ask.svg` | `help-select.cur` |
-|
| right_ptr.svg | `None` | |
-|
| right_tee.svg | `None` | |
-|
| sb_down_arrow.svg | `None` | |
-|
| sb_h_double_arrow.svg | `None` | |
-|
| sb_left_arrow.svg | `None` | |
-|
| sb_right_arrow.svg | `None` | |
-|
| sb_up_arrow.svg | `None` | `alt-select.cur` |
-|
| sb_v_double_arrow.svg | `None` | |
-|
| top_side.svg | `bottom_side.svg` | `vertical-resize.cur` |
-|
| top_tee.svg | `None` | |
-|
| ul_angle.svg | `None` | |
-|
| ur_angle.svg | `None` | |
-|
| vertical_text.svg | `None` | |
-|
| wait.svg | `left_ptr_watch.svg` | `working-in-background.ani` `busy.ani` |
-|
| wayland_cursor.svg | `None` | |
-|
| x_cursor.svg | `None` | `pirate.cur` |
-|
| xterm.svg | `None` | `text-select.cur` |
-|
| zoom_in.svg | `None` | |
-|
| zoom_out.svg | `None` | |
+| Preview | Source | Symbolic links | Windows Cursor name |
+| :-------------------------------------------------------: | :---------------------: | :-------------------------------------------------------------: | :--------------------------: |
+|
| all_scroll.svg | `None` | `SizeAll.cur` |
+|
| bottom_left_corner.svg | `fd_double_arrow.svg` `top_right_corner.svg` | `SizeNWSE.cur` |
+|
| bottom_right_corner.svg | `bd_double_arrow.svg` `top_left_corner.svg` | `SizeNESW.cur` |
+|
| bottom_tee.svg | `None` | |
+|
| center_ptr.svg | `None` | |
+|
| circle.svg | `crossed_circle.svg` `dnd_no_drop.svg` | `NO.cur` |
+|
| context_menu.svg | `None` | |
+|
| copy.svg | `dnd_copy.svg` | |
+|
| cross.svg | `tcross.svg` | |
+|
| crosshair.svg | `None` | `Cross.cur` |
+|
| dotbox.svg | `None` | |
+|
| hand1.svg | `None` | |
+|
| hand2.svg | `None` | `Hand.cur` |
+|
| left_ptr.svg | `None` | `Arrow.cur` |
+|
| left_side.svg | `right_side.svg` | |
+|
| left_tee.svg | `None` | |
+|
| link.svg | `dnd_link.svg` | |
+|
| ll_angle.svg | `None` | |
+|
| lr_angle.svg | `None` | |
+|
| move.svg | `dnd_move.svg` `dnd_none.svg` `grabbing.svg` `pointer_move.svg` | |
+|
| pencil.svg | `None` | `Handwriting.cur` |
+|
| plus.svg | `None` | |
+|
| question_arrow.svg | `dnd_ask.svg` | `Help.cur` |
+|
| right_ptr.svg | `None` | |
+|
| right_tee.svg | `None` | |
+|
| sb_down_arrow.svg | `None` | |
+|
| sb_h_double_arrow.svg | `None` | `SizeWE.cur` |
+|
| sb_left_arrow.svg | `None` | |
+|
| sb_right_arrow.svg | `None` | |
+|
| sb_up_arrow.svg | `None` | `UpArrow.cur` |
+|
| sb_v_double_arrow.svg | `None` | `SizeNS.cur` |
+|
| top_side.svg | `bottom_side.svg` | |
+|
| top_tee.svg | `None` | |
+|
| ul_angle.svg | `None` | |
+|
| ur_angle.svg | `None` | |
+|
| vertical_text.svg | `None` | |
+|
| wait.svg | `left_ptr_watch.svg` | `AppStarting.ani` `Wait.ani` |
+|
| wayland_cursor.svg | `None` | |
+|
| x_cursor.svg | `None` | |
+|
| xterm.svg | `None` | `IBeam.cur` |
+|
| zoom_in.svg | `None` | |
+|
| zoom_out.svg | `None` | |
## Figma File
diff --git a/src/svg/all_scroll.svg b/src/svg/all_scroll.svg
deleted file mode 100644
index 26cbfd4..0000000
--- a/src/svg/all_scroll.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/src/svg/left_ptr_watch.svg b/src/svg/animated/left_ptr_watch.svg
similarity index 100%
rename from src/svg/left_ptr_watch.svg
rename to src/svg/animated/left_ptr_watch.svg
diff --git a/src/svg/wait.svg b/src/svg/animated/wait.svg
similarity index 100%
rename from src/svg/wait.svg
rename to src/svg/animated/wait.svg
diff --git a/src/svg/bottom_left_corner.svg b/src/svg/bottom_left_corner.svg
deleted file mode 100644
index 65962d8..0000000
--- a/src/svg/bottom_left_corner.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/bottom_right_corner.svg b/src/svg/bottom_right_corner.svg
deleted file mode 100644
index 41a857a..0000000
--- a/src/svg/bottom_right_corner.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/bottom_tee.svg b/src/svg/bottom_tee.svg
deleted file mode 100644
index 4a79ae1..0000000
--- a/src/svg/bottom_tee.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/center_ptr.svg b/src/svg/center_ptr.svg
deleted file mode 100644
index 836088a..0000000
--- a/src/svg/center_ptr.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/circle.svg b/src/svg/circle.svg
deleted file mode 100644
index ad3e357..0000000
--- a/src/svg/circle.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/src/svg/cross.svg b/src/svg/cross.svg
deleted file mode 100644
index c82b7df..0000000
--- a/src/svg/cross.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/crossed_circle.svg b/src/svg/crossed_circle.svg
deleted file mode 100644
index 660c062..0000000
--- a/src/svg/crossed_circle.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/src/svg/dotbox.svg b/src/svg/dotbox.svg
deleted file mode 100644
index 3bc0d58..0000000
--- a/src/svg/dotbox.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/hand1.svg b/src/svg/hand1.svg
deleted file mode 100644
index f699d5e..0000000
--- a/src/svg/hand1.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/hand2.svg b/src/svg/hand2.svg
deleted file mode 100644
index c65a0c0..0000000
--- a/src/svg/hand2.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/left_ptr.svg b/src/svg/left_ptr.svg
deleted file mode 100644
index 629eb5d..0000000
--- a/src/svg/left_ptr.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/left_side.svg b/src/svg/left_side.svg
deleted file mode 100644
index d7f4132..0000000
--- a/src/svg/left_side.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/left_tee.svg b/src/svg/left_tee.svg
deleted file mode 100644
index eae0677..0000000
--- a/src/svg/left_tee.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/link.svg b/src/svg/link.svg
deleted file mode 100644
index 9370bb5..0000000
--- a/src/svg/link.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/ll_angle.svg b/src/svg/ll_angle.svg
deleted file mode 100644
index 62431d1..0000000
--- a/src/svg/ll_angle.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/lr_angle.svg b/src/svg/lr_angle.svg
deleted file mode 100644
index 82aa3a5..0000000
--- a/src/svg/lr_angle.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/move.svg b/src/svg/move.svg
deleted file mode 100644
index a2d1bc1..0000000
--- a/src/svg/move.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/pencil.svg b/src/svg/pencil.svg
deleted file mode 100644
index 21cfc33..0000000
--- a/src/svg/pencil.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/question_arrow.svg b/src/svg/question_arrow.svg
deleted file mode 100644
index f1a5111..0000000
--- a/src/svg/question_arrow.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/right_tee.svg b/src/svg/right_tee.svg
deleted file mode 100644
index c0adfa7..0000000
--- a/src/svg/right_tee.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_down_arrow.svg b/src/svg/sb_down_arrow.svg
deleted file mode 100644
index 3c2ac14..0000000
--- a/src/svg/sb_down_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_h_double_arrow.svg b/src/svg/sb_h_double_arrow.svg
deleted file mode 100644
index 62d6277..0000000
--- a/src/svg/sb_h_double_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_left_arrow.svg b/src/svg/sb_left_arrow.svg
deleted file mode 100644
index 9449fab..0000000
--- a/src/svg/sb_left_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_right_arrow.svg b/src/svg/sb_right_arrow.svg
deleted file mode 100644
index 02a882d..0000000
--- a/src/svg/sb_right_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_up_arrow.svg b/src/svg/sb_up_arrow.svg
deleted file mode 100644
index be098c6..0000000
--- a/src/svg/sb_up_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/sb_v_double_arrow.svg b/src/svg/sb_v_double_arrow.svg
deleted file mode 100644
index b4237e7..0000000
--- a/src/svg/sb_v_double_arrow.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/static/all_scroll.svg b/src/svg/static/all_scroll.svg
new file mode 100644
index 0000000..e7e538c
--- /dev/null
+++ b/src/svg/static/all_scroll.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/src/svg/bd_double_arrow.svg b/src/svg/static/bd_double_arrow.svg
similarity index 100%
rename from src/svg/bd_double_arrow.svg
rename to src/svg/static/bd_double_arrow.svg
diff --git a/src/svg/static/bottom_left_corner.svg b/src/svg/static/bottom_left_corner.svg
new file mode 100644
index 0000000..1079273
--- /dev/null
+++ b/src/svg/static/bottom_left_corner.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/bottom_right_corner.svg b/src/svg/static/bottom_right_corner.svg
new file mode 100644
index 0000000..61cf654
--- /dev/null
+++ b/src/svg/static/bottom_right_corner.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/bottom_side.svg b/src/svg/static/bottom_side.svg
similarity index 100%
rename from src/svg/bottom_side.svg
rename to src/svg/static/bottom_side.svg
diff --git a/src/svg/static/bottom_tee.svg b/src/svg/static/bottom_tee.svg
new file mode 100644
index 0000000..306233b
--- /dev/null
+++ b/src/svg/static/bottom_tee.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/center_ptr.svg b/src/svg/static/center_ptr.svg
new file mode 100644
index 0000000..304f6ef
--- /dev/null
+++ b/src/svg/static/center_ptr.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/src/svg/static/circle.svg b/src/svg/static/circle.svg
new file mode 100644
index 0000000..903dc11
--- /dev/null
+++ b/src/svg/static/circle.svg
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/svg/context_menu.svg b/src/svg/static/context_menu.svg
similarity index 51%
rename from src/svg/context_menu.svg
rename to src/svg/static/context_menu.svg
index 29b81b2..e326ad2 100644
--- a/src/svg/context_menu.svg
+++ b/src/svg/static/context_menu.svg
@@ -3,9 +3,15 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/svg/copy.svg b/src/svg/static/copy.svg
similarity index 75%
rename from src/svg/copy.svg
rename to src/svg/static/copy.svg
index ddf44c0..5390c7d 100644
--- a/src/svg/copy.svg
+++ b/src/svg/static/copy.svg
@@ -2,15 +2,20 @@
-
+
-
-
+
+
-
+
@@ -24,4 +29,4 @@
-
+
\ No newline at end of file
diff --git a/src/svg/static/cross.svg b/src/svg/static/cross.svg
new file mode 100644
index 0000000..d894d8d
--- /dev/null
+++ b/src/svg/static/cross.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/svg/static/crossed_circle.svg b/src/svg/static/crossed_circle.svg
new file mode 100644
index 0000000..8535691
--- /dev/null
+++ b/src/svg/static/crossed_circle.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/svg/crosshair.svg b/src/svg/static/crosshair.svg
similarity index 63%
rename from src/svg/crosshair.svg
rename to src/svg/static/crosshair.svg
index c7a08b3..09f696f 100644
--- a/src/svg/crosshair.svg
+++ b/src/svg/static/crosshair.svg
@@ -2,10 +2,14 @@
-
-
+
+
-
+
\ No newline at end of file
diff --git a/src/svg/dnd_ask.svg b/src/svg/static/dnd_ask.svg
similarity index 100%
rename from src/svg/dnd_ask.svg
rename to src/svg/static/dnd_ask.svg
diff --git a/src/svg/dnd_copy.svg b/src/svg/static/dnd_copy.svg
similarity index 100%
rename from src/svg/dnd_copy.svg
rename to src/svg/static/dnd_copy.svg
diff --git a/src/svg/dnd_link.svg b/src/svg/static/dnd_link.svg
similarity index 100%
rename from src/svg/dnd_link.svg
rename to src/svg/static/dnd_link.svg
diff --git a/src/svg/dnd_move.svg b/src/svg/static/dnd_move.svg
similarity index 100%
rename from src/svg/dnd_move.svg
rename to src/svg/static/dnd_move.svg
diff --git a/src/svg/dnd_no_drop.svg b/src/svg/static/dnd_no_drop.svg
similarity index 100%
rename from src/svg/dnd_no_drop.svg
rename to src/svg/static/dnd_no_drop.svg
diff --git a/src/svg/dnd_none.svg b/src/svg/static/dnd_none.svg
similarity index 100%
rename from src/svg/dnd_none.svg
rename to src/svg/static/dnd_none.svg
diff --git a/src/svg/static/dotbox.svg b/src/svg/static/dotbox.svg
new file mode 100644
index 0000000..7bd24db
--- /dev/null
+++ b/src/svg/static/dotbox.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/fd_double_arrow.svg b/src/svg/static/fd_double_arrow.svg
similarity index 100%
rename from src/svg/fd_double_arrow.svg
rename to src/svg/static/fd_double_arrow.svg
diff --git a/src/svg/grabbing.svg b/src/svg/static/grabbing.svg
similarity index 100%
rename from src/svg/grabbing.svg
rename to src/svg/static/grabbing.svg
diff --git a/src/svg/static/hand1.svg b/src/svg/static/hand1.svg
new file mode 100644
index 0000000..032bde8
--- /dev/null
+++ b/src/svg/static/hand1.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/hand2.svg b/src/svg/static/hand2.svg
new file mode 100644
index 0000000..8160197
--- /dev/null
+++ b/src/svg/static/hand2.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/left_ptr.svg b/src/svg/static/left_ptr.svg
new file mode 100644
index 0000000..6aa65d7
--- /dev/null
+++ b/src/svg/static/left_ptr.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/src/svg/static/left_side.svg b/src/svg/static/left_side.svg
new file mode 100644
index 0000000..0982847
--- /dev/null
+++ b/src/svg/static/left_side.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/left_tee.svg b/src/svg/static/left_tee.svg
new file mode 100644
index 0000000..f704d0e
--- /dev/null
+++ b/src/svg/static/left_tee.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/link.svg b/src/svg/static/link.svg
new file mode 100644
index 0000000..60efe5a
--- /dev/null
+++ b/src/svg/static/link.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/ll_angle.svg b/src/svg/static/ll_angle.svg
new file mode 100644
index 0000000..2d35f1b
--- /dev/null
+++ b/src/svg/static/ll_angle.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/lr_angle.svg b/src/svg/static/lr_angle.svg
new file mode 100644
index 0000000..dd90a0c
--- /dev/null
+++ b/src/svg/static/lr_angle.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/move.svg b/src/svg/static/move.svg
new file mode 100644
index 0000000..3732775
--- /dev/null
+++ b/src/svg/static/move.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/pencil.svg b/src/svg/static/pencil.svg
new file mode 100644
index 0000000..a235e3b
--- /dev/null
+++ b/src/svg/static/pencil.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/plus.svg b/src/svg/static/plus.svg
similarity index 98%
rename from src/svg/plus.svg
rename to src/svg/static/plus.svg
index 8396349..47940d4 100644
--- a/src/svg/plus.svg
+++ b/src/svg/static/plus.svg
@@ -6,4 +6,4 @@
-
+
\ No newline at end of file
diff --git a/src/svg/pointer_move.svg b/src/svg/static/pointer_move.svg
similarity index 100%
rename from src/svg/pointer_move.svg
rename to src/svg/static/pointer_move.svg
diff --git a/src/svg/static/question_arrow.svg b/src/svg/static/question_arrow.svg
new file mode 100644
index 0000000..1cc74ef
--- /dev/null
+++ b/src/svg/static/question_arrow.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/src/svg/right_ptr.svg b/src/svg/static/right_ptr.svg
similarity index 61%
rename from src/svg/right_ptr.svg
rename to src/svg/static/right_ptr.svg
index 708857a..8dcbe1e 100644
--- a/src/svg/right_ptr.svg
+++ b/src/svg/static/right_ptr.svg
@@ -2,8 +2,12 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/src/svg/right_side.svg b/src/svg/static/right_side.svg
similarity index 100%
rename from src/svg/right_side.svg
rename to src/svg/static/right_side.svg
diff --git a/src/svg/static/right_tee.svg b/src/svg/static/right_tee.svg
new file mode 100644
index 0000000..02be6ac
--- /dev/null
+++ b/src/svg/static/right_tee.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_down_arrow.svg b/src/svg/static/sb_down_arrow.svg
new file mode 100644
index 0000000..52825d2
--- /dev/null
+++ b/src/svg/static/sb_down_arrow.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_h_double_arrow.svg b/src/svg/static/sb_h_double_arrow.svg
new file mode 100644
index 0000000..bc17a5b
--- /dev/null
+++ b/src/svg/static/sb_h_double_arrow.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_left_arrow.svg b/src/svg/static/sb_left_arrow.svg
new file mode 100644
index 0000000..f960fc4
--- /dev/null
+++ b/src/svg/static/sb_left_arrow.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_right_arrow.svg b/src/svg/static/sb_right_arrow.svg
new file mode 100644
index 0000000..4cb4e58
--- /dev/null
+++ b/src/svg/static/sb_right_arrow.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_up_arrow.svg b/src/svg/static/sb_up_arrow.svg
new file mode 100644
index 0000000..05c2594
--- /dev/null
+++ b/src/svg/static/sb_up_arrow.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/svg/static/sb_v_double_arrow.svg b/src/svg/static/sb_v_double_arrow.svg
new file mode 100644
index 0000000..68e65e2
--- /dev/null
+++ b/src/svg/static/sb_v_double_arrow.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/tcross.svg b/src/svg/static/tcross.svg
similarity index 100%
rename from src/svg/tcross.svg
rename to src/svg/static/tcross.svg
diff --git a/src/svg/top_left_corner.svg b/src/svg/static/top_left_corner.svg
similarity index 100%
rename from src/svg/top_left_corner.svg
rename to src/svg/static/top_left_corner.svg
diff --git a/src/svg/top_right_corner.svg b/src/svg/static/top_right_corner.svg
similarity index 100%
rename from src/svg/top_right_corner.svg
rename to src/svg/static/top_right_corner.svg
diff --git a/src/svg/static/top_side.svg b/src/svg/static/top_side.svg
new file mode 100644
index 0000000..b8666bc
--- /dev/null
+++ b/src/svg/static/top_side.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/top_tee.svg b/src/svg/static/top_tee.svg
new file mode 100644
index 0000000..7c4d899
--- /dev/null
+++ b/src/svg/static/top_tee.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/ul_angle.svg b/src/svg/static/ul_angle.svg
new file mode 100644
index 0000000..9d531e2
--- /dev/null
+++ b/src/svg/static/ul_angle.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/ur_angle.svg b/src/svg/static/ur_angle.svg
new file mode 100644
index 0000000..622007d
--- /dev/null
+++ b/src/svg/static/ur_angle.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/vertical_text.svg b/src/svg/static/vertical_text.svg
new file mode 100644
index 0000000..e4bf3d8
--- /dev/null
+++ b/src/svg/static/vertical_text.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/wayland_cursor.svg b/src/svg/static/wayland_cursor.svg
new file mode 100644
index 0000000..8be0097
--- /dev/null
+++ b/src/svg/static/wayland_cursor.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/x_cursor.svg b/src/svg/static/x_cursor.svg
new file mode 100644
index 0000000..c92c5ab
--- /dev/null
+++ b/src/svg/static/x_cursor.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/svg/static/xterm.svg b/src/svg/static/xterm.svg
new file mode 100644
index 0000000..01ece7b
--- /dev/null
+++ b/src/svg/static/xterm.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/svg/static/zoom_in.svg b/src/svg/static/zoom_in.svg
new file mode 100644
index 0000000..82e9d83
--- /dev/null
+++ b/src/svg/static/zoom_in.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/src/svg/static/zoom_out.svg b/src/svg/static/zoom_out.svg
new file mode 100644
index 0000000..6f62b66
--- /dev/null
+++ b/src/svg/static/zoom_out.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/src/svg/top_side.svg b/src/svg/top_side.svg
deleted file mode 100644
index 6609c7c..0000000
--- a/src/svg/top_side.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/top_tee.svg b/src/svg/top_tee.svg
deleted file mode 100644
index 8cccd65..0000000
--- a/src/svg/top_tee.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/ul_angle.svg b/src/svg/ul_angle.svg
deleted file mode 100644
index 7e39dd1..0000000
--- a/src/svg/ul_angle.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/ur_angle.svg b/src/svg/ur_angle.svg
deleted file mode 100644
index d850192..0000000
--- a/src/svg/ur_angle.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/vertical_text.svg b/src/svg/vertical_text.svg
deleted file mode 100644
index f58e3c0..0000000
--- a/src/svg/vertical_text.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/wayland_cursor.svg b/src/svg/wayland_cursor.svg
deleted file mode 100644
index ac5c3c9..0000000
--- a/src/svg/wayland_cursor.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/x_cursor.svg b/src/svg/x_cursor.svg
deleted file mode 100644
index f9acd53..0000000
--- a/src/svg/x_cursor.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/src/svg/xterm.svg b/src/svg/xterm.svg
deleted file mode 100644
index 58a1e8f..0000000
--- a/src/svg/xterm.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/svg/zoom_in.svg b/src/svg/zoom_in.svg
deleted file mode 100644
index 573fc3a..0000000
--- a/src/svg/zoom_in.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/svg/zoom_out.svg b/src/svg/zoom_out.svg
deleted file mode 100644
index e7dc584..0000000
--- a/src/svg/zoom_out.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/src/utils/getKeyName.ts b/src/utils/getKeyName.ts
new file mode 100644
index 0000000..2370997
--- /dev/null
+++ b/src/utils/getKeyName.ts
@@ -0,0 +1,14 @@
+import path from "path";
+
+export const frameNumber = (index: number, endIndex: number) => {
+ let result = "" + index;
+ while (result.length < endIndex) {
+ result = "0" + result;
+ }
+ return result;
+};
+
+export const getKeyName = (index: number, fileName: string) => {
+ const frame = frameNumber(index, 2);
+ return `${path.basename(fileName, ".svg")}-${frame}.png`;
+};
diff --git a/src/helpers/htmlTemplate.ts b/src/utils/htmlTemplate.ts
similarity index 100%
rename from src/helpers/htmlTemplate.ts
rename to src/utils/htmlTemplate.ts
diff --git a/src/utils/matchImages.ts b/src/utils/matchImages.ts
new file mode 100644
index 0000000..aceffa8
--- /dev/null
+++ b/src/utils/matchImages.ts
@@ -0,0 +1,19 @@
+import { PNG } from "pngjs";
+import pixelmatch from "pixelmatch";
+
+interface MatchImagesArgs {
+ img1Buff: Buffer;
+ img2Buff: Buffer;
+}
+
+export const matchImages = ({ img1Buff, img2Buff }: MatchImagesArgs) => {
+ const img1 = PNG.sync.read(img1Buff);
+ const img2 = PNG.sync.read(img2Buff);
+ const { width, height } = img1;
+
+ const diff = new PNG({ width, height });
+
+ return pixelmatch(img1.data, img2.data, diff.data, width, height, {
+ threshold: 0.25,
+ });
+};
diff --git a/src/utils/saveFrames.ts b/src/utils/saveFrames.ts
new file mode 100644
index 0000000..f3be527
--- /dev/null
+++ b/src/utils/saveFrames.ts
@@ -0,0 +1,16 @@
+import fs from "fs";
+import path from "path";
+import { bitmapsDir } from "../config";
+
+export interface Frames {
+ [fileName: string]: {
+ buffer: Buffer;
+ };
+}
+
+export const saveFrames = (frames: Frames) => {
+ for (let [fileName, { buffer }] of Object.entries(frames)) {
+ const out_path = path.resolve(bitmapsDir, fileName);
+ fs.writeFileSync(out_path, buffer, { encoding: "binary" });
+ }
+};
diff --git a/tsconfig.json b/tsconfig.json
index d1b3193..a26a563 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,7 +3,7 @@
"target": "es2017",
"module": "commonjs",
"lib": ["es2015", "dom"],
- "outDir": "./dist",
+ "outDir": "dist",
"typeRoots": ["node_modules/@types"],
"strict": true,
"noUnusedLocals": true,
diff --git a/yarn.lock b/yarn.lock
index 7bdfada..448a5cf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -45,6 +45,20 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6"
integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA==
+"@types/pixelmatch@^5.2.1":
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/@types/pixelmatch/-/pixelmatch-5.2.1.tgz#c82843e0c08417b45a233ddd267852c3c1b7afaa"
+ integrity sha512-4KPEw8fz139KyHfBiNHI9+nmA93gcH/Dj2Q+10JF34XO0Sb20IIGsdj+9Ol+dgJUWN5RIa7NRsbEXFFd5MiG0Q==
+ dependencies:
+ "@types/node" "*"
+
+"@types/pngjs@^3.4.2":
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-3.4.2.tgz#8dc49b45fbcf18a5873179e3664f049388e39ecf"
+ integrity sha512-LJVPDraJ5YFEnMHnzxTN4psdWz1M61MtaAAWPn3qnDk5fvs7BAmmQ9pd3KPlrdrvozMyne4ktanD4pg0L7x1Pw==
+ dependencies:
+ "@types/node" "*"
+
"@types/puppeteer@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-3.0.1.tgz#053ec20facc162b25a64785affccaa3e5817c607"
@@ -892,6 +906,13 @@ picomatch@^2.0.4, picomatch@^2.2.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+pixelmatch@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65"
+ integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==
+ dependencies:
+ pngjs "^4.0.1"
+
pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@@ -899,6 +920,16 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
+pngjs@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe"
+ integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==
+
+pngjs@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
+ integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"