Skip to content

Commit 6768c84

Browse files
committed
release: v5.0.0 - The Advanced Color & SIMD Update
1 parent 481c7cf commit 6768c84

File tree

8 files changed

+315
-160
lines changed

8 files changed

+315
-160
lines changed

.github/workflows/publish_version.yml

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,59 @@ jobs:
1717
- name: Generate version.json with Changelog
1818
env:
1919
TAG_NAME: ${{ github.event.release.tag_name }}
20-
DOWNLOAD_URL: https://github.com/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/QuickView_${{ github.event.release.tag_name }}.zip
20+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2121
RELEASE_BODY: ${{ github.event.release.body }}
2222
run: |
2323
VERSION=${TAG_NAME#v}
2424
DATE=$(date +'%Y-%m-%d')
2525
2626
mkdir -p public
2727
28+
# 1. Get all assets in JSON
29+
ASSETS=$(gh release view "$TAG_NAME" --json assets -q '.assets')
30+
31+
# 2. Identify ARM64 asset (Case-Insensitive)
32+
URL_ARM64=$(echo "$ASSETS" | jq -r 'map(select(.name | ascii_downcase | contains("arm64"))) | .[0].url // ""')
33+
NAME_ARM64=$(echo "$ASSETS" | jq -r 'map(select(.name | ascii_downcase | contains("arm64"))) | .[0].name // ""')
34+
35+
# 3. Identify X64 asset (Case-Insensitive)
36+
URL_X64=$(echo "$ASSETS" | jq -r 'map(select(.name | ascii_downcase | (contains("x64") or contains("amd64")))) | .[0].url // ""')
37+
NAME_X64=$(echo "$ASSETS" | jq -r 'map(select(.name | ascii_downcase | (contains("x64") or contains("amd64")))) | .[0].name // ""')
38+
39+
# If no explicit x64 found, take the first .zip/exe that isn't ARM64
40+
if [ -z "$URL_X64" ]; then
41+
URL_X64=$(echo "$ASSETS" | jq -r 'map(select((.name | ascii_downcase | contains("arm64") | not) and (.name | test("\\.(zip|exe)$"; "i")))) | .[0].url // ""')
42+
NAME_X64=$(echo "$ASSETS" | jq -r 'map(select((.name | ascii_downcase | contains("arm64") | not) and (.name | test("\\.(zip|exe)$"; "i")))) | .[0].name // ""')
43+
fi
44+
45+
SHA_X64=""
46+
SHA_ARM64=""
47+
48+
# Download and Hash X64
49+
if [ -n "$NAME_X64" ]; then
50+
gh release download "$TAG_NAME" -p "$NAME_X64" -O x64_pkg
51+
SHA_X64=$(sha256sum x64_pkg | awk '{print $1}')
52+
fi
53+
54+
# Download and Hash ARM64
55+
if [ -n "$NAME_ARM64" ]; then
56+
gh release download "$TAG_NAME" -p "$NAME_ARM64" -O arm64_pkg
57+
SHA_ARM64=$(sha256sum arm64_pkg | awk '{print $1}')
58+
fi
59+
60+
# Fallback URL for legacy clients (pointing to X64)
61+
URL=$URL_X64
62+
2863
jq -n \
2964
--arg v "$VERSION" \
30-
--arg u "$DOWNLOAD_URL" \
65+
--arg u "$URL" \
66+
--arg u_x64 "$URL_X64" \
67+
--arg u_arm "$URL_ARM64" \
68+
--arg sha_x64 "$SHA_X64" \
69+
--arg sha_arm "$SHA_ARM64" \
3170
--arg d "$DATE" \
3271
--arg c "$RELEASE_BODY" \
33-
'{version: $v, url: $u, date: $d, changelog: $c}' \
72+
'{version: $v, url: $u, url_x64: $u_x64, url_arm64: $u_arm, sha256_x64: $sha_x64, sha256_arm64: $sha_arm, date: $d, changelog: $c}' \
3473
> public/version.json
3574
3675
echo "=== Generated JSON Content ==="

CHANGELOG.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,48 @@
11
# Changelog
22

3+
## [5.0.0] - The Advanced Color & Architecture Update
4+
**Release Date**: 2026-04-05
5+
6+
### ✨ Features
7+
- **Google Highway SIMD**: Modernized core architecture using Google Highway SIMD abstraction.
8+
- Expanded hardware support (SSE4, AVX2, AVX-512, NEON).
9+
- Native **ARM64 (Windows on ARM)** support with optimized image processing.
10+
- **Advanced HDR Pipeline**:
11+
- Professional-grade **Ultra HDR (Gain Map)** GPU composition pipeline.
12+
- Full **32-bit float scRGB linear** pipeline for maximum precision and color fidelity.
13+
- Hardware-accelerated HDR decoding for HEIF/AVIF via native WIC.
14+
- **HDR Info Panel**:
15+
- Integrated real-time peak luminance estimation (SIMD-accelerated).
16+
- Detailed "HDR Pro" metadata parsing for EXR, JXL, WDP, and RAW.
17+
- **GPU-driven CMS & Soft Proofing**:
18+
- Unified hardware-accelerated CMS for all rendering paths.
19+
- Global **Soft Proofing** feature using Direct2D dual-node CMS.
20+
- Support for Adobe RGB (1998), Grayscale, and ICC v4 Compact profiles.
21+
- **Navigation & Sorting (#118)**:
22+
- Implemented advanced natural/custom sorting and cross-folder loop navigation.
23+
- Decoupled 'Loop' and 'Traverse Subfolders' into independent toggles.
24+
- **UI/UX**:
25+
- Modernized toolbar icons for comparison and gallery modes.
26+
- Added interactive tooltips for complex settings.
27+
28+
### ⚡ Performance
29+
- **SIMD Optimized Ops**: Re-engineered core rendering operators with Highway for consistent 5x-10x speedups across architectures.
30+
- **HeavyLanePool**: Optimized worker lane scheduling and resource recycling.
31+
32+
### 🐛 Bug Fixes
33+
- **Stability**: Fixed HeavyLanePool starvation deadlock during rapid navigation (#85).
34+
- **Layout**: Fixed window resizing logic (center-based expansion) and Info Panel constraints (#88).
35+
- **Formats**: Fixed SVG dimension parsing for complex viewports (#87).
36+
- **HDR**: Fixed AVIF HDR gain map decoding crash (#124).
37+
- **Interaction**: Fixed window resize direction after manual rotation during zoom (#91).
38+
- **UI**: Fixed settings menu text overflow and button alignment issues (#89).
39+
- **Core**: Fixed persistent zoom/pan state loss when switching color spaces or RAW mode.
40+
41+
### 🤝 Acknowledgments
42+
- **@Dimmitrius**: For the comprehensive optimization of the Russian translation.
43+
- **@hortiSquash**: For continuous bug reporting and UX feedback.
44+
45+
346
## [4.2.5] - Comparison & Precision Master
447
**Release Date**: 2026-03-22
548

QuickView/UIRenderer.cpp

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,47 +1320,6 @@ void UIRenderer::DrawDebugHUD(ID2D1DeviceContext* dc) {
13201320
dc->DrawText(buffer, (UINT32)wcslen(buffer), m_debugFormat.Get(),
13211321
D2D1::RectF(hudX + 10, hudY + 5, hudX + hudW - 10, hudY + 75), m_whiteBrush.Get());
13221322

1323-
{
1324-
std::wstring displayLine = L"Display: ";
1325-
if (m_compEngine) {
1326-
const auto& displayState = m_compEngine->GetDisplayColorState();
1327-
displayLine += displayState.advancedColorActive ? L"HDR" : L"SDR";
1328-
std::wstring peak = FormatHdrNits(displayState.maxLuminanceNits);
1329-
std::wstring full = FormatHdrNits(displayState.maxFullFrameLuminanceNits);
1330-
std::wstring sdrWhite = FormatHdrNits(displayState.sdrWhiteLevelNits);
1331-
std::wstring headroom = FormatHdrStops(displayState.GetHdrHeadroomStops());
1332-
if (!peak.empty()) displayLine += L" Peak " + peak;
1333-
if (!full.empty()) displayLine += L" Full " + full;
1334-
if (!sdrWhite.empty()) displayLine += L" SDR " + sdrWhite;
1335-
if (!headroom.empty()) displayLine += L" " + headroom;
1336-
} else {
1337-
displayLine += L"N/A";
1338-
}
1339-
1340-
std::wstring imageLine = L"Image: ";
1341-
if (IsHdrLikeContent(g_currentMetadata) || g_currentMetadata.hdrMetadata.isValid) {
1342-
const std::wstring hdrSummary = BuildHdrSummary(g_currentMetadata);
1343-
const std::wstring hdrDetail = BuildHdrDetail(g_currentMetadata.hdrMetadata);
1344-
imageLine += hdrSummary.empty() ? BuildDynamicRangeLabel(g_currentMetadata) : hdrSummary;
1345-
if (!hdrDetail.empty()) imageLine += L" " + hdrDetail;
1346-
} else {
1347-
imageLine += L"SDR / no HDR metadata";
1348-
}
1349-
1350-
dc->DrawText(
1351-
displayLine.c_str(),
1352-
(UINT32)displayLine.length(),
1353-
m_debugFormat.Get(),
1354-
D2D1::RectF(hudX + 10, hudY + 78, hudX + hudW - 10, hudY + 94),
1355-
whiteBrush.Get());
1356-
dc->DrawText(
1357-
imageLine.c_str(),
1358-
(UINT32)imageLine.length(),
1359-
m_debugFormat.Get(),
1360-
D2D1::RectF(hudX + 10, hudY + 94, hudX + hudW - 10, hudY + 112),
1361-
whiteBrush.Get());
1362-
}
1363-
13641323
// 4. Matrix (Scout + Heavy)
13651324
float px = hudX + 10.0f;
13661325
float py = hudY + 146.0f;
@@ -1980,10 +1939,12 @@ namespace {
19801939
static std::wstring BuildDisplayHeadroomLabel(const QuickView::DisplayColorState& displayState) {
19811940
const float sdrWhite = displayState.sdrWhiteLevelNits > 0.0f ? displayState.sdrWhiteLevelNits : 80.0f;
19821941
const float peak = displayState.maxLuminanceNits > 0.0f ? displayState.maxLuminanceNits : sdrWhite;
1942+
const float full = displayState.maxFullFrameLuminanceNits > 0.0f ? displayState.maxFullFrameLuminanceNits : sdrWhite;
1943+
19831944
std::wstring label = FormatHdrRatio(peak / sdrWhite);
19841945
if (!label.empty()) label += L" ";
1985-
wchar_t buf[96];
1986-
swprintf_s(buf, L"(%.0f nits SDR / %.0f nits Max)", sdrWhite, peak);
1946+
wchar_t buf[128];
1947+
swprintf_s(buf, L"(%.0f SDR / %.0f Max / %.0f Full)", sdrWhite, peak, full);
19871948
label += buf;
19881949
return label;
19891950
}

0 commit comments

Comments
 (0)