From a8a11a3a399d16b02cc17049db144b27e845b57a Mon Sep 17 00:00:00 2001 From: Xavier Roche Date: Sun, 2 Aug 2026 09:55:30 +0200 Subject: [PATCH] The rings background is a 501x456 GIF that blurs on any hi-DPI screen The panel decoration was drawn as vector and flattened to a 4KB indexed GIF some time around 2007, with the panel colour baked in as an opaque backdrop. Refitting its four ellipse boundaries recovers the original geometry, so it goes back to being what it was: two elliptical annuli, 553 bytes of SVG, with a transparent background that now composites over the panel instead of having to match it. Rasterised at the same size, the only pixels that differ from the GIF are single-pixel anti-aliasing fringes along the four boundaries. Nothing survives a 3x3 erosion of that difference, so no edge has moved. Dark mode still drops the image rather than inverting it, since the ring lavender is a light-panel tone whichever way the file stores it. The engine keeps its own embedded copy of this GIF for the backblue.gif it writes into mirrors. That one is untouched: the filename and byte length are a contract with pages already on disk. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Xavier Roche --- html/doc.css | 6 +++--- html/httrack.css | 2 +- html/images/bg_rings.gif | Bin 4235 -> 0 bytes html/images/bg_rings.svg | 8 ++++++++ html/server/images/bg_rings.gif | Bin 4235 -> 0 bytes html/server/images/bg_rings.svg | 8 ++++++++ html/server/style.css | 2 +- tests/142_webhttrack-content-type.test | 5 +++-- 8 files changed, 24 insertions(+), 7 deletions(-) delete mode 100644 html/images/bg_rings.gif create mode 100644 html/images/bg_rings.svg delete mode 100644 html/server/images/bg_rings.gif create mode 100644 html/server/images/bg_rings.svg diff --git a/html/doc.css b/html/doc.css index 21e926341..8f832c11d 100644 --- a/html/doc.css +++ b/html/doc.css @@ -72,14 +72,14 @@ body { background: var(--panel); border-bottom: 6px solid #000; padding: 1.5rem; - /* The rings the 2007 pages carried. The image has the light panel colour baked - into it, so it is dropped rather than inverted in dark mode. */ - background-image: url(images/bg_rings.gif); + /* The rings the 2007 pages carried. Transparent, so it rides on --panel. */ + background-image: url(images/bg_rings.svg); background-repeat: no-repeat; background-position: top right; } @media (prefers-color-scheme: dark) { + /* Rings dropped, not inverted: their lavender is a light-panel tone. */ .wrap { background-image: none; } /* The wordmark is black on transparent, and all but vanishes on the dark field. */ diff --git a/html/httrack.css b/html/httrack.css index 4f2c01b4f..238e31f37 100644 --- a/html/httrack.css +++ b/html/httrack.css @@ -37,7 +37,7 @@ a:active { text-decoration: underline; } border-bottom: 6px solid #000; padding: 10px; padding-top: 20px; line-height: 1.65em; - background-image: url(images/bg_rings.gif); + background-image: url(images/bg_rings.svg); background-repeat: no-repeat; background-position: top right; } diff --git a/html/images/bg_rings.gif b/html/images/bg_rings.gif deleted file mode 100644 index 5dc34d1a590dac9e9ca56f46fad4a4284fa851c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 diff --git a/html/images/bg_rings.svg b/html/images/bg_rings.svg new file mode 100644 index 000000000..216957706 --- /dev/null +++ b/html/images/bg_rings.svg @@ -0,0 +1,8 @@ + +HTTrack rings + + + + + + diff --git a/html/server/images/bg_rings.gif b/html/server/images/bg_rings.gif deleted file mode 100644 index 5dc34d1a590dac9e9ca56f46fad4a4284fa851c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 diff --git a/html/server/images/bg_rings.svg b/html/server/images/bg_rings.svg new file mode 100644 index 000000000..216957706 --- /dev/null +++ b/html/server/images/bg_rings.svg @@ -0,0 +1,8 @@ + +HTTrack rings + + + + + + diff --git a/html/server/style.css b/html/server/style.css index add8240d5..dd43c06d0 100644 --- a/html/server/style.css +++ b/html/server/style.css @@ -36,7 +36,7 @@ a:active { text-decoration: underline; } border-bottom: 6px solid #000; padding: 10px; padding-top: 20px; line-height: 1.65em; - background-image: url(images/bg_rings.gif); + background-image: url(images/bg_rings.svg); background-repeat: no-repeat; background-position: top right; } diff --git a/tests/142_webhttrack-content-type.test b/tests/142_webhttrack-content-type.test index 87013f8fe..00b544ac3 100644 --- a/tests/142_webhttrack-content-type.test +++ b/tests/142_webhttrack-content-type.test @@ -24,7 +24,7 @@ python=$(find_python) || { # The GUI assets asserted below have to exist, or every check goes vacuous. for asset in server/ping.js server/style.css images/screenshot_01.jpg \ - images/bg_rings.gif img/guide-droid-opt-spider.png \ + images/bg_rings.svg images/header_title_4.gif img/guide-droid-opt-spider.png \ server/div/com.httrack.WebHTTrack.metainfo.xml; do test -f "${distdir}/html/${asset}" || fail "missing GUI asset ${asset}" done @@ -131,7 +131,8 @@ def check_html_headers(path): check_html_headers("/server/index.html") check_type("/server/ping.js", "text/javascript") check_type("/server/style.css", "text/css") -check_type("/images/bg_rings.gif", "image/gif") +check_type("/images/bg_rings.svg", "image/svg+xml") +check_type("/images/header_title_4.gif", "image/gif") check_type("/img/guide-droid-opt-spider.png", "image/png") check_type("/images/screenshot_01.jpg", "image/jpeg") # Dots in the stem: the type comes from the last one, not the first.