Skip to content

Commit e02b7e3

Browse files
authoredMar 26, 2024··
fix: JPEG tag should have size 0 (#47)
1 parent 5dadc1e commit e02b7e3

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed
 

‎src/vpx/biff.rs

+10
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ impl<'a> BiffReader<'a> {
8989
&self.data[p..p + count]
9090
}
9191

92+
pub fn remaining_in_record(&mut self) -> usize {
93+
self.bytes_in_record_remaining
94+
}
95+
9296
pub fn get_bool(&mut self) -> bool {
9397
let all = &self.data[self.pos..self.pos + 4];
9498
// Any other value is suspicious as it is not a boolean
@@ -733,6 +737,12 @@ impl BiffWriter {
733737
self.end_tag();
734738
}
735739

740+
pub fn write_tagged_data_without_size(&mut self, tag: &str, value: &[u8]) {
741+
self.new_tag(tag);
742+
self.write_data(value);
743+
self.end_tag_no_size();
744+
}
745+
736746
pub fn write_tagged<T: BiffWrite>(&mut self, tag: &str, value: &T) {
737747
self.new_tag(tag);
738748
BiffWrite::biff_write(value, self);

‎src/vpx/image.rs

+37-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ fn write(data: &ImageData, writer: &mut BiffWriter) {
288288
}
289289
if let Some(jpeg) = &data.jpeg {
290290
let bits = write_jpg(jpeg);
291-
writer.write_tagged_data("JPEG", &bits);
291+
writer.write_tagged_data_without_size("JPEG", &bits);
292292
}
293293
writer.write_tagged_f32("ALTV", data.alpha_test_value);
294294
if let Some(is_opaque) = data.is_opaque {
@@ -383,6 +383,42 @@ mod test {
383383
assert_eq!(read, img);
384384
}
385385

386+
#[test]
387+
fn test_write_jpeg_should_have_tag_size_zero() {
388+
let image: ImageData = ImageData {
389+
name: "name_value".to_string(),
390+
internal_name: Some("inme_value".to_string()),
391+
path: "path_value".to_string(),
392+
width: 1,
393+
height: 2,
394+
link: None,
395+
alpha_test_value: 1.0,
396+
is_opaque: Some(true),
397+
is_signed: Some(false),
398+
jpeg: Some(ImageDataJpeg {
399+
path: "path_value".to_string(),
400+
name: "name_value".to_string(),
401+
internal_name: Some("inme_value".to_string()),
402+
// alpha_test_value: 1.0,
403+
data: vec![1, 2, 3],
404+
}),
405+
bits: None,
406+
};
407+
408+
let mut writer = BiffWriter::new();
409+
ImageData::biff_write(&image, &mut writer);
410+
let data = writer.get_data();
411+
let mut reader = BiffReader::new(&data);
412+
reader.next(false); // NAME
413+
reader.next(false); // INME
414+
reader.next(false); // PATH
415+
reader.next(false); // WDTH
416+
reader.next(false); // HGHT
417+
reader.next(false); // LINK
418+
assert_eq!(reader.tag().as_str(), "JPEG");
419+
assert_eq!(reader.remaining_in_record(), 0);
420+
}
421+
386422
#[test]
387423
fn test_write_read() {
388424
let image: ImageData = ImageData {

‎tests/common/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ fn biff_tags_and_hashes(reader: &mut BiffReader) -> Vec<(String, usize, u64)> {
162162
let _name = reader.get_str_no_remaining_update(name_len as usize);
163163
}
164164
"JPEG" => {
165-
tags.push(("--JPEG--SUB--BEGIN--".to_string(), 0, 0));
165+
let remaining = reader.remaining_in_record();
166+
tags.push(("--JPEG--SUB--BEGIN--".to_string(), remaining, 0));
166167
let mut sub_reader = reader.child_reader();
167168
while let Some(tag) = &sub_reader.next(true) {
168169
let data = sub_reader.get_record_data(false);

0 commit comments

Comments
 (0)
Please sign in to comment.