Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15dd0a94 authored by Fyodor Kyslov's avatar Fyodor Kyslov Committed by Android (Google) Code Review
Browse files

Merge "jpegrecoverymap: Return ICCProfile data from JPEG/R file"

parents 38f1769a e00916d9
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -32,6 +32,10 @@ const uint32_t kAPP2Marker = JPEG_APP0 + 2; // ICC

const std::string kXmpNameSpace = "http://ns.adobe.com/xap/1.0/";
const std::string kExifIdCode = "Exif";
constexpr uint32_t kICCMarkerHeaderSize = 14;
constexpr uint8_t kICCSig[] = {
        'I', 'C', 'C', '_', 'P', 'R', 'O', 'F', 'I', 'L', 'E', '\0',
};

struct jpegr_source_mgr : jpeg_source_mgr {
    jpegr_source_mgr(const uint8_t* ptr, int len);
@@ -336,8 +340,22 @@ bool JpegDecoder::getCompressedImageParameters(const void* image, int length,
    *pWidth = cinfo.image_width;
    *pHeight = cinfo.image_height;

    //TODO: Parse iccProfile
    (void)iccData;
    if (iccData != nullptr) {
        for (jpeg_marker_struct* marker = cinfo.marker_list; marker;
             marker = marker->next) {
            if (marker->marker != kAPP2Marker) {
                continue;
            }
            if (marker->data_length <= kICCMarkerHeaderSize ||
                memcmp(marker->data, kICCSig, sizeof(kICCSig)) != 0) {
                continue;
            }

            const unsigned int len = marker->data_length - kICCMarkerHeaderSize;
            const uint8_t *src = marker->data + kICCMarkerHeaderSize;
            iccData->insert(iccData->end(), src, src+len);
        }
    }

    if (exifData != nullptr) {
        bool exifAppears = false;