feat(imaging): default to pure-Rust codecs
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m51s
CI / required (push) Failing after 3m23s

This commit is contained in:
2026-08-13 11:24:38 +00:00
parent e16ad04dbd
commit 25fdffbd3b
25 changed files with 124 additions and 103 deletions

View File

@@ -10,9 +10,9 @@ publish = false
[dependencies]
clap = { version = "4.5", features = ["derive"] }
libremetaverse = { version = "0.0.1", path = "../crates/libremetaverse", default-features = false }
libremetaverse-imaging = { version = "0.0.1", path = "../crates/libremetaverse-imaging", features = ["jpeg2000"] }
libremetaverse-imaging-skia = { version = "0.0.1", path = "../crates/libremetaverse-imaging-skia", features = ["skia"] }
libremetaverse = { version = "0.0.1", path = "../crates/libremetaverse" }
libremetaverse-imaging = { version = "0.0.1", path = "../crates/libremetaverse-imaging" }
libremetaverse-imaging-skia = { version = "0.0.1", path = "../crates/libremetaverse-imaging-skia" }
libremetaverse-structured-data = { version = "0.0.1", path = "../crates/libremetaverse-structured-data" }
libremetaverse-voice-vivox = { version = "0.0.1", path = "../crates/libremetaverse-voice-vivox" }
libremetaverse-voice-webrtc = { version = "0.0.1", path = "../crates/libremetaverse-voice-webrtc" }

View File

@@ -14,10 +14,10 @@ use libremetaverse::types::compat::CancellationToken;
use libremetaverse::types::{AssetType, FolderType, InventoryType, UUID};
use libremetaverse::{PermissionMask, Permissions};
use libremetaverse_imaging::{
J2kCodec, J2kCompression, J2kDecodeOptions, J2kEncodeOptions, ManagedImage,
ManagedImageImageChannels,
J2kCompression, J2kDecodeOptions, J2kEncodeOptions, ManagedImage, ManagedImageImageChannels,
RustJ2kCodec,
};
use libremetaverse_imaging_skia::SkiaTextureCodec;
use libremetaverse_imaging_skia::RustSkiaTextureCodec;
use std::collections::{HashMap, HashSet};
use std::fs::{self, File};
use std::io::{Cursor, Read, Write};
@@ -1465,14 +1465,14 @@ fn image_to_j2k(path: &Path) -> Result<Vec<u8>, String> {
.unwrap_or("")
.to_ascii_lowercase();
if matches!(extension.as_str(), "jp2" | "j2c" | "j2k") {
J2kCodec::decode_bytes(&bytes, J2kDecodeOptions::default())
RustJ2kCodec::decode_bytes(&bytes, J2kDecodeOptions::default())
.map_err(|_| "Invalid JPEG 2000 image".to_owned())?;
return Ok(bytes);
}
let mut image = if matches!(extension.as_str(), "tga" | "targa") {
decode_tga(&bytes)?
} else {
SkiaTextureCodec::new()
RustSkiaTextureCodec::new()
.map_err(|_| "Could not initialize the image decoder".to_owned())?
.decode(Box::new(Cursor::new(bytes)))
.map_err(|_| "Failed to decode image".to_owned())?
@@ -1491,7 +1491,7 @@ fn image_to_j2k(path: &Path) -> Result<Vec<u8>, String> {
.resize_bilinear(width.min(1024), height.min(1024))
.map_err(|_| "Failed to limit image dimensions".to_owned())?;
}
J2kCodec::encode(
RustJ2kCodec::encode(
&image,
J2kEncodeOptions::default().with_compression(J2kCompression::Lossy {
compression_ratio: 10.0,
@@ -1583,7 +1583,7 @@ async fn dump_outfit<B: Backend + ?Sized>(
.await?;
let jp2 = directory.join(format!("{texture_id}.jp2"));
write_bounded(&jp2, &bytes)?;
let image = J2kCodec::decode_bytes(&bytes, J2kDecodeOptions::default())
let image = RustJ2kCodec::decode_bytes(&bytes, J2kDecodeOptions::default())
.map_err(|_| format!("Failed to decode outfit texture {texture_id}"))?;
let tga = directory.join(format!("{texture_id}.tga"));
write_bounded(&tga, &encode_tga(&image)?)?;

View File

@@ -1466,7 +1466,7 @@ async fn download_texture<B: Backend + ?Sized>(
.as_str(),
)?;
write_bounded(&path, &data)?;
let dimensions = libremetaverse_imaging::J2kCodec::decode_bytes(
let dimensions = libremetaverse_imaging::RustJ2kCodec::decode_bytes(
&data,
libremetaverse_imaging::J2kDecodeOptions::default(),
)
@@ -1574,7 +1574,7 @@ async fn export<B: Backend + ?Sized>(
.await?;
let path = texture_directory.join(format!("{texture}.jp2"));
write_bounded(&path, &data)?;
let image = libremetaverse_imaging::J2kCodec::decode_bytes(
let image = libremetaverse_imaging::RustJ2kCodec::decode_bytes(
&data,
libremetaverse_imaging::J2kDecodeOptions::default(),
)

View File

@@ -1,4 +1,6 @@
use libremetaverse_imaging::{J2kCodec, J2kEncodeOptions, ManagedImage, ManagedImageImageChannels};
use libremetaverse_imaging::{
J2kEncodeOptions, ManagedImage, ManagedImageImageChannels, RustJ2kCodec,
};
use std::fs;
use std::path::{Path, PathBuf};
use std::process::{Command, Output, Stdio};
@@ -111,7 +113,7 @@ fn one_pixel_jp2() -> Vec<u8> {
image.red[0] = 10;
image.green[0] = 20;
image.blue[0] = 30;
J2kCodec::encode(&image, J2kEncodeOptions::default()).expect("encode JPEG2000 fixture")
RustJ2kCodec::encode(&image, J2kEncodeOptions::default()).expect("encode JPEG2000 fixture")
}
fn one_pixel_tga() -> Vec<u8> {
@@ -277,7 +279,7 @@ fn fake_grid_exercises_every_owned_inventory_appearance_and_asset_command() {
b"default { state_entry() {} }"
);
assert_eq!(
J2kCodec::decode_bytes(
RustJ2kCodec::decode_bytes(
&fs::read(outfit.join(format!("{UPLOADED_TEXTURE_ASSET}.jp2")))
.expect("uploaded outfit jp2"),
libremetaverse_imaging::J2kDecodeOptions::default(),

View File

@@ -1,4 +1,6 @@
use libremetaverse_imaging::{J2kCodec, J2kEncodeOptions, ManagedImage, ManagedImageImageChannels};
use libremetaverse_imaging::{
J2kEncodeOptions, ManagedImage, ManagedImageImageChannels, RustJ2kCodec,
};
use std::fs;
use std::path::{Path, PathBuf};
use std::process::{Command, Output, Stdio};
@@ -85,7 +87,7 @@ fn one_pixel_jp2() -> Vec<u8> {
image.red[0] = 10;
image.green[0] = 20;
image.blue[0] = 30;
J2kCodec::encode(&image, J2kEncodeOptions::default()).expect("encode JPEG2000")
RustJ2kCodec::encode(&image, J2kEncodeOptions::default()).expect("encode JPEG2000")
}
#[test]