@@ -211,18 +211,15 @@ impl<R: Read> Decoder<R> {
211
211
} else {
212
212
PreferWorkerKind :: Immediate
213
213
}
214
- } ,
214
+ }
215
215
}
216
216
}
217
217
218
218
/// Tries to read metadata from the image without decoding it.
219
219
///
220
220
/// If successful, the metadata can be obtained using the `info` method.
221
221
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 ( |_| ( ) )
226
223
}
227
224
228
225
/// Configure the decoder to scale the image during decoding.
@@ -250,9 +247,7 @@ impl<R: Read> Decoder<R> {
250
247
251
248
/// Decodes the image and returns the decoded pixels if successful.
252
249
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) )
256
251
}
257
252
258
253
fn decode_internal (
@@ -415,11 +410,13 @@ impl<R: Read> Decoder<R> {
415
410
}
416
411
}
417
412
418
- let preference = Self :: select_worker ( & frame, PreferWorkerKind :: Multithreaded ) ;
413
+ let preference =
414
+ Self :: select_worker ( & frame, PreferWorkerKind :: Multithreaded ) ;
419
415
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
+ } ) ?;
423
420
424
421
if let Some ( data) = data {
425
422
for ( i, plane) in data
@@ -566,10 +563,9 @@ impl<R: Read> Decoder<R> {
566
563
let frame = self . frame . as_ref ( ) . unwrap ( ) ;
567
564
let preference = Self :: select_worker ( & frame, PreferWorkerKind :: Multithreaded ) ;
568
565
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
+ } )
573
569
}
574
570
575
571
fn decode_planes (
@@ -1236,6 +1232,8 @@ pub(crate) fn choose_color_convert_func(
1236
1232
// Unknown means the data is RGB, so we don't need to perform any color conversion on it.
1237
1233
if color_transform == Some ( AdobeColorTransform :: Unknown ) {
1238
1234
Ok ( color_convert_line_rgb)
1235
+ } else if color_transform. is_none ( ) {
1236
+ Ok ( color_no_convert)
1239
1237
} else {
1240
1238
Ok ( color_convert_line_ycbcr)
1241
1239
}
@@ -1247,7 +1245,7 @@ pub(crate) fn choose_color_convert_func(
1247
1245
Some ( _) => Ok ( color_convert_line_ycck) ,
1248
1246
None => {
1249
1247
// Assume CMYK because no APP14 marker was found
1250
- Ok ( color_convert_line_cmyk )
1248
+ Ok ( color_no_convert )
1251
1249
}
1252
1250
}
1253
1251
}
@@ -1340,6 +1338,16 @@ fn color_convert_line_cmyk(data: &[Vec<u8>], output: &mut [u8]) {
1340
1338
}
1341
1339
}
1342
1340
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
+
1343
1351
const FIXED_POINT_OFFSET : i32 = 20 ;
1344
1352
const HALF : i32 = ( 1 << FIXED_POINT_OFFSET ) / 2 ;
1345
1353
0 commit comments