Drop GIMP workload; make Inkscape export a tunable subset
GIMP 3 removed/renamed the Script-Fu PDB calls the workload relied on (plug-in-unsharp-mask, gimp-levels-stretch), so it is removed rather than maintained as best-effort. Inkscape now exports the first INKSCAPE_FILES SVGs (default 25) instead of all 121, cutting that step to well under a minute.
4
.gitignore
vendored
|
|
@ -33,3 +33,7 @@ phases-*.csv
|
|||
power-*.csv
|
||||
compare-scores.csv
|
||||
*.png
|
||||
|
||||
# app corpus extraction outputs (regenerated)
|
||||
tools/corpus/*-out/
|
||||
tools/corpus/*-work/
|
||||
|
|
|
|||
19
README.md
|
|
@ -63,7 +63,7 @@ You can run the parts in any order; run both on the same machine back to back.
|
|||
| `compare-report.py` | Cross-device / before-after results table + one bar chart per benchmark (`results/graphs/compare-*.png`). |
|
||||
| `results/` | Created at runtime: CSVs, logs, `results/graphs/*.png`. |
|
||||
| `tools/` | Bundled binaries: PassMark (`tools/pt/`). Ships with the kit — no download needed. |
|
||||
| `tools/corpus/` | Fixed sample inputs for the app workloads (LibreOffice docs, a GEGL/GIMP photo, Inkscape SVGs), fetched once and checksum-pinned. |
|
||||
| `tools/corpus/` | Fixed sample inputs for the app workloads (LibreOffice docs, a GEGL photo, Inkscape SVGs), fetched once and checksum-pinned. |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ hardware.
|
|||
for PassMark. Set `INSTALL_DEPS=0` to never install.
|
||||
- The LLM test needs **no** install: `llama-bench` and its small model are
|
||||
bundled under `tools/llama/` (see §4).
|
||||
- The **app workloads** (LibreOffice, GEGL, Inkscape, GIMP; see §4) are optional:
|
||||
- The **app workloads** (LibreOffice, GEGL, Inkscape; see §4) are optional:
|
||||
each step runs only if its command is installed, otherwise it is skipped and
|
||||
listed by `./run-benchmarks.sh doctor`.
|
||||
|
||||
|
|
@ -136,7 +136,7 @@ tools/llama/bin/llama-bench \
|
|||
```
|
||||
Override with `LLAMA_MODEL=` (any GGUF), or `LLAMA_NGL=` to offload to GPU.
|
||||
|
||||
### App workloads — LibreOffice / GEGL / Inkscape / GIMP (optional)
|
||||
### App workloads — LibreOffice / GEGL / Inkscape (optional)
|
||||
Stock distro applications are driven over a fixed sample corpus. Each is the
|
||||
app's own CLI, timed, named after the benchmark. Install the ones you want to
|
||||
measure:
|
||||
|
|
@ -144,14 +144,12 @@ measure:
|
|||
sudo dnf install -y libreoffice-writer libreoffice-calc # documents -> PDF
|
||||
sudo dnf install -y gegl04-tools # GEGL operations
|
||||
sudo dnf install -y inkscape # SVG -> PNG
|
||||
sudo dnf install -y gimp # GIMP batch operations (GIMP 3)
|
||||
```
|
||||
On first run the corpora are **fetched once** into `tools/corpus/` and
|
||||
checksum-verified (`lo-sample-documents-1.zip`, `sample-photo-6000x4000-1.zip`,
|
||||
`svg-test-files-1.zip`; ~12 MB total), then reused so both sides process identical
|
||||
bytes. Missing apps are skipped; skip the whole group with `RUN_APPS=0`. GIMP 3
|
||||
reshaped the Script-Fu API, so the GIMP step picks a version-appropriate script
|
||||
and is best-effort — check `results/gimp-<tag>.txt` if a number looks wrong.
|
||||
bytes. Set INKSCAPE_FILES=N to change how many SVGs Inkscape exports (default 25).
|
||||
Missing apps are skipped; skip the whole group with `RUN_APPS=0`.
|
||||
|
||||
> `run-benchmarks.sh` finds PassMark at `tools/pt/pt_linux_x64` **or**
|
||||
> `tools/pt/PerformanceTest/PerformanceTest_Linux_x86-64`. Override the location
|
||||
|
|
@ -225,8 +223,7 @@ Headless part (`~25-30 min` per pass):
|
|||
| 6 | llama.cpp generation (`2B`, CPU/RAM) | ~15 s | bundled; token-generation tok/s |
|
||||
| 6b | LibreOffice docs→PDF (20 docs) | ~0.5-1 min | fixed corpus |
|
||||
| 6c | GEGL image ops (9 on one 6000×4000 photo) | ~0.5-1 min | fixed corpus |
|
||||
| 6d | Inkscape SVG→PNG (fixed set) | ~1-2 min | fixed corpus |
|
||||
| 6e | GIMP batch ops (4) | ~1-2 min | GIMP 3, best-effort |
|
||||
| 6d | Inkscape SVG→PNG (first 25) | ~20-30 s | fixed corpus |
|
||||
| 7 | `fio` 4×30 s | 3-4 min | same SSD, control; runs as your user |
|
||||
| 8 | `stress-ng` 5 min + `turbostat` | ~8 min | thermals/power |
|
||||
| 9 | `systemd-analyze` | <1 min | informational |
|
||||
|
|
@ -334,7 +331,7 @@ a phase marker (exact or substring). Phase names:
|
|||
env idle PassMark-cpu PassMark-mem 7zip 7zip-1t openssl
|
||||
sysbench-1t sysbench-nt sysbench-mem llama
|
||||
fio-seqread fio-seqwrite fio-randread fio-randwrite
|
||||
thermal-load systemd libreoffice gegl inkscape gimp
|
||||
thermal-load systemd libreoffice gegl inkscape
|
||||
glmark2 vkmark
|
||||
```
|
||||
|
||||
|
|
@ -350,7 +347,6 @@ llama-tg,18.2
|
|||
libreoffice,3.9
|
||||
gegl,1.8
|
||||
inkscape,12.4
|
||||
gimp,0.33
|
||||
fio-seqread,2010.4
|
||||
glmark2,5989
|
||||
```
|
||||
|
|
@ -424,7 +420,6 @@ before-headed`.
|
|||
| Governor left on `performance` | Shouldn't happen (restored on exit); set it back with `sudo cpupower frequency-set -g powersave`. |
|
||||
| App step says `skip (… missing)` | That app isn't installed; `sudo dnf install -y <pkg>`, or `RUN_APPS=0` to silence. |
|
||||
| App step says `skip (corpus unavailable)` | Corpus download failed (no curl/wget or no network); re-run with network, or pre-seed `tools/corpus/`. |
|
||||
| GIMP step errors / odd number | GIMP 3 reshaped Script-Fu; inspect `results/gimp-<tag>.txt` (see §4). |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -31,8 +31,7 @@
|
|||
5 llama.cpp generation (2B, CPU/RAM) headless script ~15 s bundled; tok/s
|
||||
5b LibreOffice: 20 documents -> PDF headless script ~1 min fixed corpus
|
||||
5c GEGL: 9 image ops (6000x4000) headless script ~1 min fixed corpus
|
||||
5d Inkscape: SVG -> PNG headless script 1-2 min fixed corpus
|
||||
5e GIMP: 4 batch ops headless script 1-2 min GIMP 3, best-effort
|
||||
5d Inkscape: SVG -> PNG (first 25) headless script ~30 s fixed corpus
|
||||
6 fio 4x30s headless script 3-4 min runs as your user
|
||||
7 stress-ng 5 min + turbostat headless script ~8 min thermals/power
|
||||
8 systemd-analyze headless script <1 min
|
||||
|
|
@ -126,15 +125,15 @@
|
|||
| tee llama-$TAG.txt
|
||||
# -ngl 0 forces CPU/RAM (no GPU offload). Record the tg t/s number.
|
||||
|
||||
== 5c. APP WORKLOADS (LibreOffice / GEGL / Inkscape / GIMP) ==
|
||||
== 5c. APP WORKLOADS (LibreOffice / GEGL / Inkscape) ==
|
||||
# Stock distro apps run over a fixed sample corpus; run-benchmarks.sh fetches
|
||||
# the corpus ONCE into tools/corpus/ (checksum-pinned) and times the app's own
|
||||
# CLI, reporting a rate (items/s, higher is better). Missing apps are skipped.
|
||||
sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools gimp
|
||||
sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools
|
||||
RUN_APPS=1 ./run-benchmarks.sh before headless # default on
|
||||
RUN_APPS=0 ./run-benchmarks.sh before headless # skip the group
|
||||
# Phases / scores are named after the benchmark: libreoffice gegl inkscape gimp.
|
||||
# GIMP 3 reshaped Script-Fu, so the GIMP step is best-effort.
|
||||
# Phases / scores are named after the benchmark: libreoffice gegl inkscape.
|
||||
# INKSCAPE_FILES=N changes how many SVGs are exported (default 25).
|
||||
|
||||
== 7. GPU — DISCRETE RX 6700 XT (same card both runs; HEADED part only) ==
|
||||
sudo dnf install -y glmark2 vkmark vulkan-tools mesa-demos
|
||||
|
|
@ -228,7 +227,7 @@
|
|||
|
||||
# App workloads (see == 5c): stock apps + a fixed corpus fetched once into
|
||||
# tools/corpus/ (checksum-pinned). Install only the apps you want to measure.
|
||||
# sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools gimp
|
||||
# sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools
|
||||
|
||||
# PassMark PerformanceTest Linux — free, CLI. Download the Linux x86-64
|
||||
# zip (https://www.passmark.com/downloads/pt_linux_x64.zip), then:
|
||||
|
|
@ -260,7 +259,6 @@
|
|||
LibreOffice docs->PDF docs/s ______ ______ __%
|
||||
GEGL image ops ops/s ______ ______ __%
|
||||
Inkscape SVG->PNG images/s ______ ______ __%
|
||||
GIMP batch ops ops/s ______ ______ __%
|
||||
Kernel build sec ______ ______ __%
|
||||
OpenSSL aes-256-gcm GB/s ______ ______ __%
|
||||
GPU glmark2 score ______ ______ __%
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ disks() {
|
|||
tool_versions() {
|
||||
for c in 7z openssl fio stress-ng sysbench sensors turbostat cpupower \
|
||||
glmark2 vkmark glxinfo vulkaninfo python3 \
|
||||
libreoffice inkscape gegl gimp; do
|
||||
libreoffice inkscape gegl; do
|
||||
have "$c" && printf ' %-20s %s\n' "$c" "$("$c" --version 2>&1 | head -1)"
|
||||
done
|
||||
local pt="$DIR/tools/pt/PerformanceTest/PerformanceTest_Linux_x86-64"
|
||||
|
|
|
|||
|
|
@ -155,7 +155,6 @@ METRICS = [
|
|||
("libreoffice", "LibreOffice documents->PDF", "docs/s", True, None),
|
||||
("gegl", "GEGL image operations", "ops/s", True, None),
|
||||
("inkscape", "Inkscape SVG->PNG", "img/s", True, None),
|
||||
("gimp", "GIMP batch operations", "ops/s", True, None),
|
||||
("fio-seqread", "fio sequential read", "MB/s", True, raw_fio_seqread),
|
||||
("fio-seqwrite", "fio sequential write", "MB/s", True, raw_fio_seqwrite),
|
||||
("fio-randread", "fio random read 4k", "IOPS", True, raw_fio_randread),
|
||||
|
|
|
|||
|
|
@ -33,9 +33,10 @@
|
|||
# GPU_VD=0x1002:0x73df vendor:device hex for Vulkan selection (auto-detected)
|
||||
# LLAMA_MODEL=/path GGUF for the LLM test (default: bundled model)
|
||||
# LLAMA_NGL=0 GPU layers to offload (0 = CPU/RAM, the default)
|
||||
# RUN_APPS=1 app workloads: LibreOffice, GEGL, Inkscape, GIMP
|
||||
# RUN_APPS=1 app workloads: LibreOffice, GEGL, Inkscape
|
||||
# CORPUS=/path where the sample inputs are cached (default ./tools/corpus)
|
||||
# CORPUS_URL=... base URL the sample corpora are fetched from
|
||||
# INKSCAPE_FILES=25 how many SVGs the Inkscape step exports
|
||||
# GOVERNOR=powersave CPU governor to pin (default performance); an explicit
|
||||
# value is appended to the tag, e.g. after-powersave-headless
|
||||
# GLMARK2_DURATION=10 seconds for the glmark2 scene (headed part)
|
||||
|
|
@ -392,11 +393,11 @@ doctor() {
|
|||
printf ' %-22s %s\n' "$t" "$(command -v "$t" || echo MISSING)"
|
||||
done
|
||||
printf 'apps:\n'
|
||||
for t in libreoffice inkscape gegl gimp; do
|
||||
for t in libreoffice inkscape gegl; do
|
||||
printf ' %-22s %s\n' "$t" "$(command -v "$t" || echo MISSING)"
|
||||
done
|
||||
printf 'corpus: %s\n' "$CORPUS"
|
||||
printf ' install apps: sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools gimp\n'
|
||||
printf ' install apps: sudo dnf install -y libreoffice-writer libreoffice-calc inkscape gegl04-tools\n'
|
||||
printf 'governor: %s (pinned for timed runs; set GOVERNOR=... to choose)\n' "$GOVERNOR"
|
||||
local need; need="$(pkgs_for_missing)"
|
||||
if [ -z "${need// /}" ]; then
|
||||
|
|
@ -499,7 +500,7 @@ run_llama() {
|
|||
}
|
||||
|
||||
# --- app workloads (stock apps + fixed corpora) -------------------------------
|
||||
# Phases and score names are the benchmark names: libreoffice gegl inkscape gimp.
|
||||
# Phases and score names are the benchmark names: libreoffice gegl inkscape.
|
||||
# Each registers a rate (items/s) so higher stays better for the score/W table.
|
||||
|
||||
run_libreoffice() {
|
||||
|
|
@ -568,13 +569,17 @@ run_inkscape() {
|
|||
c373998bebff0a88f0c4e6fec383eaa62690f544c6eb2b1ad7c55b1547e4db08 inkscape \
|
||||
|| { printf 'skip (corpus unavailable)\n'; return 0; }
|
||||
local d="$CORPUS/inkscape" out="$CORPUS/inkscape-out" log="inkscape-$TAG.txt"
|
||||
local n t0 t1 el r f
|
||||
n=$(find "$d" -maxdepth 1 -name '*.svg' 2>/dev/null | wc -l)
|
||||
local n limit t0 t1 el r f
|
||||
local -a svgs
|
||||
mapfile -t svgs < <(find "$d" -maxdepth 1 -name '*.svg' 2>/dev/null | sort)
|
||||
n="${#svgs[@]}"
|
||||
[ "$n" -gt 0 ] || { printf 'skip (no SVG in corpus)\n'; return 0; }
|
||||
limit="${INKSCAPE_FILES:-25}" # cap the corpus so the step stays short
|
||||
[ "$limit" -gt 0 ] 2>/dev/null && [ "$limit" -lt "$n" ] && n="$limit"
|
||||
rm -rf "$out"; mkdir -p "$out"
|
||||
{ inkscape --version; printf 'export %s SVG files -> PNG\n' "$n"; } > "$log" 2>&1
|
||||
{ inkscape --version; printf 'export %s of %s SVG files -> PNG\n' "$n" "${#svgs[@]}"; } > "$log" 2>&1
|
||||
t0=$(now)
|
||||
for f in "$d"/*.svg; do
|
||||
for f in "${svgs[@]:0:$n}"; do
|
||||
inkscape --export-filename="$out/$(basename "${f%.svg}").png" "$f" >> "$log" 2>&1
|
||||
done
|
||||
t1=$(now)
|
||||
|
|
@ -584,89 +589,11 @@ run_inkscape() {
|
|||
reg_score "inkscape" "$r"
|
||||
}
|
||||
|
||||
# GIMP batch Script-Fu. GIMP 3 renamed/reshaped much of the PDB, so pick the
|
||||
# script for the installed major version. GIMP 3 support is best-effort: verify
|
||||
# the log if the op count or timing looks off.
|
||||
gimp_script_v2() {
|
||||
cat > "$1" <<'SCM'
|
||||
(define (batch-op op pattern)
|
||||
(let* ((filelist (cadr (file-glob pattern 1))))
|
||||
(while (not (null? filelist))
|
||||
(let* ((filename (car filelist))
|
||||
(image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
|
||||
(drawable (car (gimp-image-get-active-layer image))))
|
||||
(cond ((string=? op "unsharp-mask")
|
||||
(plug-in-unsharp-mask RUN-NONINTERACTIVE image drawable 15.0 0.6 0))
|
||||
((string=? op "resize") (gimp-image-scale image 600 400))
|
||||
((string=? op "rotate") (gimp-image-rotate image 0))
|
||||
((string=? op "auto-levels") (gimp-levels-stretch drawable)))
|
||||
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
|
||||
(gimp-image-delete image))
|
||||
(set! filelist (cdr filelist)))))
|
||||
SCM
|
||||
}
|
||||
gimp_script_v3() {
|
||||
cat > "$1" <<'SCM'
|
||||
(script-fu-use-v3)
|
||||
(define (batch-op op pattern)
|
||||
(let* ((filelist (file-glob #:pattern pattern #:filename-encoding TRUE)))
|
||||
(while (not (null? filelist))
|
||||
(let* ((filename (car filelist))
|
||||
(image (gimp-file-load RUN-NONINTERACTIVE filename))
|
||||
(drawable (vector-ref (gimp-image-get-selected-drawables image) 0)))
|
||||
(cond ((string=? op "unsharp-mask")
|
||||
(plug-in-unsharp-mask RUN-NONINTERACTIVE image drawable 15.0 0.6 0))
|
||||
((string=? op "resize") (gimp-image-scale image 600 400))
|
||||
((string=? op "rotate") (gimp-image-rotate image 0))
|
||||
((string=? op "auto-levels") (gimp-levels-stretch drawable)))
|
||||
(gimp-file-save RUN-NONINTERACTIVE image filename)
|
||||
(gimp-image-delete image))
|
||||
(set! filelist (cdr filelist)))))
|
||||
SCM
|
||||
}
|
||||
run_gimp() {
|
||||
section "APP: GIMP — batch image operations"
|
||||
phase "gimp"
|
||||
if ! have gimp; then
|
||||
printf 'skip (gimp missing) — sudo dnf install -y gimp\n'
|
||||
return 0
|
||||
fi
|
||||
setup_corpus sample-photo-6000x4000-1.zip "$CORPUS_URL/sample-photo-6000x4000-1.zip" \
|
||||
cadcd434abcdc82a220e7022c749b6fa5f46bb7a32ec14423ca8aab067b0e989 gimp \
|
||||
|| { printf 'skip (corpus unavailable)\n'; return 0; }
|
||||
local d="$CORPUS/gimp" src log="gimp-$TAG.txt" w scm gv t0 t1 el r op
|
||||
src="$(find "$d" -maxdepth 1 -iname '*.jpg' 2>/dev/null | head -1)"
|
||||
[ -n "$src" ] || { printf 'skip (no JPEG in corpus)\n'; return 0; }
|
||||
w="$CORPUS/gimp-work"; rm -rf "$w"; mkdir -p "$w"
|
||||
scm="$w/bench.scm"
|
||||
gv="$(gimp --version 2>&1 | grep -oE '[0-9]+' | head -1)"; gv="${gv:-3}"
|
||||
if [ "$gv" -ge 3 ] 2>/dev/null; then gimp_script_v3 "$scm"; else gimp_script_v2 "$scm"; fi
|
||||
{ gimp --version 2>&1 | head -1; printf '4 ops x 1 image (v%s script)\n' "$gv"; } > "$log"
|
||||
t0=$(now)
|
||||
for op in unsharp-mask resize rotate auto-levels; do
|
||||
cp -f "$src" "$w/sample.JPG"
|
||||
printf -- '-- %s --\n' "$op" >> "$log"
|
||||
if [ "$gv" -ge 3 ] 2>/dev/null; then
|
||||
GIMP3_DIRECTORY="$w/cfg" gimp -i --batch-interpreter=plug-in-script-fu-eval \
|
||||
-b "(load \"$scm\")" -b "(batch-op \"$op\" \"$w/*.JPG\")" -b '(gimp-quit 0)' >> "$log" 2>&1
|
||||
else
|
||||
GIMP2_DIRECTORY="$w/cfg" gimp -i \
|
||||
-b "(load \"$scm\")" -b "(batch-op \"$op\" \"$w/*.JPG\")" -b '(gimp-quit 0)' >> "$log" 2>&1
|
||||
fi
|
||||
done
|
||||
t1=$(now)
|
||||
el="$(secs "$t0" "$t1")"; r="$(per_s 4 "$el")"
|
||||
cat "$log"
|
||||
printf 'gimp: 4 ops in %ss = %s ops/s\n' "$el" "$r"
|
||||
reg_score "gimp" "$r"
|
||||
}
|
||||
|
||||
run_apps() {
|
||||
section "APP WORKLOADS (LibreOffice / GEGL / Inkscape / GIMP)"
|
||||
section "APP WORKLOADS (LibreOffice / GEGL / Inkscape)"
|
||||
run_libreoffice
|
||||
run_gegl
|
||||
run_inkscape
|
||||
run_gimp
|
||||
}
|
||||
|
||||
run_headless() {
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
(script-fu-use-v3)
|
||||
(define (batch-op op pattern)
|
||||
(let* ((filelist (file-glob #:pattern pattern #:filename-encoding TRUE)))
|
||||
(while (not (null? filelist))
|
||||
(let* ((filename (car filelist))
|
||||
(image (gimp-file-load RUN-NONINTERACTIVE filename))
|
||||
(drawable (vector-ref (gimp-image-get-selected-drawables image) 0)))
|
||||
(cond ((string=? op "unsharp-mask")
|
||||
(plug-in-unsharp-mask RUN-NONINTERACTIVE image drawable 15.0 0.6 0))
|
||||
((string=? op "resize") (gimp-image-scale image 600 400))
|
||||
((string=? op "rotate") (gimp-image-rotate image 0))
|
||||
((string=? op "auto-levels") (gimp-levels-stretch drawable)))
|
||||
(gimp-file-save RUN-NONINTERACTIVE image filename)
|
||||
(gimp-image-delete image))
|
||||
(set! filelist (cdr filelist)))))
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
# GIMP gimprc
|
||||
#
|
||||
# This is your personal gimprc file. Any variable defined in this file takes
|
||||
# precedence over the value defined in the system-wide gimprc:
|
||||
# /etc/gimp/3.0/gimprc
|
||||
# Most values can be set within GIMP by changing some options in the
|
||||
# Preferences dialog.
|
||||
|
||||
(prev-language "American English")
|
||||
(config-version "3.2.6")
|
||||
(import-raw-plug-in "${gimp_plug_in_dir}/plug-ins/file-raw-placeholder/file-raw-placeholder")
|
||||
(fill-options
|
||||
(style fg-color)
|
||||
(custom-style solid-color)
|
||||
(antialias yes)
|
||||
(feather no)
|
||||
(feather-radius 10))
|
||||
(stroke-options
|
||||
(style fg-color)
|
||||
(custom-style solid-color)
|
||||
(antialias yes)
|
||||
(feather no)
|
||||
(feather-radius 10)
|
||||
(method line)
|
||||
(width 6)
|
||||
(unit pixels)
|
||||
(cap-style butt)
|
||||
(join-style miter)
|
||||
(miter-limit 10)
|
||||
(dash-offset 0)
|
||||
(dash-info 0)
|
||||
(emulate-brush-dynamics no))
|
||||
|
||||
|
||||
# end of gimprc
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<tags>
|
||||
|
||||
<resource identifier="${gimp_data_dir}/brushes/Round.vbr" checksum="a7f02530d3bc7484c8f9240cbe9c65b1">
|
||||
<tag>round</tag>
|
||||
</resource>
|
||||
|
||||
<resource identifier="${gimp_data_dir}/brushes/Round-Fuzzy.vbr" checksum="f8cb2466841104a55e42afce4568d103">
|
||||
<tag>fuzzy</tag>
|
||||
<tag>round</tag>
|
||||
</resource>
|
||||
|
||||
</tags>
|
||||
|
Before Width: | Height: | Size: 7.5 MiB |
|
Before Width: | Height: | Size: 7.5 MiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 56 KiB |