mirror of
https://github.com/servo/servo.git
synced 2025-08-02 04:00:32 +01:00
Reuse the input vector in more cases of rgba8_image_to_tex_image_data
This commit is contained in:
parent
6a692228fc
commit
74e6f40abe
1 changed files with 70 additions and 56 deletions
|
@ -4025,65 +4025,78 @@ fn rgba8_image_to_tex_image_data(
|
||||||
}
|
}
|
||||||
rgb8
|
rgb8
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::Alpha, TexDataType::UnsignedByte) => {
|
(TexFormat::Alpha, TexDataType::UnsignedByte) => {
|
||||||
let mut alpha = Vec::<u8>::with_capacity(pixel_count);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = pixels[i * 4 + 3];
|
||||||
alpha.push(rgba8[3]);
|
pixels[i] = p;
|
||||||
}
|
}
|
||||||
alpha
|
pixels.truncate(pixel_count);
|
||||||
|
pixels
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::Luminance, TexDataType::UnsignedByte) => {
|
(TexFormat::Luminance, TexDataType::UnsignedByte) => {
|
||||||
let mut lum = Vec::<u8>::with_capacity(pixel_count);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = {
|
||||||
lum.push(luminance(rgba8[0], rgba8[1], rgba8[2]));
|
let rgb = &pixels[i * 4..i * 4 + 3];
|
||||||
|
luminance(rgb[0], rgb[1], rgb[2])
|
||||||
|
};
|
||||||
|
pixels[i] = p;
|
||||||
}
|
}
|
||||||
lum
|
pixels.truncate(pixel_count);
|
||||||
|
pixels
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::LuminanceAlpha, TexDataType::UnsignedByte) => {
|
(TexFormat::LuminanceAlpha, TexDataType::UnsignedByte) => {
|
||||||
let mut data = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let (lum, a) = {
|
||||||
data.push(luminance(rgba8[0], rgba8[1], rgba8[2]));
|
let rgba = &pixels[i * 4..i * 4 + 4];
|
||||||
data.push(rgba8[3]);
|
(luminance(rgba[0], rgba[1], rgba[2]), rgba[3])
|
||||||
|
};
|
||||||
|
pixels[i * 2] = lum;
|
||||||
|
pixels[i * 2 + 1] = a;
|
||||||
}
|
}
|
||||||
data
|
pixels.truncate(pixel_count * 2);
|
||||||
|
pixels
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::RGBA, TexDataType::UnsignedShort4444) => {
|
(TexFormat::RGBA, TexDataType::UnsignedShort4444) => {
|
||||||
let mut rgba4 = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = {
|
||||||
rgba4.write_u16::<NativeEndian>((rgba8[0] as u16 & 0xf0) << 8 |
|
let rgba = &pixels[i * 4..i * 4 + 4];
|
||||||
(rgba8[1] as u16 & 0xf0) << 4 |
|
(rgba[0] as u16 & 0xf0) << 8 |
|
||||||
(rgba8[2] as u16 & 0xf0) |
|
(rgba[1] as u16 & 0xf0) << 4 |
|
||||||
(rgba8[3] as u16 & 0xf0) >> 4).unwrap();
|
(rgba[2] as u16 & 0xf0) |
|
||||||
|
(rgba[3] as u16 & 0xf0) >> 4
|
||||||
|
};
|
||||||
|
NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p);
|
||||||
}
|
}
|
||||||
rgba4
|
pixels.truncate(pixel_count * 2);
|
||||||
}
|
pixels
|
||||||
|
},
|
||||||
(TexFormat::RGBA, TexDataType::UnsignedShort5551) => {
|
(TexFormat::RGBA, TexDataType::UnsignedShort5551) => {
|
||||||
let mut rgba5551 = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = {
|
||||||
rgba5551.write_u16::<NativeEndian>((rgba8[0] as u16 & 0xf8) << 8 |
|
let rgba = &pixels[i * 4..i * 4 + 4];
|
||||||
(rgba8[1] as u16 & 0xf8) << 3 |
|
(rgba[0] as u16 & 0xf8) << 8 |
|
||||||
(rgba8[2] as u16 & 0xf8) >> 2 |
|
(rgba[1] as u16 & 0xf8) << 3 |
|
||||||
(rgba8[3] as u16) >> 7).unwrap();
|
(rgba[2] as u16 & 0xf8) >> 2 |
|
||||||
|
(rgba[3] as u16) >> 7
|
||||||
|
};
|
||||||
|
NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p);
|
||||||
}
|
}
|
||||||
rgba5551
|
pixels.truncate(pixel_count * 2);
|
||||||
}
|
pixels
|
||||||
|
},
|
||||||
(TexFormat::RGB, TexDataType::UnsignedShort565) => {
|
(TexFormat::RGB, TexDataType::UnsignedShort565) => {
|
||||||
let mut rgb565 = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = {
|
||||||
rgb565.write_u16::<NativeEndian>((rgba8[0] as u16 & 0xf8) << 8 |
|
let rgb = &pixels[i * 4..i * 4 + 3];
|
||||||
(rgba8[1] as u16 & 0xfc) << 3 |
|
(rgb[0] as u16 & 0xf8) << 8 |
|
||||||
(rgba8[2] as u16 & 0xf8) >> 3).unwrap();
|
(rgb[1] as u16 & 0xfc) << 3 |
|
||||||
|
(rgb[2] as u16 & 0xf8) >> 3
|
||||||
|
};
|
||||||
|
NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p);
|
||||||
}
|
}
|
||||||
rgb565
|
pixels.truncate(pixel_count * 2);
|
||||||
}
|
pixels
|
||||||
|
},
|
||||||
|
|
||||||
(TexFormat::RGBA, TexDataType::Float) => {
|
(TexFormat::RGBA, TexDataType::Float) => {
|
||||||
let mut rgbaf32 = Vec::<u8>::with_capacity(pixel_count * 16);
|
let mut rgbaf32 = Vec::<u8>::with_capacity(pixel_count * 16);
|
||||||
for rgba8 in pixels.chunks(4) {
|
for rgba8 in pixels.chunks(4) {
|
||||||
|
@ -4151,24 +4164,25 @@ fn rgba8_image_to_tex_image_data(
|
||||||
}
|
}
|
||||||
rgbf16
|
rgbf16
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::Alpha, TexDataType::HalfFloat) => {
|
(TexFormat::Alpha, TexDataType::HalfFloat) => {
|
||||||
let mut alpha = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = f16::from_f32(pixels[i * 4 + 3] as f32).as_bits();
|
||||||
alpha.write_u16::<NativeEndian>(f16::from_f32(rgba8[3] as f32).as_bits()).unwrap();
|
NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p);
|
||||||
}
|
}
|
||||||
alpha
|
pixels.truncate(pixel_count * 2);
|
||||||
|
pixels
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::Luminance, TexDataType::HalfFloat) => {
|
(TexFormat::Luminance, TexDataType::HalfFloat) => {
|
||||||
let mut lum = Vec::<u8>::with_capacity(pixel_count * 2);
|
for i in 0..pixel_count {
|
||||||
for rgba8 in pixels.chunks(4) {
|
let p = {
|
||||||
let p = luminance(rgba8[0], rgba8[1], rgba8[2]);
|
let rgb = &pixels[i * 4..i * 4 + 3];
|
||||||
lum.write_u16::<NativeEndian>(f16::from_f32(p as f32).as_bits()).unwrap();
|
f16::from_f32(luminance(rgb[0], rgb[1], rgb[2]) as f32).as_bits()
|
||||||
|
};
|
||||||
|
NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p);
|
||||||
}
|
}
|
||||||
lum
|
pixels.truncate(pixel_count * 2);
|
||||||
|
pixels
|
||||||
},
|
},
|
||||||
|
|
||||||
(TexFormat::LuminanceAlpha, TexDataType::HalfFloat) => {
|
(TexFormat::LuminanceAlpha, TexDataType::HalfFloat) => {
|
||||||
let mut data = Vec::<u8>::with_capacity(pixel_count * 8);
|
let mut data = Vec::<u8>::with_capacity(pixel_count * 8);
|
||||||
for rgba8 in pixels.chunks(4) {
|
for rgba8 in pixels.chunks(4) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue