@@ -532,22 +532,24 @@ JpgInput::read_uhdr(Filesystem::IOProxy* ioproxy)
532532
533533
534534
535+ template <typename Tcmyk, typename Trgb>
535536static void
536- cmyk_to_rgb (int n, const unsigned char * cmyk, size_t cmyk_stride,
537- unsigned char * rgb, size_t rgb_stride)
537+ cmyk_to_rgb (cspan<Tcmyk> cmyk, span<Trgb> rgb)
538538{
539- for (; n; --n, cmyk += cmyk_stride, rgb += rgb_stride) {
539+ size_t n = cmyk.size () / 4 ;
540+ OIIO_ASSERT (rgb.size () == n * 3 );
541+ for (size_t i = 0 ; i < n; ++i) {
540542 // JPEG seems to store CMYK as 1-x
541- float C = convert_type<unsigned char , float >(cmyk[0 ]);
542- float M = convert_type<unsigned char , float >(cmyk[1 ]);
543- float Y = convert_type<unsigned char , float >(cmyk[2 ]);
544- float K = convert_type<unsigned char , float >(cmyk[3 ]);
545- float R = C * K;
546- float G = M * K;
547- float B = Y * K;
548- rgb[0 ] = convert_type<float , unsigned char >(R);
549- rgb[1 ] = convert_type<float , unsigned char >(G);
550- rgb[2 ] = convert_type<float , unsigned char >(B);
543+ float C = convert_type<Tcmyk , float >(cmyk[4 * i + 0 ]);
544+ float M = convert_type<Tcmyk , float >(cmyk[4 * i + 1 ]);
545+ float Y = convert_type<Tcmyk , float >(cmyk[4 * i + 2 ]);
546+ float K = convert_type<Tcmyk , float >(cmyk[4 * i + 3 ]);
547+ float R = C * K;
548+ float G = M * K;
549+ float B = Y * K;
550+ rgb[3 * i + 0 ] = convert_type<float , Trgb >(R);
551+ rgb[3 * i + 1 ] = convert_type<float , Trgb >(G);
552+ rgb[3 * i + 2 ] = convert_type<float , Trgb >(B);
551553 }
552554}
553555
@@ -682,10 +684,12 @@ JpgInput::read_native_scanlines(int subimage, int miplevel, int ybegin,
682684 }
683685 m_next_scanline = yend;
684686
685- if (m_cmyk)
686- cmyk_to_rgb (m_spec.width * nscanlines,
687- reinterpret_cast <unsigned char *>(readdata), 4 ,
688- reinterpret_cast <unsigned char *>(data.data ()), 3 );
687+ if (m_cmyk) {
688+ for (int i = 0 ; i < nscanlines; ++i)
689+ cmyk_to_rgb (make_cspan (readdata[i], m_spec.width * 4 ),
690+ span_cast<unsigned char >(data).subspan (
691+ m_spec.width * 3 * i, m_spec.width * 3 ));
692+ }
689693
690694 return true ;
691695}
0 commit comments