feat(imaging): default to pure-Rust codecs
This commit is contained in:
@@ -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" }
|
||||
|
||||
@@ -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)?)?;
|
||||
|
||||
@@ -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(),
|
||||
)
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user