Comments (3)
I haven't been entirely happy with the API myself either, but haven't had the time to properly think about what I would prefer it to look like. One major issue is that it requires expanding everything to be RGBA and will always decompress to RGBA, which adds unnecessary overhead as noted in the integration discussion over at the image crate. I was hoping to get some feedback from them about what kind of API they would prefer.
from texpresso.
I looked into the current implementation of the DXT module in the image crate and propose to add the following function for decoding:
#[non_exhaustive]
pub enum TodoError {
/// The input for decoding or encoding did not meet the requirements for the variant.
InvalidInputSize(usize),
/// The output buffer for encoding or decoding did not meet the requirements for the variant.
InvalidOutputSize(usize),
// ...
}
impl Format {
fn decompress(
self,
data: &[u8],
width: usize,
height: usize,
output: &mut [u8],
) -> Result<(), TodoError>;
}
I am still unsure about the Error type, but this is probably the easiest solution.
For integration into the image crate, the current read_scanline
could be modified to use the aforementioned function instead (with a height of 4). And maybe squish::Format
could be used as a replacement for image::DxtVariant
.
I would also suggest adding #[non_exhaustive]
to squish::Format
if a future version adds more formats.
I did not look into the encoding details yet, but it should be very similar.
One major issue is that it requires expanding everything to be RGBA and will always decompress to RGBA
I think this should just be changed to properly output with the correct byte stride for the format. The function decompressed_bytes_per_pixel(self) -> usize
(or something similar; e.g. 3 for BC1) should be added to squish::Format
.
This is the requirement to make the method of integration of above possible. This is possibly the most work, as it requires changing decompress_block
and compress_block_masked
. It would propose to make these two functions private for any new versions. External users can always use the decompress
and compress
functions with sizes of 4×4.
With your blessing, my next steps would be to first
- Implement the Error type and add it to the
decompress
function - Add checks for the most obvious invalid parameter combinations
- Create a simple fuzzing setup with
cargo fuzz
for decompression
Then I would try to switch from RGBA only modes to their proper ones (RGB, RGBA, RG, R).
from texpresso.
Sure, go ahead. It is probably easiest to evaluate the options by seeing what they would look like in practice anyway.
I also plan to add a Bc1Alpha variant since OpenGL has two separate constants for DXT1 with and without transparency and are probably some gains to be had from being able to use the implicit black value in the palette. I just haven't got to actually doing that optimization in the encoder yet. If you are reworking the channel modes from RGBA-only it might make sense to add that format variant and just stub it out with unimplemented!() for now.
from texpresso.
Related Issues (6)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from texpresso.