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"