From e7ad7beb04be1b701dafb3ff2a3349412e08d7cb Mon Sep 17 00:00:00 2001 From: loner <2788892716@qq.com> Date: Wed, 3 Dec 2025 00:50:20 +0800 Subject: [PATCH] fix(rendering): Correct NImageRounded aspect ratio handling --- Modules/Panels/Launcher/ClipboardPreview.qml | 31 ++-------------- Shaders/frag/rounded_image.frag | 36 ++++++++----------- Shaders/qsb/rounded_image.frag.qsb | Bin 3682 -> 3950 bytes 3 files changed, 16 insertions(+), 51 deletions(-) diff --git a/Modules/Panels/Launcher/ClipboardPreview.qml b/Modules/Panels/Launcher/ClipboardPreview.qml index 9aa93fe28..45a41ba06 100644 --- a/Modules/Panels/Launcher/ClipboardPreview.qml +++ b/Modules/Panels/Launcher/ClipboardPreview.qml @@ -65,12 +65,6 @@ Item { } } - Image { - id: sizeHelper - source: imageDataUrl - visible: false - } - Rectangle { anchors.fill: parent color: Color.mSurface || "#f5f5f5" @@ -101,32 +95,11 @@ Item { } Item { - id: imageContainer anchors.fill: parent anchors.margins: Style.marginS NImageRounded { - id: imagePreview - anchors.centerIn: parent - - readonly property real imageAspect: (sizeHelper.sourceSize.height > 0) ? sizeHelper.sourceSize.width / sizeHelper.sourceSize.height : 1.0 - readonly property real containerAspect: (imageContainer.height > 0) ? imageContainer.width / imageContainer.height : 1.0 - - width: { - if (imageAspect > containerAspect) { - return imageContainer.width; - } else { - return imageContainer.height * imageAspect; - } - } - height: { - if (imageAspect > containerAspect) { - return imageContainer.width / imageAspect; - } else { - return imageContainer.height; - } - } - + anchors.fill: parent imagePath: imageDataUrl visible: isImageContent && !loadingFullContent && imageDataUrl !== "" radius: Style.radiusS @@ -151,4 +124,4 @@ Item { } } } -} +} \ No newline at end of file diff --git a/Shaders/frag/rounded_image.frag b/Shaders/frag/rounded_image.frag index e38c0a003..cf9fde018 100644 --- a/Shaders/frag/rounded_image.frag +++ b/Shaders/frag/rounded_image.frag @@ -54,41 +54,33 @@ void main() { // Image.TileHorizontally = 5 // Image.Pad = 6 - if (fillMode == 2) { // PreserveAspectCrop - // Calculate aspect ratios + if (fillMode == 1) { // PreserveAspectFit float itemAspect = itemSize.x / itemSize.y; float sourceAspect = sourceSize.x / sourceSize.y; - // Calculate the scale needed to cover the item area - vec2 scale; if (sourceAspect > itemAspect) { - // Image is wider - fit height, crop sides - scale.y = 1.0; - scale.x = sourceAspect / itemAspect; + // Image is wider than item, letterbox top/bottom + imageUV.y = (qt_TexCoord0.y - 0.5) * (sourceAspect / itemAspect) + 0.5; } else { - // Image is taller - fit width, crop top/bottom - scale.x = 1.0; - scale.y = itemAspect / sourceAspect; + // Image is taller than item, letterbox left/right + imageUV.x = (qt_TexCoord0.x - 0.5) * (itemAspect / sourceAspect) + 0.5; } - // Apply scale and center - imageUV = (qt_TexCoord0 - 0.5) / scale + 0.5; - } else if (fillMode == 1) { // PreserveAspectFit + // Make letterbox area transparent + if (imageUV.x < 0.0 || imageUV.x > 1.0 || imageUV.y < 0.0 || imageUV.y > 1.0) { + alpha = 0.0; + } + } else if (fillMode == 2) { // PreserveAspectCrop float itemAspect = itemSize.x / itemSize.y; float sourceAspect = sourceSize.x / sourceSize.y; - vec2 scale; if (sourceAspect > itemAspect) { - // Image is wider - fit width, letterbox top/bottom - scale.x = 1.0; - scale.y = itemAspect / sourceAspect; + // Image is wider than item, crop left/right. + imageUV.x = (qt_TexCoord0.x - 0.5) * (itemAspect / sourceAspect) + 0.5; } else { - // Image is taller - fit height, letterbox sides - scale.y = 1.0; - scale.x = sourceAspect / itemAspect; + // Image is taller than item, crop top/bottom. + imageUV.y = (qt_TexCoord0.y - 0.5) * (sourceAspect / itemAspect) + 0.5; } - - imageUV = (qt_TexCoord0 - 0.5) * scale + 0.5; } // For Stretch (0) or other modes, use qt_TexCoord0 as-is diff --git a/Shaders/qsb/rounded_image.frag.qsb b/Shaders/qsb/rounded_image.frag.qsb index a82f6550991a22735a301d015f8f899e4f0ff9a9..34d2f2560722b409c2fb47a776a4091ad9a6fb3d 100644 GIT binary patch literal 3950 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 AH2?qr