Skip to content

Commit 21a7a3b

Browse files
committed
Now performing no colour conversion when no color_transform provided
1 parent beb46c0 commit 21a7a3b

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

src/decoder.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,15 @@ impl<R: Read> Decoder<R> {
211211
} else {
212212
PreferWorkerKind::Immediate
213213
}
214-
},
214+
}
215215
}
216216
}
217217

218218
/// Tries to read metadata from the image without decoding it.
219219
///
220220
/// If successful, the metadata can be obtained using the `info` method.
221221
pub fn read_info(&mut self) -> Result<()> {
222-
WorkerScope::with(|worker| {
223-
self.decode_internal(true, worker)
224-
})
225-
.map(|_| ())
222+
WorkerScope::with(|worker| self.decode_internal(true, worker)).map(|_| ())
226223
}
227224

228225
/// Configure the decoder to scale the image during decoding.
@@ -250,9 +247,7 @@ impl<R: Read> Decoder<R> {
250247

251248
/// Decodes the image and returns the decoded pixels if successful.
252249
pub fn decode(&mut self) -> Result<Vec<u8>> {
253-
WorkerScope::with(|worker| {
254-
self.decode_internal(false, worker)
255-
})
250+
WorkerScope::with(|worker| self.decode_internal(false, worker))
256251
}
257252

258253
fn decode_internal(
@@ -415,11 +410,13 @@ impl<R: Read> Decoder<R> {
415410
}
416411
}
417412

418-
let preference = Self::select_worker(&frame, PreferWorkerKind::Multithreaded);
413+
let preference =
414+
Self::select_worker(&frame, PreferWorkerKind::Multithreaded);
419415

420-
let (marker, data) = worker_scope.get_or_init_worker(
421-
preference,
422-
|worker| self.decode_scan(&frame, &scan, worker, &finished))?;
416+
let (marker, data) = worker_scope
417+
.get_or_init_worker(preference, |worker| {
418+
self.decode_scan(&frame, &scan, worker, &finished)
419+
})?;
423420

424421
if let Some(data) = data {
425422
for (i, plane) in data
@@ -566,10 +563,9 @@ impl<R: Read> Decoder<R> {
566563
let frame = self.frame.as_ref().unwrap();
567564
let preference = Self::select_worker(&frame, PreferWorkerKind::Multithreaded);
568565

569-
worker_scope.get_or_init_worker(
570-
preference,
571-
|worker| self.decode_planes(worker, planes, planes_u16)
572-
)
566+
worker_scope.get_or_init_worker(preference, |worker| {
567+
self.decode_planes(worker, planes, planes_u16)
568+
})
573569
}
574570

575571
fn decode_planes(
@@ -1236,6 +1232,8 @@ pub(crate) fn choose_color_convert_func(
12361232
// Unknown means the data is RGB, so we don't need to perform any color conversion on it.
12371233
if color_transform == Some(AdobeColorTransform::Unknown) {
12381234
Ok(color_convert_line_rgb)
1235+
} else if color_transform.is_none() {
1236+
Ok(color_no_convert)
12391237
} else {
12401238
Ok(color_convert_line_ycbcr)
12411239
}
@@ -1247,7 +1245,7 @@ pub(crate) fn choose_color_convert_func(
12471245
Some(_) => Ok(color_convert_line_ycck),
12481246
None => {
12491247
// Assume CMYK because no APP14 marker was found
1250-
Ok(color_convert_line_cmyk)
1248+
Ok(color_no_convert)
12511249
}
12521250
}
12531251
}
@@ -1340,6 +1338,16 @@ fn color_convert_line_cmyk(data: &[Vec<u8>], output: &mut [u8]) {
13401338
}
13411339
}
13421340

1341+
fn color_no_convert(data: &[Vec<u8>], output: &mut [u8]) {
1342+
let mut output_iter = output.iter_mut();
1343+
1344+
for pixel in data {
1345+
for d in pixel {
1346+
*(output_iter.next().unwrap()) = *d;
1347+
}
1348+
}
1349+
}
1350+
13431351
const FIXED_POINT_OFFSET: i32 = 20;
13441352
const HALF: i32 = (1 << FIXED_POINT_OFFSET) / 2;
13451353

0 commit comments

Comments
 (0)