feat: respect the user's image_filter setting for the preset magick previewer (#3286)

This commit is contained in:
三咲雅 misaki masa 2025-10-28 00:22:57 +08:00 committed by sxyazi
parent ff5f656a31
commit 440e67164a
No known key found for this signature in database
8 changed files with 31 additions and 38 deletions

View file

@ -31,6 +31,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/):
- Port several widespread GUI keys to the input component ([#2849])
- Support invalid UTF-8 paths throughout the codebase ([#2884], [#2889], [#2890], [#2895], [#3023])
- Allow upgrading only specific packages with `ya pkg` ([#2841])
- Respect the user's `image_filter` setting for the preset `magick` previewer ([#3286])
- Allow custom mouse click behavior for individual files ([#2925])
- Display newlines in input as spaces to improve readability ([#2932])
- Fill in error messages if preview fails ([#2917])
@ -1530,3 +1531,4 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/):
[#3264]: https://github.com/sxyazi/yazi/pull/3264
[#3268]: https://github.com/sxyazi/yazi/pull/3268
[#3271]: https://github.com/sxyazi/yazi/pull/3271
[#3286]: https://github.com/sxyazi/yazi/pull/3286

22
Cargo.lock generated
View file

@ -2027,15 +2027,6 @@ dependencies = [
"which",
]
[[package]]
name = "malloc_buf"
version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
dependencies = [
"libc",
]
[[package]]
name = "matchers"
version = "0.2.0"
@ -2334,15 +2325,6 @@ dependencies = [
"libc",
]
[[package]]
name = "objc"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
dependencies = [
"malloc_buf",
]
[[package]]
name = "objc2"
version = "0.6.3"
@ -4891,7 +4873,7 @@ dependencies = [
"anyhow",
"core-foundation-sys",
"libc",
"objc",
"objc2",
"yazi-macro",
]
@ -4947,7 +4929,7 @@ dependencies = [
"foldhash 0.2.0",
"hashbrown 0.16.0",
"libc",
"objc",
"objc2",
"parking_lot",
"percent-encoding",
"regex",

View file

@ -36,7 +36,7 @@ indexmap = { version = "2.12.0", features = [ "serde" ] }
libc = "0.2.177"
lru = "0.16.2"
mlua = { version = "0.11.4", features = [ "anyhow", "async", "error-send", "lua54", "macros", "serde" ] }
objc = "0.2.7"
objc2 = "0.6.3"
ordered-float = { version = "5.1.0", features = [ "serde" ] }
parking_lot = "0.12.5"
paste = "1.0.15"

View file

@ -19,4 +19,4 @@ libc = { workspace = true }
[target.'cfg(target_os = "macos")'.dependencies]
core-foundation-sys = { workspace = true }
objc = { workspace = true }
objc2 = { workspace = true }

View file

@ -2,7 +2,7 @@ use std::{ffi::{CStr, OsStr, OsString, c_char, c_void}, mem::ManuallyDrop, os::u
use anyhow::{Result, bail};
use core_foundation_sys::{base::{CFRelease, TCFTypeRef}, dictionary::{CFDictionaryGetValueIfPresent, CFDictionaryRef}, string::CFStringRef};
use objc::{msg_send, runtime::Object, sel, sel_impl};
use objc2::{msg_send, runtime::AnyObject};
use super::cf_string::CFString;
@ -30,13 +30,13 @@ impl CFDict {
pub fn bool(&self, key: &str) -> Result<bool> {
let value = self.value(key)?;
#[allow(unexpected_cfgs)]
Ok(unsafe { msg_send![value as *const Object, boolValue] })
Ok(unsafe { msg_send![value as *const AnyObject, boolValue] })
}
pub fn integer(&self, key: &str) -> Result<i64> {
let value = self.value(key)?;
#[allow(unexpected_cfgs)]
Ok(unsafe { msg_send![value as *const Object, longLongValue] })
Ok(unsafe { msg_send![value as *const AnyObject, longLongValue] })
}
pub fn os_string(&self, key: &str) -> Result<OsString> {
@ -44,10 +44,10 @@ impl CFDict {
}
pub fn path_buf(&self, key: &str) -> Result<PathBuf> {
let url = self.value(key)? as *const Object;
let url = self.value(key)? as *const AnyObject;
#[allow(unexpected_cfgs)]
let cstr: *const c_char = unsafe {
let nss: *const Object = msg_send![url, path];
let nss: *const AnyObject = msg_send![url, path];
msg_send![nss, UTF8String]
};
Ok(OsStr::from_bytes(unsafe { CStr::from_ptr(cstr) }.to_bytes()).into())

View file

@ -38,7 +38,7 @@ windows-sys = { version = "0.61.2", features = [ "Win32_Storage_FileSystem" ] }
[target.'cfg(target_os = "macos")'.dependencies]
core-foundation-sys = { workspace = true }
objc = { workspace = true }
objc2 = { workspace = true }
[target.'cfg(not(target_os = "android"))'.dependencies]
trash = "5.2.5"

View file

@ -3,7 +3,7 @@ use std::{ffi::{CStr, CString, OsString, c_void}, mem, os::unix::{ffi::OsStringE
use anyhow::{Result, bail};
use core_foundation_sys::{array::CFArrayRef, base::{CFRelease, kCFAllocatorDefault}, runloop::{CFRunLoopGetCurrent, CFRunLoopRun, kCFRunLoopDefaultMode}};
use libc::{c_char, mach_port_t};
use objc::{msg_send, runtime::Object, sel, sel_impl};
use objc2::{msg_send, runtime::AnyObject};
use scopeguard::defer;
use tracing::error;
use yazi_ffi::{CFDict, CFString, DADiskCopyDescription, DADiskCreateFromBSDName, DARegisterDiskAppearedCallback, DARegisterDiskDescriptionChangedCallback, DARegisterDiskDisappearedCallback, DASessionCreate, DASessionScheduleWithRunLoop, IOIteratorNext, IOObjectRelease, IORegistryEntryCreateCFProperty, IOServiceGetMatchingServices, IOServiceMatching};
@ -161,7 +161,7 @@ impl Partitions {
defer! { unsafe { CFRelease(property) } };
#[allow(unexpected_cfgs)]
let cstr: *const c_char = unsafe { msg_send![property as *const Object, UTF8String] };
let cstr: *const c_char = unsafe { msg_send![property as *const AnyObject, UTF8String] };
Ok(if cstr.is_null() {
bail!("Invalid value for the name property");
} else {

View file

@ -27,17 +27,26 @@ function M:preload(job)
local cmd = M.with_limit()
if job.args.flatten then
cmd = cmd:arg("-flatten")
cmd:arg("-flatten")
end
cmd:arg { tostring(job.file.url), "-auto-orient", "-strip" }
local size = string.format("%dx%d>", rt.preview.max_width, rt.preview.max_height)
if rt.preview.image_filter == "nearest" then
cmd:arg { "-sample", size }
elseif rt.preview.image_filter == "catmull-rom" then
cmd:arg { "-filter", "catrom", "-thumbnail", size }
elseif rt.preview.image_filter == "lanczos3" then
cmd:arg { "-filter", "lanczos", "-thumbnail", size }
elseif rt.preview.image_filter == "gaussian" then
cmd:arg { "-filter", "gaussian", "-thumbnail", size }
else
cmd:arg { "-filter", "triangle", "-thumbnail", size }
end
-- stylua: ignore
cmd = cmd:arg {
tostring(job.file.url), "-auto-orient", "-strip",
"-sample", string.format("%dx%d>", rt.preview.max_width, rt.preview.max_height),
"-quality", rt.preview.image_quality,
}
cmd:arg { "-quality", rt.preview.image_quality }
if job.args.bg then
cmd = cmd:arg { "-background", job.args.bg, "-alpha", "remove" }
cmd:arg { "-background", job.args.bg, "-alpha", "remove" }
end
local status, err = cmd:arg(string.format("JPG:%s", cache)):status()