From 5e393f205207f17e5b3f067ba4431dd5acabf662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 11:35:59 +0100 Subject: [PATCH 001/100] Fix CR3 decoding on big endian platforms and some warnings from cppcheck --- rtengine/canon_cr3_decoder.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 359243ed5..f10a7c083 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -17,6 +17,7 @@ */ #include + #include "dcraw.h" #ifdef __GNUC__ // silence warning #pragma GCC diagnostic push @@ -587,7 +588,7 @@ fin: #undef _min #undef _constrain #endif -#define _abs(x) (((x) ^ ((int32_t)(x) >> 31)) - ((int32_t)(x) >> 31)) +#define _abs(x) ((x) < 0 ? -(x) : (x)) #define _min(a, b) ((a) < (b) ? (a) : (b)) #define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) @@ -622,7 +623,14 @@ libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } -#define _byteswap_ulong(x) __builtin_bswap32(x) +uint32_t _byteswap_ulong(uint32_t x) +{ + #if BYTE_ORDER == BIG_ENDIAN + return x; + #else + return __builtin_bswap32(x); + #endif +} #endif @@ -1041,7 +1049,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code >> 31) + sym; + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; if (doCode) { From f42efdb2e0b6f76149f3a08fd53835b480755773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 14:58:46 +0100 Subject: [PATCH 002/100] Use better endianness check (by @heckflosse) --- rtengine/canon_cr3_decoder.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f10a7c083..248cdd294 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -625,11 +625,11 @@ libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) } uint32_t _byteswap_ulong(uint32_t x) { - #if BYTE_ORDER == BIG_ENDIAN - return x; - #else - return __builtin_bswap32(x); - #endif +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + return x; +#else + return __builtin_bswap32(x); +#endif } #endif From 6039f1e3001bcd106d141d6fa9e68f3371e74148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 15:52:25 +0100 Subject: [PATCH 003/100] Tackle warnings --- rtengine/canon_cr3_decoder.cc | 102 +++++++++++++++++++--------------- rtengine/dcraw.h | 8 +-- 2 files changed, 61 insertions(+), 49 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 248cdd294..e945a4ab8 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -1,4 +1,24 @@ -/* -*- C++ -*- +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 RawTherapee development team + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +// Code adapted from ART +/* * * This file is part of ART. * @@ -16,16 +36,6 @@ * along with ART. If not, see . */ -#include - -#include "dcraw.h" -#ifdef __GNUC__ // silence warning -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wunused-variable" -#pragma GCC diagnostic ignored "-Wunused-but-set-variable" -#endif - // Code adapted from libraw /* -*- C++ -*- * Copyright 2019 LibRaw LLC (info@libraw.org) @@ -41,13 +51,17 @@ */ +#include +#include + +#include "dcraw.h" void DCraw::parse_canon_cr3() { int err; unsigned long long szAtomList; short nesting = -1; - short nTrack = -1; + unsigned short nTrack = 0; short TrackType; char AtomNameStack[128]; strcpy(make, "Canon"); @@ -61,14 +75,14 @@ void DCraw::parse_canon_cr3() #define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT -void DCraw::selectCRXTrack(short maxTrack) +void DCraw::selectCRXTrack(unsigned short maxTrack) { if (maxTrack < 0) return; INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; uint32_t maxjpegbytes = 0; memset(bitcounts, 0, sizeof(bitcounts)); - for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[i]; if (d->MediaType == 1) // RAW @@ -89,18 +103,21 @@ void DCraw::selectCRXTrack(short maxTrack) } if (maxbitcount < 8) return; - int framei = -1, framecnt = 0; - for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + bool has_framei = false; + unsigned int framei = 0, framecnt = 0; + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { if (bitcounts[i] == maxbitcount) { - if (framecnt <= shot_select) + if (framecnt <= shot_select) { + has_framei = true; framei = i; + } framecnt++; } } is_raw = framecnt; - if (framei >= 0 && framei < LIBRAW_CRXTRACKS_MAXCOUNT) + if (has_framei && framei < LIBRAW_CRXTRACKS_MAXCOUNT) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[framei]; @@ -129,7 +146,7 @@ void DCraw::selectCRXTrack(short maxTrack) int tiff_idx = -1; INT64 tpixels = 0; - for (int i = 0; i < tiff_nifds; i++) + for (unsigned int i = 0; i < tiff_nifds; i++) if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); @@ -147,7 +164,7 @@ void DCraw::selectCRXTrack(short maxTrack) (get4() != 0x00000008)) int DCraw::parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, - char *AtomNameStack, short &nTrack, short &TrackType) + char *AtomNameStack, unsigned short &nTrack, short &TrackType) { /* Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name @@ -159,8 +176,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, */ const char UIID_Canon[17] = "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; - const char UIID_Preview[17] = - "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; +// const char UIID_Preview[17] = +// "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; /* AtomType = 0 - unknown: "unk." @@ -168,7 +185,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, AtomType = 2 - leaf atom: "leaf" AtomType = 3 - can be container, can be leaf: "both" */ - const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; +// const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; short AtomType; static const struct { @@ -256,7 +273,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; - int c, err = 0; + unsigned int c; + int err = 0; ushort tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name @@ -268,14 +286,14 @@ int DCraw::parseCR3(unsigned long long oAtomList, char UIID[16]; uchar CMP1[36]; char HandlerType[5], MediaFormatID[5]; - unsigned ImageWidth, ImageHeight; +// unsigned ImageWidth, ImageHeight; long relpos_inDir, relpos_inBox; unsigned szItem, Tag, lTag; ushort tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; strcpy(HandlerType, sHandlerType[0]); - ImageWidth = ImageHeight = 0U; +// ImageWidth = ImageHeight = 0U; oAtom = oAtomList; nesting++; if (nesting > 31) @@ -450,8 +468,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, } #define current_track RT_canon_CR3_data.crx_header[nTrack] - ImageWidth = get2(); - ImageHeight = get2(); +// ImageWidth = get2(); +// ImageHeight = get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { @@ -813,7 +831,7 @@ static inline void crxFillBuffer(CrxBitstream *bitStrm) libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) { - uint32_t bitData = bitStrm->bitData; +// uint32_t bitData = bitStrm->bitData; uint32_t nonZeroBit = 0; uint64_t nextData = 0; int32_t result = 0; @@ -2049,7 +2067,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } - if (wavelet->curLine >= wavelet->height - 3 && wavelet->height & 1) + if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) { wavelet->curH += 3; wavelet->curLine += 3; @@ -2644,10 +2662,9 @@ int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, if (!img->subbandCount) return 0; - int32_t curSubband = 0; int32_t subbandOffset = 0; band = comp->subBands; - for (int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) + for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { if (*mdatSize < 0xC) return -1; @@ -2683,7 +2700,7 @@ int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, uint32_t mdatSize) { - int nTiles = img->tileRows * img->tileCols; + unsigned int nTiles = img->tileRows * img->tileCols; if (!nTiles) return -1; @@ -2702,7 +2719,7 @@ int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); - for (int curTile = 0; curTile < nTiles; curTile++, tile++) + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags tile->tileNumber = curTile; @@ -2780,7 +2797,7 @@ int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, uint8_t *dataPtr = mdatPtr; CrxTile *tile = img->tiles; - for (int curTile = 0; curTile < nTiles; curTile++, tile++) + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { if (dataSize < 0xC) return -1; @@ -2997,8 +3014,7 @@ void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) void DCraw::crxLoadRaw() { CrxImage img; - if (RT_canon_CR3_data.crx_track_selected < 0 || - RT_canon_CR3_data.crx_track_selected >= + if (RT_canon_CR3_data.crx_track_selected >= LIBRAW_CRXTRACKS_MAXCOUNT) derror(); crx_data_header_t hdr = @@ -3052,9 +3068,9 @@ void DCraw::crxLoadRaw() crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) +int DCraw::crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack) { - if (nTrack < 0 || nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) return -1; if (!cmp1TagData) return -1; @@ -3099,8 +3115,8 @@ int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) if (hdr->nBits != 8) return -1; } - else if (hdr->nPlanes != 4 || hdr->f_width & 1 || hdr->f_height & 1 || - hdr->tileWidth & 1 || hdr->tileHeight & 1 || hdr->cfaLayout > 3u || + else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || + (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || hdr->nBits == 8) return -1; @@ -3118,7 +3134,3 @@ int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) #undef _constrain #undef libraw_inline #undef LIBRAW_CRXTRACKS_MAXCOUNT - -#ifdef __GNUC__ // silence warning -#pragma GCC diagnostic pop -#endif diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 75570b065..5b91d7e8b 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -188,7 +188,7 @@ public: }; static constexpr size_t CRXTRACKS_MAXCOUNT = 16; crx_data_header_t crx_header[CRXTRACKS_MAXCOUNT]; - int crx_track_selected; + unsigned int crx_track_selected; short CR3_CTMDtag; }; protected: @@ -562,16 +562,16 @@ void nikon_14bit_load_raw(); // ported from LibRaw // Canon CR3 support ported from LibRaw //----------------------------------------------------------------------------- void parse_canon_cr3(); -void selectCRXTrack(short maxTrack); +void selectCRXTrack(unsigned short maxTrack); int parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, - char *AtomNameStack, short &nTrack, short &TrackType); + char *AtomNameStack, unsigned short &nTrack, short &TrackType); int crxDecodePlane(void *p, uint32_t planeNumber); void crxLoadDecodeLoop(void *img, int nPlanes); void crxConvertPlaneLineDf(void *p, int imageRow); void crxLoadFinalizeLoopE3(void *p, int planeHeight); void crxLoadRaw(); -int crxParseImageHeader(uchar *cmp1TagData, int nTrack); +int crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); //----------------------------------------------------------------------------- }; From fb01435e3f65eff5a52642d5131f9159eff21df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 16:05:24 +0100 Subject: [PATCH 004/100] Consider side effects of `get2()` --- rtengine/canon_cr3_decoder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index e945a4ab8..b69821280 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -468,8 +468,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, } #define current_track RT_canon_CR3_data.crx_header[nTrack] -// ImageWidth = get2(); -// ImageHeight = get2(); + /*ImageWidth = */get2(); + /*ImageHeight = */get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { From d986a56c50d008372e7fac565a94a81c7a07c19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Nov 2019 08:48:33 +0100 Subject: [PATCH 005/100] Fix LGTM warnings --- rtengine/canon_cr3_decoder.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index b69821280..b616a2b42 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -68,8 +68,7 @@ void DCraw::parse_canon_cr3() szAtomList = ifp->size; err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); - if ((err == 0 || err == -14) && - nTrack >= 0) // no error, or too deep nesting + if (err == 0 || err == -14) // no error, or too deep nesting selectCRXTrack(nTrack); } @@ -77,8 +76,6 @@ void DCraw::parse_canon_cr3() void DCraw::selectCRXTrack(unsigned short maxTrack) { - if (maxTrack < 0) - return; INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; uint32_t maxjpegbytes = 0; memset(bitcounts, 0, sizeof(bitcounts)); @@ -117,7 +114,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } } is_raw = framecnt; - if (has_framei && framei < LIBRAW_CRXTRACKS_MAXCOUNT) + if (has_framei) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[framei]; From 319ed6cdd5ac3dbcf5c5b2c7165652a55a34b4e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Nov 2019 09:57:29 +0100 Subject: [PATCH 006/100] Style with uncrustify, astyle, and clang-tidy --- rtengine/canon_cr3_decoder.cc | 5543 +++++++++++++++++---------------- 1 file changed, 2828 insertions(+), 2715 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index b616a2b42..01bca72f8 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -19,7 +19,7 @@ // Code adapted from ART /* - * + * * This file is part of ART. * * ART is free software: you can redistribute it and/or modify @@ -68,535 +68,530 @@ void DCraw::parse_canon_cr3() szAtomList = ifp->size; err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); - if (err == 0 || err == -14) // no error, or too deep nesting + + if (err == 0 || err == -14) { // no error, or too deep nesting selectCRXTrack(nTrack); + } } #define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT void DCraw::selectCRXTrack(unsigned short maxTrack) { - INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; - uint32_t maxjpegbytes = 0; - memset(bitcounts, 0, sizeof(bitcounts)); - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) - { - CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[i]; - if (d->MediaType == 1) // RAW - { - bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); - if (bitcounts[i] > maxbitcount) - maxbitcount = bitcounts[i]; - } - else if (d->MediaType == 2) // JPEG - { - if (d->MediaSize > maxjpegbytes) - { - maxjpegbytes = d->MediaSize; - thumb_offset = d->MediaOffset; - thumb_length = d->MediaSize; - } - } - } - if (maxbitcount < 8) - return; - bool has_framei = false; - unsigned int framei = 0, framecnt = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) - { - if (bitcounts[i] == maxbitcount) - { - if (framecnt <= shot_select) { - has_framei = true; - framei = i; - } - framecnt++; - } - } - is_raw = framecnt; - if (has_framei) - { - CanonCR3Data::crx_data_header_t *d = - &RT_canon_CR3_data.crx_header[framei]; - data_offset = d->MediaOffset; - //data_size = d->MediaSize; - raw_width = d->f_width; - raw_height = d->f_height; - load_raw = &DCraw::crxLoadRaw; - switch (d->cfaLayout) - { - case 0: - filters = 0x94949494; - break; - case 1: - filters = 0x61616161; - break; - case 2: - filters = 0x49494949; - break; - case 3: - filters = 0x16161616; - break; + INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; + uint32_t maxjpegbytes = 0; + memset(bitcounts, 0, sizeof(bitcounts)); + + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + CanonCR3Data::crx_data_header_t* d = &RT_canon_CR3_data.crx_header[i]; + + if (d->MediaType == 1) {// RAW + bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + + if (bitcounts[i] > maxbitcount) { + maxbitcount = bitcounts[i]; + } + } else if (d->MediaType == 2) {// JPEG + if (d->MediaSize > maxjpegbytes) { + maxjpegbytes = d->MediaSize; + thumb_offset = d->MediaOffset; + thumb_length = d->MediaSize; + } + } } - RT_canon_CR3_data.crx_track_selected = framei; + if (maxbitcount < 8) { + return; + } - int tiff_idx = -1; - INT64 tpixels = 0; - for (unsigned int i = 0; i < tiff_nifds; i++) - if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) - { - tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); - tiff_idx = i; - } - if (tiff_idx >= 0) - flip = tiff_ifd[tiff_idx].flip; - } + bool has_framei = false; + unsigned int framei = 0, framecnt = 0; + + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + if (bitcounts[i] == maxbitcount) { + if (framecnt <= shot_select) { + has_framei = true; + framei = i; + } + + framecnt++; + } + } + + is_raw = framecnt; + + if (has_framei) { + CanonCR3Data::crx_data_header_t* d = + &RT_canon_CR3_data.crx_header[framei]; + data_offset = d->MediaOffset; + // data_size = d->MediaSize; + raw_width = d->f_width; + raw_height = d->f_height; + load_raw = &DCraw::crxLoadRaw; + + switch (d->cfaLayout) { + case 0: { + filters = 0x94949494; + break; + } + + case 1: { + filters = 0x61616161; + break; + } + + case 2: { + filters = 0x49494949; + break; + } + + case 3: { + filters = 0x16161616; + break; + } + } + + RT_canon_CR3_data.crx_track_selected = framei; + + int tiff_idx = -1; + INT64 tpixels = 0; + + for (unsigned int i = 0; i < tiff_nifds; i++) { + if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { + tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); + tiff_idx = i; + } + } + + if (tiff_idx >= 0) { + flip = tiff_ifd[tiff_idx].flip; + } + } } -#define FORC4 for (c=0; c < 4; c++) +#define FORC4 for (c = 0; c < 4; c++) #define bad_hdr \ - (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ - (get4() != 0x00000008)) + (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ + (get4() != 0x00000008)) int DCraw::parseCR3(unsigned long long oAtomList, - unsigned long long szAtomList, short &nesting, - char *AtomNameStack, unsigned short &nTrack, short &TrackType) + unsigned long long szAtomList, short& nesting, + char* AtomNameStack, unsigned short& nTrack, short& TrackType) { - /* - Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name - Atom size includes the length of the header and the size of all "contained" - Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located - after the Atom name if Atom size == 0, it is the last top-level Atom extending - to the end of the file Atom name is often a 4 symbol mnemonic, but can be a - 4-byte integer - */ - const char UIID_Canon[17] = - "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; + /* + Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name + Atom size includes the length of the header and the size of all "contained" + Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located + after the Atom name if Atom size == 0, it is the last top-level Atom extending + to the end of the file Atom name is often a 4 symbol mnemonic, but can be a + 4-byte integer + */ + const char UIID_Canon[17] = + "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; // const char UIID_Preview[17] = // "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; - /* - AtomType = 0 - unknown: "unk." - AtomType = 1 - container atom: "cont" - AtomType = 2 - leaf atom: "leaf" - AtomType = 3 - can be container, can be leaf: "both" - */ + /* + AtomType = 0 - unknown: "unk." + AtomType = 1 - container atom: "cont" + AtomType = 2 - leaf atom: "leaf" + AtomType = 3 - can be container, can be leaf: "both" + */ // const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; - short AtomType; - static const struct - { - char AtomName[5]; short AtomType; - } AtomNamesList[] = { - {"dinf", 1}, - {"edts", 1}, - {"fiin", 1}, - {"ipro", 1}, - {"iprp", 1}, - {"mdia", 1}, - {"meco", 1}, - {"mere", 1}, - {"mfra", 1}, - {"minf", 1}, - {"moof", 1}, - {"moov", 1}, - {"mvex", 1}, - {"paen", 1}, - {"schi", 1}, - {"sinf", 1}, - {"skip", 1}, - {"stbl", 1}, - {"stsd", 1}, - {"strk", 1}, - {"tapt", 1}, - {"traf", 1}, - {"trak", 1}, + static const struct { + char AtomName[5]; + short AtomType; + } AtomNamesList[] = { + {"dinf", 1}, + {"edts", 1}, + {"fiin", 1}, + {"ipro", 1}, + {"iprp", 1}, + {"mdia", 1}, + {"meco", 1}, + {"mere", 1}, + {"mfra", 1}, + {"minf", 1}, + {"moof", 1}, + {"moov", 1}, + {"mvex", 1}, + {"paen", 1}, + {"schi", 1}, + {"sinf", 1}, + {"skip", 1}, + {"stbl", 1}, + {"stsd", 1}, + {"strk", 1}, + {"tapt", 1}, + {"traf", 1}, + {"trak", 1}, - {"cdsc", 2}, - {"colr", 2}, - {"dimg", 2}, - // {"dref", 2}, - {"free", 2}, - {"frma", 2}, - {"ftyp", 2}, - {"hdlr", 2}, - {"hvcC", 2}, - {"iinf", 2}, - {"iloc", 2}, - {"infe", 2}, - {"ipco", 2}, - {"ipma", 2}, - {"iref", 2}, - {"irot", 2}, - {"ispe", 2}, - {"meta", 2}, - {"mvhd", 2}, - {"pitm", 2}, - {"pixi", 2}, - {"schm", 2}, - {"thmb", 2}, - {"tkhd", 2}, - {"url ", 2}, - {"urn ", 2}, + {"cdsc", 2}, + {"colr", 2}, + {"dimg", 2}, + // {"dref", 2}, + {"free", 2}, + {"frma", 2}, + {"ftyp", 2}, + {"hdlr", 2}, + {"hvcC", 2}, + {"iinf", 2}, + {"iloc", 2}, + {"infe", 2}, + {"ipco", 2}, + {"ipma", 2}, + {"iref", 2}, + {"irot", 2}, + {"ispe", 2}, + {"meta", 2}, + {"mvhd", 2}, + {"pitm", 2}, + {"pixi", 2}, + {"schm", 2}, + {"thmb", 2}, + {"tkhd", 2}, + {"url ", 2}, + {"urn ", 2}, - {"CCTP", 1}, - {"CRAW", 1}, + {"CCTP", 1}, + {"CRAW", 1}, - {"JPEG", 2}, - {"CDI1", 2}, - {"CMP1", 2}, + {"JPEG", 2}, + {"CDI1", 2}, + {"CMP1", 2}, - {"CNCV", 2}, - {"CCDT", 2}, - {"CTBO", 2}, - {"CMT1", 2}, - {"CMT2", 2}, - {"CMT3", 2}, - {"CMT4", 2}, - {"THMB", 2}, - {"co64", 2}, - {"mdat", 2}, - {"mdhd", 2}, - {"nmhd", 2}, - {"stsc", 2}, - {"stsz", 2}, - {"stts", 2}, - {"vmhd", 2}, + {"CNCV", 2}, + {"CCDT", 2}, + {"CTBO", 2}, + {"CMT1", 2}, + {"CMT2", 2}, + {"CMT3", 2}, + {"CMT4", 2}, + {"THMB", 2}, + {"co64", 2}, + {"mdat", 2}, + {"mdhd", 2}, + {"nmhd", 2}, + {"stsc", 2}, + {"stsz", 2}, + {"stts", 2}, + {"vmhd", 2}, - {"dref", 3}, - {"uuid", 3}, - }; + {"dref", 3}, + {"uuid", 3}, + }; - const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; - unsigned int c; - int err = 0; + unsigned int c; + int err = 0; - ushort tL; // Atom length represented in 4 or 8 bytes - char nmAtom[5]; // Atom name - unsigned long long oAtom, szAtom; // Atom offset and Atom size - unsigned long long oAtomContent, - szAtomContent; // offset and size of Atom content - unsigned long long lHdr; + ushort tL; // Atom length represented in 4 or 8 bytes + char nmAtom[5]; // Atom name + unsigned long long oAtom, szAtom; // Atom offset and Atom size + unsigned long long oAtomContent, + szAtomContent; // offset and size of Atom content + unsigned long long lHdr; - char UIID[16]; - uchar CMP1[36]; - char HandlerType[5], MediaFormatID[5]; + char UIID[16]; + uchar CMP1[36]; + char HandlerType[5], MediaFormatID[5]; // unsigned ImageWidth, ImageHeight; - long relpos_inDir, relpos_inBox; - unsigned szItem, Tag, lTag; - ushort tItem; + long relpos_inDir, relpos_inBox; + unsigned szItem, Tag, lTag; + ushort tItem; - nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; - strcpy(HandlerType, sHandlerType[0]); + nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; + strcpy(HandlerType, sHandlerType[0]); // ImageWidth = ImageHeight = 0U; - oAtom = oAtomList; - nesting++; - if (nesting > 31) - return -14; // too deep nesting - short s_order = order; + oAtom = oAtomList; + nesting++; - while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) - { - lHdr = 0ULL; - err = 0; - order = 0x4d4d; - fseek(ifp, oAtom, SEEK_SET); - szAtom = get4(); - FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); - AtomNameStack[(nesting + 1) * 4] = '\0'; - tL = 4; - AtomType = 0; - - for (c = 0; c < sizeof AtomNamesList / sizeof *AtomNamesList; c++) - if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) - { - AtomType = AtomNamesList[c].AtomType; - break; - } - - if (!AtomType) - { - err = 1; + if (nesting > 31) { + return -14; // too deep nesting } - if (szAtom == 0ULL) - { - if (nesting != 0) - { - err = -2; - goto fin; - } - szAtom = szAtomList - oAtom; - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } - else if (szAtom == 1ULL) - { - if ((oAtom + 16ULL) > (oAtomList + szAtomList)) - { - err = -3; - goto fin; - } - tL = 8; - szAtom = (((unsigned long long)get4()) << 32) | get4(); - oAtomContent = oAtom + 16ULL; - szAtomContent = szAtom - 16ULL; - } - else - { - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } + short s_order = order; - if (!strcmp(nmAtom, "trak")) - { - nTrack++; - TrackType = 0; - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) - break; - } - if (!strcmp(AtomNameStack, "moovuuid")) - { - lHdr = 16ULL; - fread(UIID, 1, lHdr, ifp); - if (!strncmp(UIID, UIID_Canon, lHdr)) - { - AtomType = 1; - } - else - fseek(ifp, -lHdr, SEEK_CUR); - } - else if (!strcmp(AtomNameStack, "moovuuidCCTP")) - { - lHdr = 12ULL; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT1")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -4; - goto fin; - } - parse_tiff_ifd(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT2")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -5; - goto fin; - } - parse_exif(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT3")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -6; - goto fin; - } - fseek(ifp, -12L, SEEK_CUR); - parse_makernote(oAtomContent, 0); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT4")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -6; - goto fin; - } - INT64 off = ftell(ifp); - parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); + while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { + lHdr = 0ULL; + err = 0; + order = 0x4d4d; + fseek(ifp, oAtom, SEEK_SET); + szAtom = get4(); + FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + AtomNameStack[(nesting + 1) * 4] = '\0'; + tL = 4; + AtomType = 0; + + for (c = 0; c < sizeof AtomNamesList / sizeof * AtomNamesList; c++) { + if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { + AtomType = AtomNamesList[c].AtomType; + break; + } + } + + if (!AtomType) { + err = 1; + } + + if (szAtom == 0ULL) { + if (nesting != 0) { + err = -2; + goto fin; + } + + szAtom = szAtomList - oAtom; + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } else if (szAtom == 1ULL) { + if ((oAtom + 16ULL) > (oAtomList + szAtomList)) { + err = -3; + goto fin; + } + + tL = 8; + szAtom = (((unsigned long long)get4()) << 32) | get4(); + oAtomContent = oAtom + 16ULL; + szAtomContent = szAtom - 16ULL; + } else { + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + + if (!strcmp(nmAtom, "trak")) { + nTrack++; + TrackType = 0; + + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + break; + } + } + + if (!strcmp(AtomNameStack, "moovuuid")) { + lHdr = 16ULL; + fread(UIID, 1, lHdr, ifp); + + if (!strncmp(UIID, UIID_Canon, lHdr)) { + AtomType = 1; + } else { + fseek(ifp, -lHdr, SEEK_CUR); + } + } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { + lHdr = 12ULL; + } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -4; + goto fin; + } + + parse_tiff_ifd(oAtomContent); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -5; + goto fin; + } + + parse_exif(oAtomContent); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -6; + goto fin; + } + + fseek(ifp, -12L, SEEK_CUR); + parse_makernote(oAtomContent, 0); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -6; + goto fin; + } + + INT64 off = ftell(ifp); + parse_gps(oAtomContent); + fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) - { - fseek(ifp, 8L, SEEK_CUR); - FORC4 HandlerType[c] = fgetc(ifp); - for (c = 1; c < sizeof sHandlerType / sizeof *sHandlerType; c++) - if (!strcmp(HandlerType, sHandlerType[c])) - { - TrackType = c; - break; - } - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) - { - if (szAtomContent >= 16) - { - fseek(ifp, 12L, SEEK_CUR); - lHdr = 8; - } - else - { - err = -7; - goto fin; - } - FORC4 MediaFormatID[c] = fgetc(ifp); - if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) - { - if (szAtomContent >= 44) - fseek(ifp, 24L, SEEK_CUR); - else - { - err = -8; - goto fin; - } - } - else - { - AtomType = 2; // only continue for CRAW - lHdr = 0; - } + order = q_order; + } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { + fseek(ifp, 8L, SEEK_CUR); + FORC4 HandlerType[c] = fgetc(ifp); + + for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { + if (!strcmp(HandlerType, sHandlerType[c])) { + TrackType = c; + break; + } + } + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { + if (szAtomContent >= 16) { + fseek(ifp, 12L, SEEK_CUR); + lHdr = 8; + } else { + err = -7; + goto fin; + } + + FORC4 MediaFormatID[c] = fgetc(ifp); + + if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { + if (szAtomContent >= 44) { + fseek(ifp, 24L, SEEK_CUR); + } else { + err = -8; + goto fin; + } + } else { + AtomType = 2; // only continue for CRAW + lHdr = 0; + } + #define current_track RT_canon_CR3_data.crx_header[nTrack] - /*ImageWidth = */get2(); - /*ImageHeight = */get2(); - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) - { - lHdr = 82; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) - { - if (szAtomContent >= 40) - fread(CMP1, 1, 36, ifp); - else - { - err = -7; - goto fin; - } - if (!crxParseImageHeader(CMP1, nTrack)) - current_track.MediaType = 1; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) - { - current_track.MediaType = 2; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) - { - if (szAtomContent == 12) - fseek(ifp, 4L, SEEK_CUR); - else if (szAtomContent == 16) - fseek(ifp, 12L, SEEK_CUR); - else - { - err = -9; - goto fin; - } - current_track.MediaSize = get4(); - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) - { - if (szAtomContent == 16) - fseek(ifp, 8L, SEEK_CUR); - else - { - err = -10; - goto fin; - } - current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); - } - - if (current_track.MediaSize && current_track.MediaOffset && - ((oAtom + szAtom) >= (oAtomList + szAtomList)) && - !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) - { - if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) - { - order = 0x4949; - relpos_inDir = 0L; - while (relpos_inDir + 6 < current_track.MediaSize) - { - fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); - szItem = get4(); - tItem = get2(); - if ((relpos_inDir + szItem) > current_track.MediaSize) - { - err = -11; - goto fin; - } - if ((tItem == 7) || (tItem == 8) || (tItem == 9)) - { - relpos_inBox = relpos_inDir + 12L; - while (relpos_inBox + 8 < relpos_inDir + szItem) - { - fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); - lTag = get4(); - Tag = get4(); - if (lTag < 8) - { - err = -12; + /*ImageWidth = */ get2(); + /*ImageHeight = */ get2(); + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { + lHdr = 82; + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { + if (szAtomContent >= 40) { + fread(CMP1, 1, 36, ifp); + } else { + err = -7; goto fin; - } - else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) - { - err = -11; - goto fin; - } - if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) - { - fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, - SEEK_SET); - short q_order = order; - order = get2(); - if (bad_hdr) - { - err = -13; - goto fin; - } - fseek(ifp, -8L, SEEK_CUR); - RT_canon_CR3_data.CR3_CTMDtag = 1; - parse_makernote(current_track.MediaOffset + relpos_inBox + 8, - 0); - RT_canon_CR3_data.CR3_CTMDtag = 0; - order = q_order; - } - relpos_inBox += lTag; } - } - relpos_inDir += szItem; + + if (!crxParseImageHeader(CMP1, nTrack)) { + current_track.MediaType = 1; + } + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { + current_track.MediaType = 2; + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { + if (szAtomContent == 12) { + fseek(ifp, 4L, SEEK_CUR); + } else if (szAtomContent == 16) { + fseek(ifp, 12L, SEEK_CUR); + } else { + err = -9; + goto fin; + } + + current_track.MediaSize = get4(); + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { + if (szAtomContent == 16) { + fseek(ifp, 8L, SEEK_CUR); + } else { + err = -10; + goto fin; + } + + current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); } - order = 0x4d4d; - } - } + + if (current_track.MediaSize && current_track.MediaOffset && + ((oAtom + szAtom) >= (oAtomList + szAtomList)) && + !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) { + if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) { + order = 0x4949; + relpos_inDir = 0L; + + while (relpos_inDir + 6 < current_track.MediaSize) { + fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); + szItem = get4(); + tItem = get2(); + + if ((relpos_inDir + szItem) > current_track.MediaSize) { + err = -11; + goto fin; + } + + if ((tItem == 7) || (tItem == 8) || (tItem == 9)) { + relpos_inBox = relpos_inDir + 12L; + + while (relpos_inBox + 8 < relpos_inDir + szItem) { + fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); + lTag = get4(); + Tag = get4(); + + if (lTag < 8) { + err = -12; + goto fin; + } else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) { + err = -11; + goto fin; + } + + if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) { + fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, + SEEK_SET); + short q_order = order; + order = get2(); + + if (bad_hdr) { + err = -13; + goto fin; + } + + fseek(ifp, -8L, SEEK_CUR); + RT_canon_CR3_data.CR3_CTMDtag = 1; + parse_makernote(current_track.MediaOffset + relpos_inBox + 8, + 0); + RT_canon_CR3_data.CR3_CTMDtag = 0; + order = q_order; + } + + relpos_inBox += lTag; + } + } + + relpos_inDir += szItem; + } + + order = 0x4d4d; + } + } + #undef current_track - if (AtomType == 1) - { - err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, - AtomNameStack, nTrack, TrackType); - if (err) - goto fin; + + if (AtomType == 1) { + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, + AtomNameStack, nTrack, TrackType); + + if (err) { + goto fin; + } + } + + oAtom += szAtom; } - oAtom += szAtom; - } fin: - nesting--; - if (nesting >= 0) - AtomNameStack[nesting * 4] = '\0'; - order = s_order; - return err; + nesting--; + + if (nesting >= 0) { + AtomNameStack[nesting * 4] = '\0'; + } + + order = s_order; + return err; } #undef bad_hdr - -//----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- #ifdef _abs #undef _abs @@ -607,17 +602,17 @@ fin: #define _min(a, b) ((a) < (b) ? (a) : (b)) #define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) -#if defined(__clang__) || defined(__GNUG__) +#if defined (__clang__) || defined (__GNUG__) #define libraw_inline inline __attribute__((always_inline)) -#elif defined(_MSC_VER) && _MSC_VER > 1400 +#elif defined (_MSC_VER) && _MSC_VER > 1400 #define libraw_inline __forceinline #else #define libraw_inline inline #endif -namespace { - -static unsigned sgetn (int n, unsigned char *s) +namespace +{ +static unsigned sgetn(int n, unsigned char* s) { unsigned result = 0; @@ -630,13 +625,13 @@ static unsigned sgetn (int n, unsigned char *s) // this should be divisible by 4 #define CRX_BUF_SIZE 0x10000 -#if !defined(_WIN32) || (defined (__GNUC__) && !defined(__INTRINSIC_SPECIAL__BitScanReverse)) +#if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -typedef uint32_t DWORD; -typedef uint8_t byte; -libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) +using DWORD = uint32_t; +using byte = uint8_t; +libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) { - *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); + *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } uint32_t _byteswap_ulong(uint32_t x) { @@ -648,128 +643,128 @@ uint32_t _byteswap_ulong(uint32_t x) } #endif - #define LIBRAW_EXCEPTION_IO_EOF std::exception() struct LibRaw_abstract_datastream { - IMFILE *ifp; - - void lock() {} - void unlock() {} - void seek(int p, int how) { fseek(ifp, p, how); } + IMFILE* ifp; + + void lock() + { + } + void unlock() + { + } + void seek(int p, int how) + { + fseek(ifp, p, how); + } int read(void* dst, int es, int count) - { return fread(dst, es, count, ifp); } + { + return fread(dst, es, count, ifp); + } }; -struct CrxBitstream -{ - uint8_t mdatBuf[CRX_BUF_SIZE]; - uint64_t mdatSize; - uint64_t curBufOffset; - uint32_t curPos; - uint32_t curBufSize; - uint32_t bitData; - int32_t bitsLeft; - LibRaw_abstract_datastream *input; +struct CrxBitstream { + uint8_t mdatBuf[CRX_BUF_SIZE]; + uint64_t mdatSize; + uint64_t curBufOffset; + uint32_t curPos; + uint32_t curBufSize; + uint32_t bitData; + int32_t bitsLeft; + LibRaw_abstract_datastream* input; }; -struct CrxBandParam -{ - CrxBitstream bitStream; - int16_t subbandWidth; - int16_t subbandHeight; - int32_t roundedBitsMask; - int32_t roundedBits; - int16_t curLine; - int32_t *lineBuf0; - int32_t *lineBuf1; - int32_t *lineBuf2; - int32_t sParam; - int32_t kParam; - int32_t *paramData; - int32_t *nonProgrData; - int8_t supportsPartial; +struct CrxBandParam { + CrxBitstream bitStream; + int16_t subbandWidth; + int16_t subbandHeight; + int32_t roundedBitsMask; + int32_t roundedBits; + int16_t curLine; + int32_t* lineBuf0; + int32_t* lineBuf1; + int32_t* lineBuf2; + int32_t sParam; + int32_t kParam; + int32_t* paramData; + int32_t* nonProgrData; + int8_t supportsPartial; }; -struct CrxWaveletTransform -{ - int32_t *subband0Buf; - int32_t *subband1Buf; - int32_t *subband2Buf; - int32_t *subband3Buf; - int32_t *lineBuf[8]; - int16_t curLine; - int16_t curH; - int8_t fltTapH; - int16_t height; - int16_t width; +struct CrxWaveletTransform { + int32_t* subband0Buf; + int32_t* subband1Buf; + int32_t* subband2Buf; + int32_t* subband3Buf; + int32_t* lineBuf[8]; + int16_t curLine; + int16_t curH; + int8_t fltTapH; + int16_t height; + int16_t width; }; -struct CrxSubband -{ - CrxBandParam *bandParam; - uint64_t mdatOffset; - uint8_t *bandBuf; - int32_t bandSize; - uint64_t dataSize; - int8_t supportsPartial; - int32_t quantValue; - uint16_t width; - uint16_t height; - int32_t paramK; - int64_t dataOffset; +struct CrxSubband { + CrxBandParam* bandParam; + uint64_t mdatOffset; + uint8_t* bandBuf; + int32_t bandSize; + uint64_t dataSize; + int8_t supportsPartial; + int32_t quantValue; + uint16_t width; + uint16_t height; + int32_t paramK; + int64_t dataOffset; }; -struct CrxPlaneComp -{ - byte *compBuf; - CrxSubband *subBands; - CrxWaveletTransform *waveletTransform; - int8_t compNumber; - int64_t dataOffset; - int32_t compSize; - int8_t supportsPartial; - int32_t roundedBitsMask; - int8_t tileFlag; +struct CrxPlaneComp { + byte* compBuf; + CrxSubband* subBands; + CrxWaveletTransform* waveletTransform; + int8_t compNumber; + int64_t dataOffset; + int32_t compSize; + int8_t supportsPartial; + int32_t roundedBitsMask; + int8_t tileFlag; }; -struct CrxTile -{ - CrxPlaneComp *comps; - int8_t tileFlag; - int8_t tileNumber; - int64_t dataOffset; - int32_t tileSize; - uint16_t width; - uint16_t height; +struct CrxTile { + CrxPlaneComp* comps; + int8_t tileFlag; + int8_t tileNumber; + int64_t dataOffset; + int32_t tileSize; + uint16_t width; + uint16_t height; }; -struct CrxImage -{ - uint8_t nPlanes; - uint16_t planeWidth; - uint16_t planeHeight; - uint8_t samplePrecision; - uint8_t subbandCount; - uint8_t levels; - uint8_t nBits; - uint8_t encType; - uint8_t tileCols; - uint8_t tileRows; - CrxTile *tiles; - uint64_t mdatOffset; - uint64_t mdatSize; - int16_t *outBufs[4]; // one per plane - int16_t *planeBuf; - LibRaw_abstract_datastream *input; +struct CrxImage { + uint8_t nPlanes; + uint16_t planeWidth; + uint16_t planeHeight; + uint8_t samplePrecision; + uint8_t subbandCount; + uint8_t levels; + uint8_t nBits; + uint8_t encType; + uint8_t tileCols; + uint8_t tileRows; + CrxTile* tiles; + uint64_t mdatOffset; + uint64_t mdatSize; + int16_t* outBufs[4];// one per plane + int16_t* planeBuf; + LibRaw_abstract_datastream* input; }; -enum TileFlags -{ - E_HAS_TILES_ON_THE_RIGHT = 1, - E_HAS_TILES_ON_THE_LEFT = 2, - E_HAS_TILES_ON_THE_BOTTOM = 4, - E_HAS_TILES_ON_THE_TOP = 8 +enum TileFlags { + E_HAS_TILES_ON_THE_RIGHT = 1, + E_HAS_TILES_ON_THE_LEFT = 2, + E_HAS_TILES_ON_THE_BOTTOM = 4, + E_HAS_TILES_ON_THE_TOP = 8 }; int32_t exCoefNumTbl[0x120] = { @@ -789,2341 +784,2459 @@ int32_t exCoefNumTbl[0x120] = { 1, 1, 7, 7, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 7, 6, 1, 0, 3, 2, 1, 0, 1, 0, 1, 2, 10, 10, 2, 2, 5, 4, 2, 1, 2, 1, 1, 1, 10, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 1, 9, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 0, 9, 8, 1, 1, 4, 3, 1, 1, 1, 1, 1, 2, - 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1}; + 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 +}; uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000}; + 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 + }; uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; + 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F + }; -static inline void crxFillBuffer(CrxBitstream *bitStrm) +static inline void crxFillBuffer(CrxBitstream* bitStrm) { - if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) - { - bitStrm->curPos = 0; - bitStrm->curBufOffset += bitStrm->curBufSize; + if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) { + bitStrm->curPos = 0; + bitStrm->curBufOffset += bitStrm->curBufSize; #ifdef _OPENMP -#pragma omp critical + #pragma omp critical #endif - { + { #ifndef _OPENMP - bitStrm->input->lock(); + bitStrm->input->lock(); #endif - bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); - bitStrm->curBufSize = bitStrm->input->read( - bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); + bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); + bitStrm->curBufSize = bitStrm->input->read( + bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); #ifndef _OPENMP - bitStrm->input->unlock(); + bitStrm->input->unlock(); #endif - if (bitStrm->curBufSize < 1) // nothing read - throw LIBRAW_EXCEPTION_IO_EOF; - bitStrm->mdatSize -= bitStrm->curBufSize; + + if (bitStrm->curBufSize < 1) { // nothing read + throw LIBRAW_EXCEPTION_IO_EOF; + } + + bitStrm->mdatSize -= bitStrm->curBufSize; + } } - } } -libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) +libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { // uint32_t bitData = bitStrm->bitData; - uint32_t nonZeroBit = 0; - uint64_t nextData = 0; - int32_t result = 0; + uint32_t nonZeroBit = 0; + uint64_t nextData = 0; + int32_t result = 0; - if (bitStrm->bitData) - { - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)bitStrm->bitData); - result = 31 - nonZeroBit; - bitStrm->bitData <<= 32 - nonZeroBit; - bitStrm->bitsLeft -= 32 - nonZeroBit; - } - else - { - uint32_t bitsLeft = bitStrm->bitsLeft; - while (1) - { - while (bitStrm->curPos + 4 <= bitStrm->curBufSize) - { - nextData = - _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); - bitStrm->curPos += 4; - crxFillBuffer(bitStrm); - if (nextData) - { - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); - result = bitsLeft + 31 - nonZeroBit; - bitStrm->bitData = nextData << (32 - nonZeroBit); - bitStrm->bitsLeft = nonZeroBit; - return result; + if (bitStrm->bitData) { + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); + result = 31 - nonZeroBit; + bitStrm->bitData <<= 32 - nonZeroBit; + bitStrm->bitsLeft -= 32 - nonZeroBit; + } else { + uint32_t bitsLeft = bitStrm->bitsLeft; + + while (true) { + while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { + nextData = + _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + + if (nextData) { + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + result = bitsLeft + 31 - nonZeroBit; + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + return result; + } + + bitsLeft += 32; + } + + if (bitStrm->curBufSize < bitStrm->curPos + 1) { + break; // error + } + + nextData = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + + if (nextData) { + break; + } + + bitsLeft += 8; } - bitsLeft += 32; - } - if (bitStrm->curBufSize < bitStrm->curPos + 1) - break; // error - nextData = bitStrm->mdatBuf[bitStrm->curPos++]; - crxFillBuffer(bitStrm); - if (nextData) - break; - bitsLeft += 8; + + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; } - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); - result = (uint32_t)(bitsLeft + 7 - nonZeroBit); - bitStrm->bitData = nextData << (32 - nonZeroBit); - bitStrm->bitsLeft = nonZeroBit; - } - return result; + + return result; } -libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream *bitStrm, int bits) +libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { - int bitsLeft = bitStrm->bitsLeft; - uint32_t bitData = bitStrm->bitData; - uint32_t nextWord; - uint8_t nextByte; - uint32_t result; + int bitsLeft = bitStrm->bitsLeft; + uint32_t bitData = bitStrm->bitData; + uint32_t nextWord; + uint8_t nextByte; + uint32_t result; - if (bitsLeft < bits) - { - // get them from stream - if (bitStrm->curPos + 4 <= bitStrm->curBufSize) - { - nextWord = - _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); - bitStrm->curPos += 4; - crxFillBuffer(bitStrm); - bitStrm->bitsLeft = 32 - (bits - bitsLeft); - result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); - bitStrm->bitData = nextWord << (bits - bitsLeft); - return result; + if (bitsLeft < bits) { + // get them from stream + if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { + nextWord = + _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + bitStrm->bitsLeft = 32 - (bits - bitsLeft); + result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); + bitStrm->bitData = nextWord << (bits - bitsLeft); + return result; + } + + // less than a word left - read byte at a time + do { + if (bitStrm->curPos >= bitStrm->curBufSize) { + break; // error + } + + bitsLeft += 8; + nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + bitData |= nextByte << (32 - bitsLeft); + } while (bitsLeft < bits); } - // less than a word left - read byte at a time - do - { - if (bitStrm->curPos >= bitStrm->curBufSize) - break; // error - bitsLeft += 8; - nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; - crxFillBuffer(bitStrm); - bitData |= nextByte << (32 - bitsLeft); - } while (bitsLeft < bits); - } - result = bitData >> (32 - bits); // 32-bits - bitStrm->bitData = bitData << bits; - bitStrm->bitsLeft = bitsLeft - bits; - return result; + + result = bitData >> (32 - bits);// 32-bits + bitStrm->bitData = bitData << bits; + bitStrm->bitsLeft = bitsLeft - bits; + return result; } libraw_inline int crxPredictKParameter(int32_t prevK, int32_t bitCode, int32_t maxVal = 0) { - int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + - ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); - return !maxVal || newKParam < maxVal ? newKParam : maxVal; + return !maxVal || newKParam < maxVal ? newKParam : maxVal; } -libraw_inline void crxDecodeSymbolL1(CrxBandParam *param, +libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, int32_t doMedianPrediction, int32_t notEOL = 0) { - if (doMedianPrediction) - { - int32_t symb[4]; + if (doMedianPrediction) { + int32_t symb[4]; - int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = delta + symb[2]; - symb[3] = param->lineBuf0[1]; + int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = delta + symb[2]; + symb[3] = param->lineBuf0[1]; - param->lineBuf1[1] = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; - } - else - param->lineBuf1[1] = param->lineBuf0[1]; - - // get next error symbol - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - - // add converted (+/-) error code to predicted value - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - - // for not end of the line - use one symbol ahead to estimate next K - if (notEOL) - { - int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; - bitCode = (bitCode + _abs(nextDelta)) >> 1; - ++param->lineBuf0; - } - - // update K parameter - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - - ++param->lineBuf1; -} - -int crxDecodeLine(CrxBandParam *param) -{ - int length = param->subbandWidth; - - param->lineBuf1[0] = param->lineBuf0[1]; - for (; length > 1; --length) - { - if (param->lineBuf1[0] != param->lineBuf0[1] || - param->lineBuf1[0] != param->lineBuf0[2]) - { - crxDecodeSymbolL1(param, 1, 1); + param->lineBuf1[1] = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + } else { + param->lineBuf1[1] = param->lineBuf0[1]; } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; - } + // get next error symbol + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - length -= nSyms; - - // copy symbol nSyms times - param->lineBuf0 += nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - } - - if (length > 0) - crxDecodeSymbolL1(param, 0, (length > 1)); - } - } - - if (length == 1) - crxDecodeSymbolL1(param, 1, 0); - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, - int32_t doSym = 1, - int32_t doCode = 1) -{ - int32_t sym = param->lineBuf0[1]; - - if (doSym) - { - // calculate the next symbol gradient - int32_t symb[4]; - int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = deltaH + symb[2]; - symb[3] = param->lineBuf0[1]; - sym = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; - } - - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; - - if (doCode) - { - if (param->lineBuf0[2] > param->lineBuf0[1]) - code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - - 1) >> - param->roundedBits; - else - code = -( - (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> - param->roundedBits); - - param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * _abs(code)) >> 1, 15); - } - else - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - - ++param->lineBuf1; -} - -int crxDecodeLineRounded(CrxBandParam *param) -{ - int32_t valueReached = 0; - - param->lineBuf0[0] = param->lineBuf0[1]; - param->lineBuf1[0] = param->lineBuf0[1]; - int32_t length = param->subbandWidth; - - for (; length > 1; --length) - { - if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) - { - crxDecodeSymbolL1Rounded(param); - ++param->lineBuf0; - valueReached = 1; - } - else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > - param->roundedBitsMask) - { - crxDecodeSymbolL1Rounded(param); - ++param->lineBuf0; - valueReached = 0; - } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - } - if (nSyms > length) - return -1; - } - length -= nSyms; - - // copy symbol nSyms times - param->lineBuf0 += nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - - if (length > 1) - { - crxDecodeSymbolL1Rounded(param, 0); - ++param->lineBuf0; - valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > - param->roundedBitsMask; - } - else if (length == 1) - crxDecodeSymbolL1Rounded(param, 0, 0); - } - } - if (length == 1) - crxDecodeSymbolL1Rounded(param, 1, 0); - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -int crxDecodeLineNoRefPrevLine(CrxBandParam *param) -{ - int32_t i = 0; - - for (; i < param->subbandWidth - 1; i++) - { - if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) + if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) + } else if (param->kParam) { bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); - param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode); - if (param->lineBuf2[i + 1] - param->kParam <= 1) - { - if (param->kParam >= 15) - param->kParam = 15; - } - else - ++param->kParam; } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - if (i != param->subbandWidth - 1) - { - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (i + nSyms > param->subbandWidth) - { - nSyms = param->subbandWidth - i; - break; + + // add converted (+/-) error code to predicted value + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + + // for not end of the line - use one symbol ahead to estimate next K + if (notEOL) { + int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + bitCode = (bitCode + _abs(nextDelta)) >> 1; + ++param->lineBuf0; + } + + // update K parameter + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLine(CrxBandParam* param) +{ + int length = param->subbandWidth; + + param->lineBuf1[0] = param->lineBuf0[1]; + + for (; length > 1; --length) { + if (param->lineBuf1[0] != param->lineBuf0[1] || + param->lineBuf1[0] != param->lineBuf0[2]) { + crxDecodeSymbolL1(param, 1, 1); + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + } + + if (length > 0) { + crxDecodeSymbolL1(param, 0, (length > 1)); } - if (param->sParam < 31) - ++param->sParam; - if (i + nSyms == param->subbandWidth) - break; - } - if (i + nSyms < param->subbandWidth) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - } - if (i + nSyms > param->subbandWidth) - return -1; } - } - else if (i > param->subbandWidth) - return -1; + } - if (nSyms > 0) - { - memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); - memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); - i += nSyms; - } + if (length == 1) { + crxDecodeSymbolL1(param, 1, 0); + } - if (i >= param->subbandWidth - 1) - { - if (i == param->subbandWidth - 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, + int32_t doSym = 1, + int32_t doCode = 1) +{ + int32_t sym = param->lineBuf0[1]; + + if (doSym) { + // calculate the next symbol gradient + int32_t symb[4]; + int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = deltaH + symb[2]; + symb[3] = param->lineBuf0[1]; + sym = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t code = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; + + if (doCode) { + if (param->lineBuf0[2] > param->lineBuf0[1]) { + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - + 1) >> + param->roundedBits; + } else { + code = -( + (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> + param->roundedBits); + } + + param->kParam = crxPredictKParameter(param->kParam, + (bitCode + 2 * _abs(code)) >> 1, 15); + } else { + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + + ++param->lineBuf1; +} + +int crxDecodeLineRounded(CrxBandParam* param) +{ + int32_t valueReached = 0; + + param->lineBuf0[0] = param->lineBuf0[1]; + param->lineBuf1[0] = param->lineBuf0[1]; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) { + if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 1; + } else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > + param->roundedBitsMask) { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 0; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length > 1) { + crxDecodeSymbolL1Rounded(param, 0); + ++param->lineBuf0; + valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > + param->roundedBitsMask; + } else if (length == 1) { + crxDecodeSymbolL1Rounded(param, 0, 0); + } + } + } + + if (length == 1) { + crxDecodeSymbolL1Rounded(param, 1, 0); + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeLineNoRefPrevLine(CrxBandParam* param) +{ + int32_t i = 0; + + for (; i < param->subbandWidth - 1; i++) { + if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + + if (param->lineBuf2[i + 1] - param->kParam <= 1) { + if (param->kParam >= 15) { + param->kParam = 15; + } + } else { + ++param->kParam; + } + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + if (i != param->subbandWidth - 1) { + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (i + nSyms > param->subbandWidth) { + nSyms = param->subbandWidth - i; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (i + nSyms == param->subbandWidth) { + break; + } + } + + if (i + nSyms < param->subbandWidth) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + } + + if (i + nSyms > param->subbandWidth) { + return -1; + } + } + } else if (i > param->subbandWidth) { + return -1; + } + + if (nSyms > 0) { + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + i += nSyms; + } + + if (i >= param->subbandWidth - 1) { + if (i == param->subbandWidth - 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + continue; + } else { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + + if (param->lineBuf2[i + 1] - param->kParam <= 1) { + if (param->kParam >= 15) { + param->kParam = 15; + } + } else { + ++param->kParam; + } + } + } + + param->lineBuf2[i] = param->kParam; + } + + if (i == param->subbandWidth - 1) { + int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) + } else if (param->kParam) { bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); - param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[i] = param->kParam; } - continue; - } - else - { + + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + return 0; +} + +int crxDecodeTopLine(CrxBandParam* param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) { + if (param->lineBuf1[0]) { + param->lineBuf1[1] = param->lineBuf1[0]; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) { + break; + } + } + + param->lineBuf1[1] = 0; + } + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode); - if (param->lineBuf2[i + 1] - param->kParam <= 1) - { - if (param->kParam >= 15) - param->kParam = 15; - } - else - ++param->kParam; - } - } - param->lineBuf2[i] = param->kParam; - } - if (i == param->subbandWidth - 1) - { - int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[i] = param->kParam; - } - return 0; -} - -int crxDecodeTopLine(CrxBandParam *param) -{ - param->lineBuf1[0] = 0; - - int32_t length = param->subbandWidth; - - // read the line from bitstream - for (; length > 1; --length) - { - if (param->lineBuf1[0]) - param->lineBuf1[1] = param->lineBuf1[0]; - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); } - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - - if (length <= 0) - break; - } - - param->lineBuf1[1] = 0; + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - if (length == 1) - { - param->lineBuf1[1] = param->lineBuf1[0]; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -int crxDecodeTopLineRounded(CrxBandParam *param) -{ - param->lineBuf1[0] = 0; - - int32_t length = param->subbandWidth; - - // read the line from bitstream - for (; length > 1; --length) - { - if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) - param->lineBuf1[1] = param->lineBuf1[0]; - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; - } - } - - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { + if (length == 1) { param->lineBuf1[1] = param->lineBuf1[0]; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; - } - - if (length <= 0) - break; - - param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + param->lineBuf1[1] = param->lineBuf1[0] + 1; - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - if (length == 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; + return 0; } -int crxDecodeTopLineNoRefPrevLine(CrxBandParam *param) +int crxDecodeTopLineRounded(CrxBandParam* param) { - param->lineBuf0[0] = 0; - param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; - for (; length > 1; --length) - { - if (param->lineBuf1[0]) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) { + if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) { + param->lineBuf1[1] = param->lineBuf1[0]; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) { + break; + } + + param->lineBuf1[1] = 0; } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) +{ + param->lineBuf0[0] = 0; + param->lineBuf1[0] = 0; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) { + if (param->lineBuf1[0]) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf2[0] = 0; + param->lineBuf1[1] = 0; + ++param->lineBuf1; + ++param->lineBuf2; + } + + if (length <= 0) { + break; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + + param->lineBuf2[0] = param->kParam; + ++param->lineBuf2; + ++param->lineBuf1; + } + + if (length == 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[0] = param->kParam; + ++param->lineBuf1; + } + + param->lineBuf1[1] = 0; + + return 0; +} + +int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) +{ + if (!param || !bandBuf) { + return -1; + } + + if (param->curLine >= param->subbandHeight) { + return -1; + } + + if (param->curLine == 0) { + int32_t lineLength = param->subbandWidth + 2; + + param->sParam = 0; + param->kParam = 0; + + if (param->supportsPartial) { + if (param->roundedBitsMask <= 0) { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLine(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } else { + param->roundedBits = 1; + + if (param->roundedBitsMask & ~1) { + while (param->roundedBitsMask >> param->roundedBits) { + ++param->roundedBits; + } + } + + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLineRounded(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } else { + param->lineBuf2 = (int32_t*)param->nonProgrData; + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLineNoRefPrevLine(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } else if (!param->supportsPartial) { + int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (int32_t*)param->nonProgrData; + + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLineNoRefPrevLine(param)) { return -1; } - } - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf2[0] = 0; - param->lineBuf1[1] = 0; - ++param->lineBuf1; - ++param->lineBuf2; - } - - if (length <= 0) - break; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } - param->lineBuf2[0] = param->kParam; - ++param->lineBuf2; - ++param->lineBuf1; - } - - if (length == 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[0] = param->kParam; - ++param->lineBuf1; - } - - param->lineBuf1[1] = 0; - - return 0; -} - -int crxDecodeLine(CrxBandParam *param, uint8_t *bandBuf) -{ - if (!param || !bandBuf) - return -1; - if (param->curLine >= param->subbandHeight) - return -1; - - if (param->curLine == 0) - { - int32_t lineLength = param->subbandWidth + 2; - - param->sParam = 0; - param->kParam = 0; - if (param->supportsPartial) - { - if (param->roundedBitsMask <= 0) - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLine(param)) - return -1; memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); ++param->curLine; - } - else - { - param->roundedBits = 1; - if (param->roundedBitsMask & ~1) - { - while (param->roundedBitsMask >> param->roundedBits) - ++param->roundedBits; + } else if (param->roundedBitsMask <= 0) { + int32_t lineLength = param->subbandWidth + 2; + + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; } - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineRounded(param)) - return -1; + + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLine(param)) { + return -1; + } + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); ++param->curLine; - } - } - else - { - param->lineBuf2 = (int32_t *)param->nonProgrData; - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineNoRefPrevLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - } - else if (!param->supportsPartial) - { - int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (int32_t *)param->nonProgrData; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineNoRefPrevLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - else if (param->roundedBitsMask <= 0) - { - int32_t lineLength = param->subbandWidth + 2; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - else - { - int32_t lineLength = param->subbandWidth + 2; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineRounded(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - return 0; -} + } else { + int32_t lineLength = param->subbandWidth + 2; -int crxDecodeLineWithIQuantization(CrxSubband *subband) -{ - int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; - - if (!subband->dataSize) - { - memset(subband->bandBuf, 0, subband->bandSize); - return 0; - } - - if (subband->supportsPartial) - { - uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); - if (bitCode >= 23) - bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); - else if (subband->paramK) - bitCode = - crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | - (bitCode << subband->paramK); - - subband->quantValue += - -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer - subband->paramK = crxPredictKParameter(subband->paramK, bitCode); - if (subband->paramK > 7) - return -1; - } - if (crxDecodeLine(subband->bandParam, subband->bandBuf)) - return -1; - - if (subband->width <= 0) - return 0LL; - - // update subband buffers - int32_t *bandBuf = (int32_t *)subband->bandBuf; - int32_t qScale = - q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); - if (subband->quantValue / 6 >= 6) - qScale = q_step_tbl[subband->quantValue % 6] * - (1 << (subband->quantValue / 6 + 26)); - - if (qScale != 1) - for (int32_t i = 0; i < subband->width; i++) - bandBuf[i] *= qScale; - - return 0; -} - -void crxHorizontal53(int32_t *lineBufLA, int32_t *lineBufLB, - CrxWaveletTransform *wavelet, uint32_t tileFlag) -{ - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - if (wavelet->width <= 1) - { - lineBufLA[0] = band0Buf[0]; - lineBufLB[0] = band2Buf[0]; - } - else - { - if (tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band1Buf; - ++band3Buf; - } - else - { - lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - ++band0Buf; - ++band2Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); - lineBufLA[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); - lineBufLB[2] = delta; - - ++band0Buf; - ++band1Buf; - ++band2Buf; - ++band3Buf; - lineBufLA += 2; - lineBufLB += 2; - } - if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); - - if (wavelet->width & 1) - { - lineBufLA[2] = deltaA; - lineBufLB[2] = deltaB; - } - } - else if (wavelet->width & 1) - { - lineBufLA[1] = - band1Buf[0] + - ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); - lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - - lineBufLB[1] = - band3Buf[0] + - ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); - lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - else - { - lineBufLA[1] = lineBufLA[0] + band1Buf[0]; - lineBufLB[1] = lineBufLB[0] + band3Buf[0]; - } - } -} - -int32_t *crxIdwt53FilterGetLine(CrxPlaneComp *comp, int32_t level) -{ - int32_t *result = comp->waveletTransform[level] - .lineBuf[(comp->waveletTransform[level].fltTapH - - comp->waveletTransform[level].curH + 5) % - 5 + - 3]; - comp->waveletTransform[level].curH--; - return result; -} - -int crxIdwt53FilterDecode(CrxPlaneComp *comp, int32_t level) -{ - if (comp->waveletTransform[level].curH) - return 0; - - CrxSubband *sband = comp->subBands + 3 * level; - - if (comp->waveletTransform[level].height - 3 <= - comp->waveletTransform[level].curLine && - !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) - { - if (comp->waveletTransform[level].height & 1) - { - if (level) - { - if (crxIdwt53FilterDecode(comp, level - 1)) - return -1; - } - else if (crxDecodeLineWithIQuantization(sband)) - return -1; - - if (crxDecodeLineWithIQuantization(sband + 1)) - return -1; - } - } - else - { - if (level) - { - if (crxIdwt53FilterDecode(comp, level - 1)) - return -1; - } - else if (crxDecodeLineWithIQuantization(sband)) // LL band - return -1; - - if (crxDecodeLineWithIQuantization(sband + 1) || // HL band - crxDecodeLineWithIQuantization(sband + 2) || // LH band - crxDecodeLineWithIQuantization(sband + 3)) // HH band - return -1; - } - - return 0; -} - -int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) -{ - CrxWaveletTransform *wavelet = comp->waveletTransform + level; - - if (wavelet->curH) - return 0; - - if (wavelet->curLine >= wavelet->height - 3) - { - if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) - { - if (wavelet->height & 1) - { - if (level) - { - if (!wavelet[-1].curH) - if (crxIdwt53FilterTransform(comp, level - 1)) - return -1; - wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLineRounded(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + + return 0; +} + +int crxDecodeLineWithIQuantization(CrxSubband* subband) +{ + int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + + if (!subband->dataSize) { + memset(subband->bandBuf, 0, subband->bandSize); + return 0; + } + + if (subband->supportsPartial) { + uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + + if (bitCode >= 23) { + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); + } else if (subband->paramK) { + bitCode = + crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | + (bitCode << subband->paramK); + } + + subband->quantValue += + -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->paramK = crxPredictKParameter(subband->paramK, bitCode); + + if (subband->paramK > 7) { + return -1; + } + } + + if (crxDecodeLine(subband->bandParam, subband->bandBuf)) { + return -1; + } + + if (subband->width <= 0) { + return 0LL; + } + + // update subband buffers + int32_t* bandBuf = (int32_t*)subband->bandBuf; + int32_t qScale = + q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + + if (subband->quantValue / 6 >= 6) { + qScale = q_step_tbl[subband->quantValue % 6] * + (1 << (subband->quantValue / 6 + 26)); + } + + if (qScale != 1) { + for (int32_t i = 0; i < subband->width; i++) { + bandBuf[i] *= qScale; + } + } + + return 0; +} + +void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, + CrxWaveletTransform* wavelet, uint32_t tileFlag) +{ + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + if (wavelet->width <= 1) { + lineBufLA[0] = band0Buf[0]; + lineBufLB[0] = band2Buf[0]; + } else { + if (tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } else { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + + ++band0Buf; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); + lineBufLA[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); + lineBufLB[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufLA += 2; + lineBufLB += 2; + } + + if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); + + if (wavelet->width & 1) { + lineBufLA[2] = deltaA; + lineBufLB[2] = deltaB; + } + } else if (wavelet->width & 1) { + lineBufLA[1] = + band1Buf[0] + + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + lineBufLB[1] = + band3Buf[0] + + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } else { + lineBufLA[1] = lineBufLA[0] + band1Buf[0]; + lineBufLB[1] = lineBufLB[0] + band3Buf[0]; + } + } +} + +int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) +{ + int32_t* result = comp->waveletTransform[level] + .lineBuf[(comp->waveletTransform[level].fltTapH - + comp->waveletTransform[level].curH + 5) % + 5 + + 3]; + comp->waveletTransform[level].curH--; + return result; +} + +int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) +{ + if (comp->waveletTransform[level].curH) { + return 0; + } + + CrxSubband* sband = comp->subBands + 3 * level; + + if (comp->waveletTransform[level].height - 3 <= + comp->waveletTransform[level].curLine && + !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (comp->waveletTransform[level].height & 1) { + if (level) { + if (crxIdwt53FilterDecode(comp, level - 1)) { + return -1; + } + } else if (crxDecodeLineWithIQuantization(sband)) { + return -1; + } + + if (crxDecodeLineWithIQuantization(sband + 1)) { + return -1; + } + } + } else { + if (level) { + if (crxIdwt53FilterDecode(comp, level - 1)) { + return -1; + } + } else if (crxDecodeLineWithIQuantization(sband)) {// LL band + return -1; + } + + if (crxDecodeLineWithIQuantization(sband + 1) ||// HL band + crxDecodeLineWithIQuantization(sband + 2) ||// LH band + crxDecodeLineWithIQuantization(sband + 3)) {// HH band + return -1; + } + } + + return 0; +} + +int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) +{ + CrxWaveletTransform* wavelet = comp->waveletTransform + level; + + if (wavelet->curH) { + return 0; + } + + if (wavelet->curLine >= wavelet->height - 3) { + if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (wavelet->height & 1) { + if (level) { + if (!wavelet[-1].curH) { + if (crxIdwt53FilterTransform(comp, level - 1)) { + return -1; + } + } + + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) { + lineBufL0[0] = band0Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } else { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + ++band0Buf; + ++band1Buf; + lineBufL0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + + if (wavelet->width & 1) { + lineBufL0[2] = delta; + } + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + } else { + lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + } + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) { + int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } else { + int32_t* lineBufL2 = wavelet->lineBuf[2]; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + wavelet->lineBuf[1] = lineBufL2; + wavelet->lineBuf[2] = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) { + lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; + } + + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + } else { + if (level) { + if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) { + return -1; + } + + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBufL2 = wavelet->lineBuf[2]; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; // process L bands - if (wavelet->width <= 1) - { - lineBufL0[0] = band0Buf[0]; - } - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - ++band1Buf; - } - else - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - } - ++band0Buf; - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - lineBufL0[2] = delta; + if (wavelet->width <= 1) { + lineBufL0[0] = band0Buf[0]; + lineBufL1[0] = band2Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } else { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; - ++band1Buf; - lineBufL0 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - if (wavelet->width & 1) - lineBufL0[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - lineBufL0[2] = delta; - } - else - lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufL0 += 2; + lineBufL1 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); + + if (wavelet->width & 1) { + lineBufL0[2] = deltaA; + lineBufL1[2] = deltaB; + } + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + } else { + lineBufL0[1] = lineBufL0[0] + band1Buf[0]; + lineBufL1[1] = lineBufL1[0] + band3Buf[0]; + } } // process H bands lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) - { - int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); - lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); - lineBufH2[i] = delta; + lineBufL2 = wavelet->lineBuf[2]; + + for (int32_t i = 0; i < wavelet->width; i++) { + int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; } - wavelet->curH += 3; - wavelet->curLine += 3; - wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } - else - { - int32_t *lineBufL2 = wavelet->lineBuf[2]; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - wavelet->lineBuf[1] = lineBufL2; - wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) - lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; - - wavelet->curH += 2; - wavelet->curLine += 2; - wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; - } - } - } - else - { - if (level) - { - if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) - return -1; - wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); - } - - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; - int32_t *lineBufL2 = wavelet->lineBuf[2]; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - - wavelet->lineBuf[1] = wavelet->lineBuf[2]; - wavelet->lineBuf[2] = lineBufL1; - - // process L bands - if (wavelet->width <= 1) - { - lineBufL0[0] = band0Buf[0]; - lineBufL1[0] = band2Buf[0]; - } - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band1Buf; - ++band3Buf; - } - else - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - ++band0Buf; - ++band2Buf; - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); - lineBufL0[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); - lineBufL1[2] = delta; - - ++band0Buf; - ++band1Buf; - ++band2Buf; - ++band3Buf; - lineBufL0 += 2; - lineBufL1 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); - - if (wavelet->width & 1) - { - lineBufL0[2] = deltaA; - lineBufL1[2] = deltaB; + if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) { + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } else { + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); - lineBufL0[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); - lineBufL1[2] = delta; - } - else - { - lineBufL0[1] = lineBufL0[0] + band1Buf[0]; - lineBufL1[1] = lineBufL1[0] + band3Buf[0]; - } } - // process H bands - lineBufL0 = wavelet->lineBuf[0]; - lineBufL1 = wavelet->lineBuf[1]; - lineBufL2 = wavelet->lineBuf[2]; - for (int32_t i = 0; i < wavelet->width; i++) - { - int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); - lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); - lineBufH2[i] = delta; - } - if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) - { - wavelet->curH += 3; - wavelet->curLine += 3; - wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } - else - { - wavelet->curH += 2; - wavelet->curLine += 2; - wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; - } - } - - return 0; -} - -int crxIdwt53FilterInitialize(CrxPlaneComp *comp, int32_t prevLevel) -{ - if (prevLevel < 0) return 0; - - for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; - curLevel++, curBand += 3) - { - CrxWaveletTransform *wavelet = comp->waveletTransform + curLevel; - if (curLevel) - wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); - else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) - return -1; - - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - if (wavelet->height > 1) - { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) - return -1; - - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; - int32_t *lineBufL2 = wavelet->lineBuf[2]; - - if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) - { - crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, - comp->tileFlag); - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) - return -1; - - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - // process L band - if (wavelet->width <= 1) - lineBufL2[0] = band2Buf[0]; - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band3Buf; - } - else - lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - - ++band2Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - lineBufL2[2] = delta; - - ++band2Buf; - ++band3Buf; - lineBufL2 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - if (wavelet->width & 1) - lineBufL2[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - lineBufL2[2] = delta; - } - else - { - lineBufL2[1] = band3Buf[0] + lineBufL2[0]; - } - } - - // process H band - for (int32_t i = 0; i < wavelet->width; i++) - lineBufH0[i] = - lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); - } - else - { - crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, - comp->tileFlag); - for (int i = 0; i < wavelet->width; i++) - lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); - } - - if (crxIdwt53FilterDecode(comp, curLevel) || - crxIdwt53FilterTransform(comp, curLevel)) - return -1; - } - else - { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) - return -1; - - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - - // process H band - if (wavelet->width <= 1) - lineBufH0[0] = band0Buf[0]; - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - ++band1Buf; - } - else - lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - - ++band0Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - - ++band0Buf; - ++band1Buf; - lineBufH0 += 2; - } - - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - } - else - { - lineBufH0[1] = band1Buf[0] + lineBufH0[0]; - } - } - ++wavelet->curLine; - ++wavelet->curH; - wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; - } - } - - return 0; } -void crxFreeSubbandData(CrxImage *image, CrxPlaneComp *comp) +int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) { - if (comp->compBuf) - { - free(comp->compBuf); - comp->compBuf = 0; - } - - if (!comp->subBands) - return; - - for (int32_t i = 0; i < image->subbandCount; i++) - { - if (comp->subBands[i].bandParam) - { - free(comp->subBands[i].bandParam); - comp->subBands[i].bandParam = 0LL; + if (prevLevel < 0) { + return 0; } - comp->subBands[i].bandBuf = 0; - comp->subBands[i].bandSize = 0; - } + + for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; + curLevel++, curBand += 3) { + CrxWaveletTransform* wavelet = comp->waveletTransform + curLevel; + + if (curLevel) { + wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); + } else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) { + return -1; + } + + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + + if (wavelet->height > 1) { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) { + return -1; + } + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBufL2 = wavelet->lineBuf[2]; + + if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, + comp->tileFlag); + + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { + return -1; + } + + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + // process L band + if (wavelet->width <= 1) { + lineBufL2[0] = band2Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band3Buf; + } else { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + + ++band2Buf; + ++band3Buf; + lineBufL2 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + + if (wavelet->width & 1) { + lineBufL2[2] = delta; + } + } else if (wavelet->width & 1) { + int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + } else { + lineBufL2[1] = band3Buf[0] + lineBufL2[0]; + } + } + + // process H band + for (int32_t i = 0; i < wavelet->width; i++) { + lineBufH0[i] = + lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + } + } else { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, + comp->tileFlag); + + for (int i = 0; i < wavelet->width; i++) { + lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); + } + } + + if (crxIdwt53FilterDecode(comp, curLevel) || + crxIdwt53FilterTransform(comp, curLevel)) { + return -1; + } + } else { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { + return -1; + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + + // process H band + if (wavelet->width <= 1) { + lineBufH0[0] = band0Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } else { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + + ++band0Buf; + ++band1Buf; + lineBufH0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } else { + lineBufH0[1] = band1Buf[0] + lineBufH0[0]; + } + } + + ++wavelet->curLine; + ++wavelet->curH; + wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; + } + } + + return 0; } -void crxConvertPlaneLine(CrxImage *img, int imageRow, int imageCol = 0, - int plane = 0, int32_t *lineData = 0, +void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) +{ + if (comp->compBuf) { + free(comp->compBuf); + comp->compBuf = nullptr; + } + + if (!comp->subBands) { + return; + } + + for (int32_t i = 0; i < image->subbandCount; i++) { + if (comp->subBands[i].bandParam) { + free(comp->subBands[i].bandParam); + comp->subBands[i].bandParam = nullptr; + } + + comp->subBands[i].bandBuf = nullptr; + comp->subBands[i].bandSize = 0; + } +} + +void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, + int plane = 0, const int32_t* lineData = nullptr, int lineLength = 0) { - if (lineData) - { - uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; - if (img->encType == 1) - { - int32_t maxVal = 1 << (img->nBits - 1); - int32_t minVal = -maxVal; - --maxVal; - for (int i = 0; i < lineLength; i++) - img->outBufs[plane][rawOffset + 2 * i] = - _constrain(lineData[i], minVal, maxVal); - } - else if (img->encType == 3) - { - // copy to intermediate planeBuf - rawOffset = plane * img->planeWidth * img->planeHeight + - img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) - img->planeBuf[rawOffset + i] = lineData[i]; - } - else if (img->nPlanes == 4) - { - int32_t median = 1 << (img->nBits - 1); - int32_t maxVal = (1 << img->nBits) - 1; - for (int i = 0; i < lineLength; i++) - img->outBufs[plane][rawOffset + 2 * i] = - _constrain(median + lineData[i], 0, maxVal); - } - else if (img->nPlanes == 1) - { - int32_t maxVal = (1 << img->nBits) - 1; - int32_t median = 1 << (img->nBits - 1); - rawOffset = img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) - img->outBufs[0][rawOffset + i] = - _constrain(median + lineData[i], 0, maxVal); - } - } - else if (img->encType == 3 && img->planeBuf) - { - int32_t planeSize = img->planeWidth * img->planeHeight; - int16_t *plane0 = img->planeBuf + imageRow * img->planeWidth; - int16_t *plane1 = plane0 + planeSize; - int16_t *plane2 = plane1 + planeSize; - int16_t *plane3 = plane2 + planeSize; + if (lineData) { + uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; - int32_t median = 1 << (img->nBits - 1) << 10; - int32_t maxVal = (1 << img->nBits) - 1; - uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + if (img->encType == 1) { + int32_t maxVal = 1 << (img->nBits - 1); + int32_t minVal = -maxVal; + --maxVal; - // for this stage - all except imageRow is ignored - for (int i = 0; i < img->planeWidth; i++) - { - int32_t gr = - median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - int32_t val = 0; - if (gr < 0) - gr = -(((_abs(gr) + 512) >> 9) & ~1); - else - gr = ((_abs(gr) + 512) >> 9) & ~1; + for (int i = 0; i < lineLength; i++) { + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(lineData[i], minVal, maxVal); + } + } else if (img->encType == 3) { + // copy to intermediate planeBuf + rawOffset = plane * img->planeWidth * img->planeHeight + + img->planeWidth * imageRow + imageCol; - // Essentially R = round(median + P0 + 1.474*P3) - val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; - img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) - val = (plane2[i] + gr + 1) >> 1; - img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) - val = (gr - plane2[i] + 1) >> 1; - img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially B = round(median + P0 + 1.881*P1) - val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; - img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + for (int i = 0; i < lineLength; i++) { + img->planeBuf[rawOffset + i] = lineData[i]; + } + } else if (img->nPlanes == 4) { + int32_t median = 1 << (img->nBits - 1); + int32_t maxVal = (1 << img->nBits) - 1; + + for (int i = 0; i < lineLength; i++) { + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(median + lineData[i], 0, maxVal); + } + } else if (img->nPlanes == 1) { + int32_t maxVal = (1 << img->nBits) - 1; + int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; + + for (int i = 0; i < lineLength; i++) { + img->outBufs[0][rawOffset + i] = + _constrain(median + lineData[i], 0, maxVal); + } + } + } else if (img->encType == 3 && img->planeBuf) { + int32_t planeSize = img->planeWidth * img->planeHeight; + int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; + int16_t* plane1 = plane0 + planeSize; + int16_t* plane2 = plane1 + planeSize; + int16_t* plane3 = plane2 + planeSize; + + int32_t median = 1 << (img->nBits - 1) << 10; + int32_t maxVal = (1 << img->nBits) - 1; + uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + + // for this stage - all except imageRow is ignored + for (int i = 0; i < img->planeWidth; i++) { + int32_t gr = + median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; + int32_t val = 0; + + if (gr < 0) { + gr = -(((_abs(gr) + 512) >> 9) & ~1); + } else { + gr = ((_abs(gr) + 512) >> 9) & ~1; + } + + // Essentially R = round(median + P0 + 1.474*P3) + val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) + val = (plane2[i] + gr + 1) >> 1; + img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) + val = (gr - plane2[i] + 1) >> 1; + img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially B = round(median + P0 + 1.881*P1) + val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; + img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + } } - } } -int crxParamInit(CrxBandParam **param, uint64_t subbandMdatOffset, +int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, uint64_t subbandDataSize, uint32_t subbandWidth, uint32_t subbandHeight, int32_t supportsPartial, - uint32_t roundedBitsMask, LibRaw_abstract_datastream *input) + uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) { - int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; - int32_t paramLength = 2 * subbandWidth + 4; - uint8_t *paramBuf = (uint8_t *)calloc( - 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; + int32_t paramLength = 2 * subbandWidth + 4; + uint8_t* paramBuf = (uint8_t*)calloc( + 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); - if (!paramBuf) - return -1; - - *param = (CrxBandParam *)paramBuf; - - paramBuf += sizeof(CrxBandParam); - - (*param)->paramData = (int32_t *)paramBuf; - (*param)->nonProgrData = - progrDataSize ? (*param)->paramData + paramLength : 0; - (*param)->subbandWidth = subbandWidth; - (*param)->subbandHeight = subbandHeight; - (*param)->roundedBits = 0; - (*param)->curLine = 0; - (*param)->roundedBitsMask = roundedBitsMask; - (*param)->supportsPartial = supportsPartial; - (*param)->bitStream.bitData = 0; - (*param)->bitStream.bitsLeft = 0; - (*param)->bitStream.mdatSize = subbandDataSize; - (*param)->bitStream.curPos = 0; - (*param)->bitStream.curBufSize = 0; - (*param)->bitStream.curBufOffset = subbandMdatOffset; - (*param)->bitStream.input = input; - - crxFillBuffer(&(*param)->bitStream); - - return 0; -} - -int crxSetupSubbandData(CrxImage *img, CrxPlaneComp *planeComp, - const CrxTile *tile, uint32_t mdatOffset) -{ - long compDataSize = 0; - long waveletDataOffset = 0; - long compCoeffDataOffset = 0; - int32_t toSubbands = 3 * img->levels + 1; - int32_t transformWidth = 0; - - CrxSubband *subbands = planeComp->subBands; - - // calculate sizes - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(int32_t); // 4bytes - compDataSize += subbands[subbandNum].bandSize; - } - - if (img->levels) - { - int32_t encLevels = img->levels ? img->levels : 1; - waveletDataOffset = (compDataSize + 7) & ~7; - compDataSize = - (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; - compCoeffDataOffset = compDataSize; - - // calc wavelet line buffer sizes (always at one level up from current) - for (int level = 0; level < img->levels; ++level) - if (level < img->levels - 1) - compDataSize += 8 * sizeof(int32_t) * - planeComp->subBands[3 * (level + 1) + 2].width; - else - compDataSize += 8 * sizeof(int32_t) * tile->width; - } - - // buffer allocation - planeComp->compBuf = (uint8_t *)malloc(compDataSize); - if (!planeComp->compBuf) - return -1; - - // subbands buffer and sizes initialisation - uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; - uint8_t *subbandBuf = planeComp->compBuf; - - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - subbands[subbandNum].bandBuf = subbandBuf; - subbandBuf += subbands[subbandNum].bandSize; - subbands[subbandNum].mdatOffset = - subbandMdatOffset + subbands[subbandNum].dataOffset; - } - - // wavelet data initialisation - if (img->levels) - { - CrxWaveletTransform *waveletTransforms = - (CrxWaveletTransform *)(planeComp->compBuf + waveletDataOffset); - int32_t *paramData = (int32_t *)(planeComp->compBuf + compCoeffDataOffset); - - planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (int32_t *)subbands->bandBuf; - - for (int level = 0; level < img->levels; ++level) - { - int32_t band = 3 * level + 1; - - if (level >= img->levels - 1) - { - waveletTransforms[level].height = tile->height; - transformWidth = tile->width; - } - else - { - waveletTransforms[level].height = subbands[band + 3].height; - transformWidth = subbands[band + 4].width; - } - waveletTransforms[level].width = transformWidth; - waveletTransforms[level].lineBuf[0] = paramData; - waveletTransforms[level].lineBuf[1] = - waveletTransforms[level].lineBuf[0] + transformWidth; - waveletTransforms[level].lineBuf[2] = - waveletTransforms[level].lineBuf[1] + transformWidth; - waveletTransforms[level].lineBuf[3] = - waveletTransforms[level].lineBuf[2] + transformWidth; - waveletTransforms[level].lineBuf[4] = - waveletTransforms[level].lineBuf[3] + transformWidth; - waveletTransforms[level].lineBuf[5] = - waveletTransforms[level].lineBuf[4] + transformWidth; - waveletTransforms[level].lineBuf[6] = - waveletTransforms[level].lineBuf[5] + transformWidth; - waveletTransforms[level].lineBuf[7] = - waveletTransforms[level].lineBuf[6] + transformWidth; - waveletTransforms[level].curLine = 0; - waveletTransforms[level].curH = 0; - waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (int32_t *)subbands[band].bandBuf; - waveletTransforms[level].subband2Buf = - (int32_t *)subbands[band + 1].bandBuf; - waveletTransforms[level].subband3Buf = - (int32_t *)subbands[band + 2].bandBuf; - - paramData = waveletTransforms[level].lineBuf[7] + transformWidth; - } - } - - // decoding params and bitstream initialisation - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - if (subbands[subbandNum].dataSize) - { - int32_t supportsPartial = 0; - uint32_t roundedBitsMask = 0; - - if (planeComp->supportsPartial && subbandNum == 0) - { - roundedBitsMask = planeComp->roundedBitsMask; - supportsPartial = 1; - } - if (crxParamInit(&subbands[subbandNum].bandParam, - subbands[subbandNum].mdatOffset, - subbands[subbandNum].dataSize, - subbands[subbandNum].width, subbands[subbandNum].height, - supportsPartial, roundedBitsMask, img->input)) + if (!paramBuf) { return -1; } - } - return 0; -} + *param = (CrxBandParam*)paramBuf; -} // namespace + paramBuf += sizeof(CrxBandParam); + (*param)->paramData = (int32_t*)paramBuf; + (*param)->nonProgrData = + progrDataSize ? (*param)->paramData + paramLength : nullptr; + (*param)->subbandWidth = subbandWidth; + (*param)->subbandHeight = subbandHeight; + (*param)->roundedBits = 0; + (*param)->curLine = 0; + (*param)->roundedBitsMask = roundedBitsMask; + (*param)->supportsPartial = supportsPartial; + (*param)->bitStream.bitData = 0; + (*param)->bitStream.bitsLeft = 0; + (*param)->bitStream.mdatSize = subbandDataSize; + (*param)->bitStream.curPos = 0; + (*param)->bitStream.curBufSize = 0; + (*param)->bitStream.curBufOffset = subbandMdatOffset; + (*param)->bitStream.input = input; -int DCraw::crxDecodePlane(void *p, uint32_t planeNumber) -{ - CrxImage *img = (CrxImage *)p; - int imageRow = 0; - for (int tRow = 0; tRow < img->tileRows; tRow++) - { - int imageCol = 0; - for (int tCol = 0; tCol < img->tileCols; tCol++) - { - CrxTile *tile = img->tiles + tRow * img->tileRows + tCol; - CrxPlaneComp *planeComp = tile->comps + planeNumber; - uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + crxFillBuffer(&(*param)->bitStream); - // decode single tile - if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) - return -1; - - if (img->levels) - { - if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) - return -1; - for (int i = 0; i < tile->height; ++i) - { - if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || - crxIdwt53FilterTransform(planeComp, img->levels - 1)) - return -1; - int32_t *lineData = - crxIdwt53FilterGetLine(planeComp, img->levels - 1); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); - } - } - else - { - // we have the only subband in this case - if (!planeComp->subBands->dataSize) - { - memset(planeComp->subBands->bandBuf, 0, - planeComp->subBands->bandSize); - return 0; - } - - for (int i = 0; i < tile->height; ++i) - { - if (crxDecodeLine(planeComp->subBands->bandParam, - planeComp->subBands->bandBuf)) - return -1; - int32_t *lineData = (int32_t *)planeComp->subBands->bandBuf; - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); - } - } - imageCol += tile->width; - } - imageRow += img->tiles[tRow * img->tileRows].height; - } - - return 0; -} - - -namespace { - -typedef DCraw::CanonCR3Data::crx_data_header_t crx_data_header_t; - - -int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, - CrxPlaneComp *comp, uint8_t **subbandMdatPtr, - uint32_t *mdatSize) -{ - CrxSubband *band = comp->subBands + img->subbandCount - 1; // set to last band - uint32_t bandHeight = tile->height; - uint32_t bandWidth = tile->width; - int32_t bandWidthExCoef = 0; - int32_t bandHeightExCoef = 0; - if (img->levels) - { - // Build up subband sequences to crxDecode to a level in a header - - // Coefficient structure is a bit unclear and convoluted: - // 3 levels max - 8 groups (for tile width rounded to 8 bytes) - // of 3 band per level 4 sets of coefficients for each - int32_t *rowExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - int32_t *colExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); - for (int level = 0; level < img->levels; ++level) - { - int32_t widthOddPixel = bandWidth & 1; - int32_t heightOddPixel = bandHeight & 1; - bandWidth = (widthOddPixel + bandWidth) >> 1; - bandHeight = (heightOddPixel + bandHeight) >> 1; - - int32_t bandWidthExCoef0 = 0; - int32_t bandWidthExCoef1 = 0; - int32_t bandHeightExCoef0 = 0; - int32_t bandHeightExCoef1 = 0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - bandWidthExCoef0 = rowExCoef[0]; - bandWidthExCoef1 = rowExCoef[1]; - } - if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) - ++bandWidthExCoef0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) - { - bandHeightExCoef0 = colExCoef[0]; - bandHeightExCoef1 = colExCoef[1]; - } - if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) - ++bandHeightExCoef0; - - band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; - band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; - - band[-1].width = bandWidth + bandWidthExCoef1; - band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; - - band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; - band[-2].height = bandHeight + bandHeightExCoef1; - - rowExCoef += 4; - colExCoef += 4; - band -= 3; - } - bandWidthExCoef = bandHeightExCoef = 0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - bandWidthExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + - 4 * (img->levels - 1) + 1]; - if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) - bandHeightExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + - 4 * (img->levels - 1) + 1]; - } - band->width = bandWidthExCoef + bandWidth; - band->height = bandHeightExCoef + bandHeight; - - if (!img->subbandCount) return 0; - int32_t subbandOffset = 0; - band = comp->subBands; - for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) - { - if (*mdatSize < 0xC) - return -1; - - if (sgetn(2, *subbandMdatPtr) != 0xFF03) - return -1; - - uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); - - if (curSubband != bitData >> 28) - { - band->dataSize = subbandSize; - return -1; - } - band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = bitData & 0x8000 ? 1 : 0; - band->dataOffset = subbandOffset; - band->quantValue = (bitData >> 19) & 0xFF; - band->paramK = 0; - band->bandParam = 0; - band->bandBuf = 0; - band->bandSize = 0; - - subbandOffset += subbandSize; - - *subbandMdatPtr += 0xC; - *mdatSize -= 0xC; - } - return 0; } -int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, +int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, + const CrxTile* tile, uint32_t mdatOffset) +{ + long compDataSize = 0; + long waveletDataOffset = 0; + long compCoeffDataOffset = 0; + int32_t toSubbands = 3 * img->levels + 1; + int32_t transformWidth = 0; + + CrxSubband* subbands = planeComp->subBands; + + // calculate sizes + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + subbands[subbandNum].bandSize = + subbands[subbandNum].width * sizeof(int32_t); // 4bytes + compDataSize += subbands[subbandNum].bandSize; + } + + if (img->levels) { + int32_t encLevels = img->levels ? img->levels : 1; + waveletDataOffset = (compDataSize + 7) & ~7; + compDataSize = + (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compCoeffDataOffset = compDataSize; + + // calc wavelet line buffer sizes (always at one level up from current) + for (int level = 0; level < img->levels; ++level) { + if (level < img->levels - 1) { + compDataSize += 8 * sizeof(int32_t) * + planeComp->subBands[3 * (level + 1) + 2].width; + } else { + compDataSize += 8 * sizeof(int32_t) * tile->width; + } + } + } + + // buffer allocation + planeComp->compBuf = (uint8_t*)malloc(compDataSize); + + if (!planeComp->compBuf) { + return -1; + } + + // subbands buffer and sizes initialisation + uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + uint8_t* subbandBuf = planeComp->compBuf; + + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + subbands[subbandNum].bandBuf = subbandBuf; + subbandBuf += subbands[subbandNum].bandSize; + subbands[subbandNum].mdatOffset = + subbandMdatOffset + subbands[subbandNum].dataOffset; + } + + // wavelet data initialisation + if (img->levels) { + CrxWaveletTransform* waveletTransforms = + (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); + int32_t* paramData = (int32_t*)(planeComp->compBuf + compCoeffDataOffset); + + planeComp->waveletTransform = waveletTransforms; + waveletTransforms[0].subband0Buf = (int32_t*)subbands->bandBuf; + + for (int level = 0; level < img->levels; ++level) { + int32_t band = 3 * level + 1; + + if (level >= img->levels - 1) { + waveletTransforms[level].height = tile->height; + transformWidth = tile->width; + } else { + waveletTransforms[level].height = subbands[band + 3].height; + transformWidth = subbands[band + 4].width; + } + + waveletTransforms[level].width = transformWidth; + waveletTransforms[level].lineBuf[0] = paramData; + waveletTransforms[level].lineBuf[1] = + waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = + waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = + waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = + waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = + waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = + waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = + waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].curLine = 0; + waveletTransforms[level].curH = 0; + waveletTransforms[level].fltTapH = 0; + waveletTransforms[level].subband1Buf = (int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband2Buf = + (int32_t*)subbands[band + 1].bandBuf; + waveletTransforms[level].subband3Buf = + (int32_t*)subbands[band + 2].bandBuf; + + paramData = waveletTransforms[level].lineBuf[7] + transformWidth; + } + } + + // decoding params and bitstream initialisation + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + if (subbands[subbandNum].dataSize) { + int32_t supportsPartial = 0; + uint32_t roundedBitsMask = 0; + + if (planeComp->supportsPartial && subbandNum == 0) { + roundedBitsMask = planeComp->roundedBitsMask; + supportsPartial = 1; + } + + if (crxParamInit(&subbands[subbandNum].bandParam, + subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, + subbands[subbandNum].width, subbands[subbandNum].height, + supportsPartial, roundedBitsMask, img->input)) { + return -1; + } + } + } + + return 0; +} +} // namespace + +int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) +{ + CrxImage* img = (CrxImage*)p; + int imageRow = 0; + + for (int tRow = 0; tRow < img->tileRows; tRow++) { + int imageCol = 0; + + for (int tCol = 0; tCol < img->tileCols; tCol++) { + CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; + CrxPlaneComp* planeComp = tile->comps + planeNumber; + uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + + // decode single tile + if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { + return -1; + } + + if (img->levels) { + if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { + return -1; + } + + for (int i = 0; i < tile->height; ++i) { + if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || + crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + return -1; + } + + int32_t* lineData = + crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } else { + // we have the only subband in this case + if (!planeComp->subBands->dataSize) { + memset(planeComp->subBands->bandBuf, 0, + planeComp->subBands->bandSize); + return 0; + } + + for (int i = 0; i < tile->height; ++i) { + if (crxDecodeLine(planeComp->subBands->bandParam, + planeComp->subBands->bandBuf)) { + return -1; + } + + int32_t* lineData = (int32_t*)planeComp->subBands->bandBuf; + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } + + imageCol += tile->width; + } + + imageRow += img->tiles[tRow * img->tileRows].height; + } + + return 0; +} + +namespace +{ +using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; + +int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, + CrxPlaneComp* comp, uint8_t** subbandMdatPtr, + uint32_t* mdatSize) +{ + CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band + uint32_t bandHeight = tile->height; + uint32_t bandWidth = tile->width; + int32_t bandWidthExCoef = 0; + int32_t bandHeightExCoef = 0; + + if (img->levels) { + // Build up subband sequences to crxDecode to a level in a header + + // Coefficient structure is a bit unclear and convoluted: + // 3 levels max - 8 groups (for tile width rounded to 8 bytes) + // of 3 band per level 4 sets of coefficients for each + int32_t* rowExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); + int32_t* colExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + + for (int level = 0; level < img->levels; ++level) { + int32_t widthOddPixel = bandWidth & 1; + int32_t heightOddPixel = bandHeight & 1; + bandWidth = (widthOddPixel + bandWidth) >> 1; + bandHeight = (heightOddPixel + bandHeight) >> 1; + + int32_t bandWidthExCoef0 = 0; + int32_t bandWidthExCoef1 = 0; + int32_t bandHeightExCoef0 = 0; + int32_t bandHeightExCoef1 = 0; + + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + bandWidthExCoef0 = rowExCoef[0]; + bandWidthExCoef1 = rowExCoef[1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + ++bandWidthExCoef0; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { + bandHeightExCoef0 = colExCoef[0]; + bandHeightExCoef1 = colExCoef[1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) { + ++bandHeightExCoef0; + } + + band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-1].width = bandWidth + bandWidthExCoef1; + band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[-2].height = bandHeight + bandHeightExCoef1; + + rowExCoef += 4; + colExCoef += 4; + band -= 3; + } + + bandWidthExCoef = bandHeightExCoef = 0; + + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + bandWidthExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + + 4 * (img->levels - 1) + 1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { + bandHeightExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + + 4 * (img->levels - 1) + 1]; + } + } + + band->width = bandWidthExCoef + bandWidth; + band->height = bandHeightExCoef + bandHeight; + + if (!img->subbandCount) { + return 0; + } + + int32_t subbandOffset = 0; + band = comp->subBands; + + for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { + if (*mdatSize < 0xC) { + return -1; + } + + if (sgetn(2, *subbandMdatPtr) != 0xFF03) { + return -1; + } + + uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + + if (curSubband != bitData >> 28) { + band->dataSize = subbandSize; + return -1; + } + + band->dataSize = subbandSize - (bitData & 0x7FF); + band->supportsPartial = bitData & 0x8000 ? 1 : 0; + band->dataOffset = subbandOffset; + band->quantValue = (bitData >> 19) & 0xFF; + band->paramK = 0; + band->bandParam = nullptr; + band->bandBuf = nullptr; + band->bandSize = 0; + + subbandOffset += subbandSize; + + *subbandMdatPtr += 0xC; + *mdatSize -= 0xC; + } + + return 0; +} + +int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, uint32_t mdatSize) { - unsigned int nTiles = img->tileRows * img->tileCols; + unsigned int nTiles = img->tileRows * img->tileCols; - if (!nTiles) - return -1; + if (!nTiles) { + return -1; + } - if (!img->tiles) - { - img->tiles = (CrxTile *)malloc( - sizeof(CrxTile) * nTiles + - sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); - if (!img->tiles) - return -1; + if (!img->tiles) { + img->tiles = (CrxTile*)malloc( + sizeof(CrxTile) * nTiles + + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); - // memory areas in allocated chunk - CrxTile *tile = img->tiles; - CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); - CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); - - for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) - { - tile->tileFlag = 0; // tile neighbouring flags - tile->tileNumber = curTile; - tile->tileSize = 0; - tile->comps = comps + curTile * img->nPlanes; - - if ((curTile + 1) % img->tileCols) - { - // not the last tile in a tile row - tile->width = hdr->tileWidth; - if (img->tileCols > 1) - { - tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; - if (curTile % img->tileCols) - // not the first tile in tile row - tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + if (!img->tiles) { + return -1; } - } - else - { - // last tile in a tile row - tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); - if (img->tileCols > 1) - tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; - } - if (curTile < nTiles - img->tileCols) - { - // in first tile row - tile->height = hdr->tileHeight; - if (img->tileRows > 1) - { - tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; - if (curTile >= img->tileCols) - tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; - } - } - else - { - // non first tile row - tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); - if (img->tileRows > 1) - tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; - } - if (img->nPlanes) - { - CrxPlaneComp *comp = tile->comps; - CrxSubband *band = bands + curTile * img->nPlanes * img->subbandCount; - for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) - { - comp->compNumber = curComp; - comp->supportsPartial = 1; - comp->tileFlag = tile->tileFlag; - comp->subBands = band; - comp->compBuf = 0; - comp->waveletTransform = 0; - if (img->subbandCount) - { - for (int curBand = 0; curBand < img->subbandCount; - curBand++, band++) - { - band->supportsPartial = 0; - band->quantValue = 4; - band->bandParam = 0; - band->dataSize = 0; + // memory areas in allocated chunk + CrxTile* tile = img->tiles; + CrxPlaneComp* comps = (CrxPlaneComp*)(tile + nTiles); + CrxSubband* bands = (CrxSubband*)(comps + img->nPlanes * nTiles); + + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { + tile->tileFlag = 0; // tile neighbouring flags + tile->tileNumber = curTile; + tile->tileSize = 0; + tile->comps = comps + curTile * img->nPlanes; + + if ((curTile + 1) % img->tileCols) { + // not the last tile in a tile row + tile->width = hdr->tileWidth; + + if (img->tileCols > 1) { + tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; + + if (curTile % img->tileCols) { + // not the first tile in tile row + tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + } + } + } else { + // last tile in a tile row + tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); + + if (img->tileCols > 1) { + tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; + } + } + + if (curTile < nTiles - img->tileCols) { + // in first tile row + tile->height = hdr->tileHeight; + + if (img->tileRows > 1) { + tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; + + if (curTile >= img->tileCols) { + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + } else { + // non first tile row + tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); + + if (img->tileRows > 1) { + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + + if (img->nPlanes) { + CrxPlaneComp* comp = tile->comps; + CrxSubband* band = bands + curTile * img->nPlanes * img->subbandCount; + + for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) { + comp->compNumber = curComp; + comp->supportsPartial = 1; + comp->tileFlag = tile->tileFlag; + comp->subBands = band; + comp->compBuf = nullptr; + comp->waveletTransform = nullptr; + + if (img->subbandCount) { + for (int curBand = 0; curBand < img->subbandCount; + curBand++, band++) { + band->supportsPartial = 0; + band->quantValue = 4; + band->bandParam = nullptr; + band->dataSize = 0; + } + } + } } - } } - } } - } - uint32_t tileOffset = 0; - uint32_t dataSize = mdatSize; - uint8_t *dataPtr = mdatPtr; - CrxTile *tile = img->tiles; + uint32_t tileOffset = 0; + uint32_t dataSize = mdatSize; + uint8_t* dataPtr = mdatPtr; + CrxTile* tile = img->tiles; - for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) - { - if (dataSize < 0xC) - return -1; + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { + if (dataSize < 0xC) { + return -1; + } - if (sgetn(2, dataPtr) != 0xFF01) - return -1; - if (sgetn(2, dataPtr + 8) != curTile) - return -1; + if (sgetn(2, dataPtr) != 0xFF01) { + return -1; + } - dataSize -= 0xC; + if (sgetn(2, dataPtr + 8) != curTile) { + return -1; + } - tile->tileSize = sgetn(4, dataPtr + 4); - tile->dataOffset = tileOffset; + dataSize -= 0xC; - int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; - tileOffset += tile->tileSize; - dataPtr += hdrExtraBytes + 0xC; - dataSize -= hdrExtraBytes; + tile->tileSize = sgetn(4, dataPtr + 4); + tile->dataOffset = tileOffset; - uint32_t compOffset = 0; - CrxPlaneComp *comp = tile->comps; + int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + tileOffset += tile->tileSize; + dataPtr += hdrExtraBytes + 0xC; + dataSize -= hdrExtraBytes; - for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) - { - if (dataSize < 0xC) - return -1; + uint32_t compOffset = 0; + CrxPlaneComp* comp = tile->comps; - if (sgetn(2, dataPtr) != 0xFF02) - return -1; - if (compNum != dataPtr[8] >> 4) - return -1; + for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { + if (dataSize < 0xC) { + return -1; + } - comp->compSize = sgetn(4, dataPtr + 4); + if (sgetn(2, dataPtr) != 0xFF02) { + return -1; + } - int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; - comp->supportsPartial = (dataPtr[8] & 8) != 0; + if (compNum != dataPtr[8] >> 4) { + return -1; + } - comp->dataOffset = compOffset; - comp->tileFlag = tile->tileFlag; + comp->compSize = sgetn(4, dataPtr + 4); - compOffset += comp->compSize; - dataSize -= 0xC; - dataPtr += 0xC; + int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + comp->supportsPartial = (dataPtr[8] & 8) != 0; - comp->roundedBitsMask = 0; + comp->dataOffset = compOffset; + comp->tileFlag = tile->tileFlag; - if (compHdrRoundedBits) - { - if (img->levels || !comp->supportsPartial) - return -1; + compOffset += comp->compSize; + dataSize -= 0xC; + dataPtr += 0xC; - comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); - } + comp->roundedBitsMask = 0; - if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) - return -1; + if (compHdrRoundedBits) { + if (img->levels || !comp->supportsPartial) { + return -1; + } + + comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); + } + + if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) { + return -1; + } + } } - } - return 0; + + return 0; } -int crxSetupImageData(crx_data_header_t *hdr, CrxImage *img, int16_t *outBuf, +int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, uint64_t mdatOffset, uint32_t mdatSize, - uint8_t *mdatHdrPtr) + uint8_t* mdatHdrPtr) { - int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0}; + int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 + }; - img->planeWidth = hdr->f_width; - img->planeHeight = hdr->f_height; + img->planeWidth = hdr->f_width; + img->planeHeight = hdr->f_height; - if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || - img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) - return -1; - - img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; - img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; - - if (img->tileCols > 0xFF || img->tileRows > 0xFF || - img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || - img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) - return -1; - - img->tiles = 0; - img->levels = hdr->imageLevels; - img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL - img->nPlanes = hdr->nPlanes; - img->nBits = hdr->nBits; - img->encType = hdr->encType; - img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; - img->mdatOffset = mdatOffset + hdr->mdatHdrSize; - img->mdatSize = mdatSize; - img->planeBuf = 0; - img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = 0; - - // The encoding type 3 needs all 4 planes to be decoded to generate row of - // RGGB values. It seems to be using some other colour space for raw encoding - // It is a massive buffer so ideallly it will need a different approach: - // decode planes line by line and convert single line then without - // intermediate plane buffer. At the moment though it's too many changes so - // left as is. - if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) - { - img->planeBuf = - (int16_t *)malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3)); - if (!img->planeBuf) - return -1; - } - - int32_t rowSize = 2 * img->planeWidth; - - if (img->nPlanes == 1) - img->outBufs[0] = outBuf; - else - switch (hdr->cfaLayout) - { - case 0: - // R G - // G B - img->outBufs[0] = outBuf; - img->outBufs[1] = outBuf + 1; - img->outBufs[2] = outBuf + rowSize; - img->outBufs[3] = img->outBufs[2] + 1; - break; - case 1: - // G R - // B G - img->outBufs[1] = outBuf; - img->outBufs[0] = outBuf + 1; - img->outBufs[3] = outBuf + rowSize; - img->outBufs[2] = img->outBufs[3] + 1; - break; - case 2: - // G B - // R G - img->outBufs[2] = outBuf; - img->outBufs[3] = outBuf + 1; - img->outBufs[0] = outBuf + rowSize; - img->outBufs[1] = img->outBufs[0] + 1; - break; - case 3: - // B G - // G R - img->outBufs[3] = outBuf; - img->outBufs[2] = outBuf + 1; - img->outBufs[1] = outBuf + rowSize; - img->outBufs[0] = img->outBufs[1] + 1; - break; + if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || + img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) { + return -1; } - // read header - return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); + img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; + img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; + + if (img->tileCols > 0xFF || img->tileRows > 0xFF || + img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || + img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { + return -1; + } + + img->tiles = nullptr; + img->levels = hdr->imageLevels; + img->subbandCount = 3 * img->levels + 1;// 3 bands per level + one last LL + img->nPlanes = hdr->nPlanes; + img->nBits = hdr->nBits; + img->encType = hdr->encType; + img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; + img->mdatOffset = mdatOffset + hdr->mdatHdrSize; + img->mdatSize = mdatSize; + img->planeBuf = nullptr; + img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = nullptr; + + // The encoding type 3 needs all 4 planes to be decoded to generate row of + // RGGB values. It seems to be using some other colour space for raw encoding + // It is a massive buffer so ideallly it will need a different approach: + // decode planes line by line and convert single line then without + // intermediate plane buffer. At the moment though it's too many changes so + // left as is. + if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { + img->planeBuf = + (int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * + ((img->samplePrecision + 7) >> 3)); + + if (!img->planeBuf) { + return -1; + } + } + + int32_t rowSize = 2 * img->planeWidth; + + if (img->nPlanes == 1) { + img->outBufs[0] = outBuf; + } else { + switch (hdr->cfaLayout) { + case 0: { + // R G + // G B + img->outBufs[0] = outBuf; + img->outBufs[1] = outBuf + 1; + img->outBufs[2] = outBuf + rowSize; + img->outBufs[3] = img->outBufs[2] + 1; + break; + } + + case 1: { + // G R + // B G + img->outBufs[1] = outBuf; + img->outBufs[0] = outBuf + 1; + img->outBufs[3] = outBuf + rowSize; + img->outBufs[2] = img->outBufs[3] + 1; + break; + } + + case 2: { + // G B + // R G + img->outBufs[2] = outBuf; + img->outBufs[3] = outBuf + 1; + img->outBufs[0] = outBuf + rowSize; + img->outBufs[1] = img->outBufs[0] + 1; + break; + } + + case 3: { + // B G + // G R + img->outBufs[3] = outBuf; + img->outBufs[2] = outBuf + 1; + img->outBufs[1] = outBuf + rowSize; + img->outBufs[0] = img->outBufs[1] + 1; + break; + } + } + } + + // read header + return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); } -int crxFreeImageData(CrxImage *img) +int crxFreeImageData(CrxImage* img) { - CrxTile *tile = img->tiles; - int nTiles = img->tileRows * img->tileCols; + CrxTile* tile = img->tiles; + int nTiles = img->tileRows * img->tileCols; - if (img->tiles) - { - for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) - if (tile[curTile].comps) - for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) - crxFreeSubbandData(img, tile[curTile].comps + curPlane); - free(img->tiles); - img->tiles = 0; - } + if (img->tiles) { + for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { + if (tile[curTile].comps) { + for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + crxFreeSubbandData(img, tile[curTile].comps + curPlane); + } + } + } - if (img->planeBuf) - { - free(img->planeBuf); - img->planeBuf = 0; - } + free(img->tiles); + img->tiles = nullptr; + } - return 0; + if (img->planeBuf) { + free(img->planeBuf); + img->planeBuf = nullptr; + } + + return 0; } +} // namespace -} // namespace - -void DCraw::crxLoadDecodeLoop(void *img, int nPlanes) +void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) { #ifdef _OPENMP - int results[4]; // nPlanes is always <= 4 -#pragma omp parallel for - for (int32_t plane = 0; plane < nPlanes; ++plane) - results[plane] = crxDecodePlane(img, plane); + int results[4]; // nPlanes is always <= 4 + #pragma omp parallel for + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + results[plane] = crxDecodePlane(img, plane); + } + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + if (results[plane]) { + derror(); + } + } - for (int32_t plane = 0; plane < nPlanes; ++plane) - if (results[plane]) - derror(); #else - for (int32_t plane = 0; plane < nPlanes; ++plane) - if (crxDecodePlane(img, plane)) - derror(); + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + if (crxDecodePlane(img, plane)) { + derror(); + } + } + #endif } -void DCraw::crxConvertPlaneLineDf(void *p, int imageRow) +void DCraw::crxConvertPlaneLineDf(void* p, int imageRow) { - crxConvertPlaneLine((CrxImage *)p, imageRow); + crxConvertPlaneLine((CrxImage*)p, imageRow); } -void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) +void DCraw::crxLoadFinalizeLoopE3(void* p, int planeHeight) { #ifdef _OPENMP -#pragma omp parallel for + #pragma omp parallel for #endif - for (int i = 0; i < planeHeight; ++i) - crxConvertPlaneLineDf(p, i); + + for (int i = 0; i < planeHeight; ++i) { + crxConvertPlaneLineDf(p, i); + } } void DCraw::crxLoadRaw() { - CrxImage img; - if (RT_canon_CR3_data.crx_track_selected >= - LIBRAW_CRXTRACKS_MAXCOUNT) - derror(); - crx_data_header_t hdr = - RT_canon_CR3_data - .crx_header[RT_canon_CR3_data.crx_track_selected]; + CrxImage img; - LibRaw_abstract_datastream input = { ifp }; - img.input = &input; //libraw_internal_data.internal_data.input; + if (RT_canon_CR3_data.crx_track_selected >= + LIBRAW_CRXTRACKS_MAXCOUNT) { + derror(); + } - // update sizes for the planes - if (hdr.nPlanes == 4) - { - hdr.f_width >>= 1; - hdr.f_height >>= 1; - hdr.tileWidth >>= 1; - hdr.tileHeight >>= 1; - } + crx_data_header_t hdr = + RT_canon_CR3_data + .crx_header[RT_canon_CR3_data.crx_track_selected]; + + LibRaw_abstract_datastream input = {ifp}; + img.input = &input; // libraw_internal_data.internal_data.input; + + // update sizes for the planes + if (hdr.nPlanes == 4) { + hdr.f_width >>= 1; + hdr.f_height >>= 1; + hdr.tileWidth >>= 1; + hdr.tileHeight >>= 1; + } // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - uint8_t *hdrBuf = (uint8_t *)malloc(hdr.mdatHdrSize); + uint8_t* hdrBuf = (uint8_t*)malloc(hdr.mdatHdrSize); - // read image header + // read image header #ifdef _OPENMP -#pragma omp critical + #pragma omp critical #endif - { + { #ifndef _OPENMP - /*libraw_internal_data.internal_data.input->*/input.lock(); + /*libraw_internal_data.internal_data.input->*/ input.lock(); #endif - /*libraw_internal_data.internal_data.input->*/input.seek( - data_offset, SEEK_SET); - /*libraw_internal_data.internal_data.input->*/input.read(hdrBuf, 1, hdr.mdatHdrSize); + /*libraw_internal_data.internal_data.input->*/ input.seek( + data_offset, SEEK_SET); + /*libraw_internal_data.internal_data.input->*/ input.read(hdrBuf, 1, hdr.mdatHdrSize); #ifndef _OPENMP - /*libraw_internal_data.internal_data.input->*/input.unlock(); + /*libraw_internal_data.internal_data.input->*/ input.unlock(); #endif - } + } - // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (int16_t *)raw_image, - hdr.MediaOffset/*data_offset*/, - hdr.MediaSize/*RT_canon_CR3_data.data_size*/, hdrBuf)) - derror(); - free(hdrBuf); + // parse and setup the image data + if (crxSetupImageData(&hdr, &img, (int16_t*)raw_image, + hdr.MediaOffset /*data_offset*/, + hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { + derror(); + } - crxLoadDecodeLoop(&img, hdr.nPlanes); + free(hdrBuf); - if (img.encType == 3) - crxLoadFinalizeLoopE3(&img, img.planeHeight); + crxLoadDecodeLoop(&img, hdr.nPlanes); - crxFreeImageData(&img); + if (img.encType == 3) { + crxLoadFinalizeLoopE3(&img, img.planeHeight); + } + + crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack) +int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) - return -1; - if (!cmp1TagData) - return -1; + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + return -1; + } - crx_data_header_t *hdr = - &RT_canon_CR3_data.crx_header[nTrack]; + if (!cmp1TagData) { + return -1; + } - hdr->version = sgetn(2, cmp1TagData + 4); - hdr->f_width = sgetn(4, cmp1TagData + 8); - hdr->f_height = sgetn(4, cmp1TagData + 12); - hdr->tileWidth = sgetn(4, cmp1TagData + 16); - hdr->tileHeight = sgetn(4, cmp1TagData + 20); - hdr->nBits = cmp1TagData[24]; - hdr->nPlanes = cmp1TagData[25] >> 4; - hdr->cfaLayout = cmp1TagData[25] & 0xF; - hdr->encType = cmp1TagData[26] >> 4; - hdr->imageLevels = cmp1TagData[26] & 0xF; - hdr->hasTileCols = cmp1TagData[27] >> 7; - hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; - hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); + crx_data_header_t* hdr = + &RT_canon_CR3_data.crx_header[nTrack]; - // validation - if (hdr->version != 0x100 || !hdr->mdatHdrSize) - return -1; - if (hdr->encType == 1) - { - if (hdr->nBits > 15) - return -1; - } - else - { - if (hdr->encType && hdr->encType != 3) - return -1; - if (hdr->nBits > 14) - return -1; - } + hdr->version = sgetn(2, cmp1TagData + 4); + hdr->f_width = sgetn(4, cmp1TagData + 8); + hdr->f_height = sgetn(4, cmp1TagData + 12); + hdr->tileWidth = sgetn(4, cmp1TagData + 16); + hdr->tileHeight = sgetn(4, cmp1TagData + 20); + hdr->nBits = cmp1TagData[24]; + hdr->nPlanes = cmp1TagData[25] >> 4; + hdr->cfaLayout = cmp1TagData[25] & 0xF; + hdr->encType = cmp1TagData[26] >> 4; + hdr->imageLevels = cmp1TagData[26] & 0xF; + hdr->hasTileCols = cmp1TagData[27] >> 7; + hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; + hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); - if (hdr->nPlanes == 1) - { - if (hdr->cfaLayout || hdr->encType) - return -1; - if (hdr->nBits != 8) - return -1; - } - else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || - (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || - (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || - hdr->nBits == 8) - return -1; + // validation + if (hdr->version != 0x100 || !hdr->mdatHdrSize) { + return -1; + } - if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) - return -1; + if (hdr->encType == 1) { + if (hdr->nBits > 15) { + return -1; + } + } else { + if (hdr->encType && hdr->encType != 3) { + return -1; + } - if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) - return -1; - return 0; + if (hdr->nBits > 14) { + return -1; + } + } + + if (hdr->nPlanes == 1) { + if (hdr->cfaLayout || hdr->encType) { + return -1; + } + + if (hdr->nBits != 8) { + return -1; + } + } else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || + (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || + (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || + hdr->nBits == 8) { + return -1; + } + + if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) { + return -1; + } + + if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) { + return -1; + } + + return 0; } #undef _abs From 2ae5f198d7237cbec8649123ed2b0e0e94de5f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 22 Nov 2019 10:40:01 +0100 Subject: [PATCH 007/100] Cleanups for the first few lines --- rtengine/canon_cr3_decoder.cc | 730 +++++++++++++++++----------------- 1 file changed, 375 insertions(+), 355 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 01bca72f8..609f0c849 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -51,42 +51,40 @@ */ +#include +#include #include -#include #include "dcraw.h" void DCraw::parse_canon_cr3() { - int err; - unsigned long long szAtomList; + strncpy(make, "Canon", sizeof(make)); + + unsigned long long szAtomList = ifp->size; short nesting = -1; + char AtomNameStack[128]; unsigned short nTrack = 0; short TrackType; - char AtomNameStack[128]; - strcpy(make, "Canon"); - szAtomList = ifp->size; - err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); + const int err = parseCR3(0, szAtomList, nesting, AtomNameStack, nTrack, TrackType); if (err == 0 || err == -14) { // no error, or too deep nesting selectCRXTrack(nTrack); } } -#define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT - void DCraw::selectCRXTrack(unsigned short maxTrack) { - INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; - uint32_t maxjpegbytes = 0; - memset(bitcounts, 0, sizeof(bitcounts)); + std::int64_t bitcounts[RT_canon_CR3_data.CRXTRACKS_MAXCOUNT] = {}; + std::int64_t maxbitcount = 0; + std::uint32_t maxjpegbytes = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { - CanonCR3Data::crx_data_header_t* d = &RT_canon_CR3_data.crx_header[i]; + for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { + CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[i]; if (d->MediaType == 1) {// RAW - bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + bitcounts[i] = std::int64_t(d->nBits) * std::int64_t(d->f_width) * std::int64_t(d->f_height); if (bitcounts[i] > maxbitcount) { maxbitcount = bitcounts[i]; @@ -105,9 +103,10 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } bool has_framei = false; - unsigned int framei = 0, framecnt = 0; + unsigned int framei = 0; + unsigned int framecnt = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { if (bitcounts[i] == maxbitcount) { if (framecnt <= shot_select) { has_framei = true; @@ -121,8 +120,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) is_raw = framecnt; if (has_framei) { - CanonCR3Data::crx_data_header_t* d = - &RT_canon_CR3_data.crx_header[framei]; + CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[framei]; data_offset = d->MediaOffset; // data_size = d->MediaSize; raw_width = d->f_width; @@ -154,11 +152,11 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) RT_canon_CR3_data.crx_track_selected = framei; int tiff_idx = -1; - INT64 tpixels = 0; + std::int64_t tpixels = 0; for (unsigned int i = 0; i < tiff_nifds; i++) { - if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { - tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); + if (std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height) > tpixels) { + tpixels = std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height); tiff_idx = i; } } @@ -169,14 +167,14 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } } -#define FORC4 for (c = 0; c < 4; c++) - -#define bad_hdr \ - (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ - (get4() != 0x00000008)) -int DCraw::parseCR3(unsigned long long oAtomList, - unsigned long long szAtomList, short& nesting, - char* AtomNameStack, unsigned short& nTrack, short& TrackType) +int DCraw::parseCR3( + unsigned long long oAtomList, + unsigned long long szAtomList, + short& nesting, + char* AtomNameStack, + unsigned short& nTrack, + short& TrackType +) { /* Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name @@ -289,17 +287,22 @@ int DCraw::parseCR3(unsigned long long oAtomList, ushort tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name - unsigned long long oAtom, szAtom; // Atom offset and Atom size - unsigned long long oAtomContent, - szAtomContent; // offset and size of Atom content + unsigned long long oAtom; + unsigned long long szAtom; // Atom offset and Atom size + unsigned long long oAtomContent; + unsigned long long szAtomContent; // offset and size of Atom content unsigned long long lHdr; char UIID[16]; uchar CMP1[36]; - char HandlerType[5], MediaFormatID[5]; + char HandlerType[5]; + char MediaFormatID[5]; // unsigned ImageWidth, ImageHeight; - long relpos_inDir, relpos_inBox; - unsigned szItem, Tag, lTag; + long relpos_inDir; + long relpos_inBox; + unsigned szItem; + unsigned Tag; + unsigned lTag; ushort tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; @@ -314,13 +317,27 @@ int DCraw::parseCR3(unsigned long long oAtomList, short s_order = order; + const auto is_bad_header = + [this]() -> bool + { + return + ( + order != 0x4D4D + && order != 0x4949 + ) + || get2() != 0x002A + || get4() != 0x00000008; + }; + while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { lHdr = 0ULL; err = 0; order = 0x4d4d; fseek(ifp, oAtom, SEEK_SET); szAtom = get4(); - FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + } AtomNameStack[(nesting + 1) * 4] = '\0'; tL = 4; AtomType = 0; @@ -364,7 +381,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, nTrack++; TrackType = 0; - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { break; } } @@ -384,7 +401,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -4; goto fin; } @@ -395,7 +412,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -5; goto fin; } @@ -406,7 +423,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -6; goto fin; } @@ -418,19 +435,21 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -6; goto fin; } - INT64 off = ftell(ifp); + std::int64_t off = ftell(ifp); parse_gps(oAtomContent); fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { fseek(ifp, 8L, SEEK_CUR); - FORC4 HandlerType[c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + HandlerType[c] = fgetc(ifp); + } for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { if (!strcmp(HandlerType, sHandlerType[c])) { @@ -447,7 +466,9 @@ int DCraw::parseCR3(unsigned long long oAtomList, goto fin; } - FORC4 MediaFormatID[c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + MediaFormatID[c] = fgetc(ifp); + } if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { if (szAtomContent >= 44) { @@ -541,7 +562,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if (bad_hdr) { + if (is_bad_header()) { err = -13; goto fin; } @@ -627,13 +648,13 @@ static unsigned sgetn(int n, unsigned char* s) #define CRX_BUF_SIZE 0x10000 #if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -using DWORD = uint32_t; -using byte = uint8_t; +using DWORD = std::uint32_t; +using byte = std::uint8_t; libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } -uint32_t _byteswap_ulong(uint32_t x) +std::uint32_t _byteswap_ulong(std::uint32_t x) { #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ return x; @@ -665,98 +686,98 @@ struct LibRaw_abstract_datastream { }; struct CrxBitstream { - uint8_t mdatBuf[CRX_BUF_SIZE]; - uint64_t mdatSize; - uint64_t curBufOffset; - uint32_t curPos; - uint32_t curBufSize; - uint32_t bitData; - int32_t bitsLeft; + std::uint8_t mdatBuf[CRX_BUF_SIZE]; + std::uint64_t mdatSize; + std::uint64_t curBufOffset; + std::uint32_t curPos; + std::uint32_t curBufSize; + std::uint32_t bitData; + std::int32_t bitsLeft; LibRaw_abstract_datastream* input; }; struct CrxBandParam { CrxBitstream bitStream; - int16_t subbandWidth; - int16_t subbandHeight; - int32_t roundedBitsMask; - int32_t roundedBits; - int16_t curLine; - int32_t* lineBuf0; - int32_t* lineBuf1; - int32_t* lineBuf2; - int32_t sParam; - int32_t kParam; - int32_t* paramData; - int32_t* nonProgrData; - int8_t supportsPartial; + std::int16_t subbandWidth; + std::int16_t subbandHeight; + std::int32_t roundedBitsMask; + std::int32_t roundedBits; + std::int16_t curLine; + std::int32_t* lineBuf0; + std::int32_t* lineBuf1; + std::int32_t* lineBuf2; + std::int32_t sParam; + std::int32_t kParam; + std::int32_t* paramData; + std::int32_t* nonProgrData; + std::int8_t supportsPartial; }; struct CrxWaveletTransform { - int32_t* subband0Buf; - int32_t* subband1Buf; - int32_t* subband2Buf; - int32_t* subband3Buf; - int32_t* lineBuf[8]; - int16_t curLine; - int16_t curH; - int8_t fltTapH; - int16_t height; - int16_t width; + std::int32_t* subband0Buf; + std::int32_t* subband1Buf; + std::int32_t* subband2Buf; + std::int32_t* subband3Buf; + std::int32_t* lineBuf[8]; + std::int16_t curLine; + std::int16_t curH; + std::int8_t fltTapH; + std::int16_t height; + std::int16_t width; }; struct CrxSubband { CrxBandParam* bandParam; - uint64_t mdatOffset; - uint8_t* bandBuf; - int32_t bandSize; - uint64_t dataSize; - int8_t supportsPartial; - int32_t quantValue; - uint16_t width; - uint16_t height; - int32_t paramK; - int64_t dataOffset; + std::uint64_t mdatOffset; + std::uint8_t* bandBuf; + std::int32_t bandSize; + std::uint64_t dataSize; + std::int8_t supportsPartial; + std::int32_t quantValue; + std::uint16_t width; + std::uint16_t height; + std::int32_t paramK; + std::int64_t dataOffset; }; struct CrxPlaneComp { byte* compBuf; CrxSubband* subBands; CrxWaveletTransform* waveletTransform; - int8_t compNumber; - int64_t dataOffset; - int32_t compSize; - int8_t supportsPartial; - int32_t roundedBitsMask; - int8_t tileFlag; + std::int8_t compNumber; + std::int64_t dataOffset; + std::int32_t compSize; + std::int8_t supportsPartial; + std::int32_t roundedBitsMask; + std::int8_t tileFlag; }; struct CrxTile { CrxPlaneComp* comps; - int8_t tileFlag; - int8_t tileNumber; - int64_t dataOffset; - int32_t tileSize; - uint16_t width; - uint16_t height; + std::int8_t tileFlag; + std::int8_t tileNumber; + std::int64_t dataOffset; + std::int32_t tileSize; + std::uint16_t width; + std::uint16_t height; }; struct CrxImage { - uint8_t nPlanes; - uint16_t planeWidth; - uint16_t planeHeight; - uint8_t samplePrecision; - uint8_t subbandCount; - uint8_t levels; - uint8_t nBits; - uint8_t encType; - uint8_t tileCols; - uint8_t tileRows; + std::uint8_t nPlanes; + std::uint16_t planeWidth; + std::uint16_t planeHeight; + std::uint8_t samplePrecision; + std::uint8_t subbandCount; + std::uint8_t levels; + std::uint8_t nBits; + std::uint8_t encType; + std::uint8_t tileCols; + std::uint8_t tileRows; CrxTile* tiles; - uint64_t mdatOffset; - uint64_t mdatSize; - int16_t* outBufs[4];// one per plane - int16_t* planeBuf; + std::uint64_t mdatOffset; + std::uint64_t mdatSize; + std::int16_t* outBufs[4];// one per plane + std::int16_t* planeBuf; LibRaw_abstract_datastream* input; }; @@ -767,7 +788,7 @@ enum TileFlags { E_HAS_TILES_ON_THE_TOP = 8 }; -int32_t exCoefNumTbl[0x120] = { +std::int32_t exCoefNumTbl[0x120] = { // level 1 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @@ -787,13 +808,13 @@ int32_t exCoefNumTbl[0x120] = { 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 }; -uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, +std::uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 }; -uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, +std::uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; @@ -828,10 +849,10 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { -// uint32_t bitData = bitStrm->bitData; - uint32_t nonZeroBit = 0; - uint64_t nextData = 0; - int32_t result = 0; +// std::uint32_t bitData = bitStrm->bitData; + std::uint32_t nonZeroBit = 0; + std::uint64_t nextData = 0; + std::int32_t result = 0; if (bitStrm->bitData) { _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); @@ -839,12 +860,12 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; } else { - uint32_t bitsLeft = bitStrm->bitsLeft; + std::uint32_t bitsLeft = bitStrm->bitsLeft; while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextData = - _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); @@ -874,7 +895,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) } _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); - result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; } @@ -882,19 +903,19 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) return result; } -libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) +libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { int bitsLeft = bitStrm->bitsLeft; - uint32_t bitData = bitStrm->bitData; - uint32_t nextWord; - uint8_t nextByte; - uint32_t result; + std::uint32_t bitData = bitStrm->bitData; + std::uint32_t nextWord; + std::uint8_t nextByte; + std::uint32_t result; if (bitsLeft < bits) { // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextWord = - _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -922,23 +943,23 @@ libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -libraw_inline int crxPredictKParameter(int32_t prevK, int32_t bitCode, - int32_t maxVal = 0) +libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, + std::int32_t maxVal = 0) { - int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + + std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); return !maxVal || newKParam < maxVal ? newKParam : maxVal; } libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, - int32_t doMedianPrediction, - int32_t notEOL = 0) + std::int32_t doMedianPrediction, + std::int32_t notEOL = 0) { if (doMedianPrediction) { - int32_t symb[4]; + std::int32_t symb[4]; - int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; symb[2] = param->lineBuf1[0]; symb[0] = symb[1] = delta + symb[2]; symb[3] = param->lineBuf0[1]; @@ -951,7 +972,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, } // get next error symbol - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -965,7 +986,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { - int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; bitCode = (bitCode + _abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -1051,15 +1072,15 @@ int crxDecodeLine(CrxBandParam* param) } libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, - int32_t doSym = 1, - int32_t doCode = 1) + std::int32_t doSym = 1, + std::int32_t doCode = 1) { - int32_t sym = param->lineBuf0[1]; + std::int32_t sym = param->lineBuf0[1]; if (doSym) { // calculate the next symbol gradient - int32_t symb[4]; - int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + std::int32_t symb[4]; + std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; symb[2] = param->lineBuf1[0]; symb[0] = symb[1] = deltaH + symb[2]; symb[3] = param->lineBuf0[1]; @@ -1068,7 +1089,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1077,7 +1098,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, (bitCode << param->kParam); } - int32_t code = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t code = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; if (doCode) { @@ -1102,11 +1123,11 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, int crxDecodeLineRounded(CrxBandParam* param) { - int32_t valueReached = 0; + std::int32_t valueReached = 0; param->lineBuf0[0] = param->lineBuf0[1]; param->lineBuf1[0] = param->lineBuf0[1]; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; for (; length > 1; --length) { if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { @@ -1189,11 +1210,11 @@ int crxDecodeLineRounded(CrxBandParam* param) int crxDecodeLineNoRefPrevLine(CrxBandParam* param) { - int32_t i = 0; + std::int32_t i = 0; for (; i < param->subbandWidth - 1; i++) { if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1255,14 +1276,14 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (nSyms > 0) { - memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); - memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(std::int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(std::int32_t)); i += nSyms; } if (i >= param->subbandWidth - 1) { if (i == param->subbandWidth - 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1278,7 +1299,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) continue; } else { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1304,7 +1325,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (i == param->subbandWidth - 1) { - int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1325,7 +1346,7 @@ int crxDecodeTopLine(CrxBandParam* param) { param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; // read the line from bitstream for (; length > 1; --length) { @@ -1384,7 +1405,7 @@ int crxDecodeTopLine(CrxBandParam* param) param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1400,7 +1421,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (length == 1) { param->lineBuf1[1] = param->lineBuf1[0]; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1423,7 +1444,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) { param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; // read the line from bitstream for (; length > 1; --length) { @@ -1482,7 +1503,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1491,14 +1512,14 @@ int crxDecodeTopLineRounded(CrxBandParam* param) (bitCode << param->kParam); } - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; } if (length == 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1507,7 +1528,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) (bitCode << param->kParam); } - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1522,11 +1543,11 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) { param->lineBuf0[0] = 0; param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; for (; length > 1; --length) { if (param->lineBuf1[0]) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1589,7 +1610,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) break; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1608,7 +1629,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) } if (length == 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1628,7 +1649,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) return 0; } -int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) +int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) { if (!param || !bandBuf) { return -1; @@ -1639,22 +1660,22 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) } if (param->curLine == 0) { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; param->sParam = 0; param->kParam = 0; if (param->supportsPartial) { if (param->roundedBitsMask <= 0) { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else { param->roundedBits = 1; @@ -1665,87 +1686,87 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) } } - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineRounded(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } } else { - param->lineBuf2 = (int32_t*)param->nonProgrData; - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf2 = (std::int32_t*)param->nonProgrData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineNoRefPrevLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } } else if (!param->supportsPartial) { - int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (int32_t*)param->nonProgrData; + std::int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (std::int32_t*)param->nonProgrData; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineNoRefPrevLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else if (param->roundedBitsMask <= 0) { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineRounded(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } @@ -1754,7 +1775,7 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) int crxDecodeLineWithIQuantization(CrxSubband* subband) { - int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; if (!subband->dataSize) { memset(subband->bandBuf, 0, subband->bandSize); @@ -1762,7 +1783,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } if (subband->supportsPartial) { - uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); if (bitCode >= 23) { bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); @@ -1790,8 +1811,8 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } // update subband buffers - int32_t* bandBuf = (int32_t*)subband->bandBuf; - int32_t qScale = + std::int32_t* bandBuf = (std::int32_t*)subband->bandBuf; + std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); if (subband->quantValue / 6 >= 6) { @@ -1800,7 +1821,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } if (qScale != 1) { - for (int32_t i = 0; i < subband->width; i++) { + for (std::int32_t i = 0; i < subband->width; i++) { bandBuf[i] *= qScale; } } @@ -1808,13 +1829,13 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) return 0; } -void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, - CrxWaveletTransform* wavelet, uint32_t tileFlag) +void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, + CrxWaveletTransform* wavelet, std::uint32_t tileFlag) { - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; if (wavelet->width <= 1) { lineBufLA[0] = band0Buf[0]; @@ -1834,7 +1855,7 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); lineBufLA[2] = delta; @@ -1851,10 +1872,10 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, } if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); if (wavelet->width & 1) { @@ -1878,9 +1899,9 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, } } -int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) +std::int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, std::int32_t level) { - int32_t* result = comp->waveletTransform[level] + std::int32_t* result = comp->waveletTransform[level] .lineBuf[(comp->waveletTransform[level].fltTapH - comp->waveletTransform[level].curH + 5) % 5 + @@ -1889,7 +1910,7 @@ int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) return result; } -int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) +int crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) { if (comp->waveletTransform[level].curH) { return 0; @@ -1932,7 +1953,7 @@ int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) return 0; } -int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) +int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) { CrxWaveletTransform* wavelet = comp->waveletTransform + level; @@ -1953,14 +1974,14 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -1978,7 +1999,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; @@ -1988,7 +2009,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); @@ -1996,7 +2017,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL0[2] = delta; } } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; } else { @@ -2008,8 +2029,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) { - int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + for (std::int32_t i = 0; i < wavelet->width; i++) { + std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2018,13 +2039,13 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; } else { - int32_t* lineBufL2 = wavelet->lineBuf[2]; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; wavelet->lineBuf[1] = lineBufL2; wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; i++) { lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; } @@ -2042,17 +2063,17 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; - int32_t* lineBufL2 = wavelet->lineBuf[2]; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -2076,7 +2097,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2093,10 +2114,10 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); if (wavelet->width & 1) { @@ -2104,7 +2125,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL1[2] = deltaB; } } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2122,8 +2143,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL1 = wavelet->lineBuf[1]; lineBufL2 = wavelet->lineBuf[2]; - for (int32_t i = 0; i < wavelet->width; i++) { - int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; i++) { + std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2142,7 +2163,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) return 0; } -int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) +int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) { if (prevLevel < 0) { return 0; @@ -2158,7 +2179,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; if (wavelet->height > 1) { if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || @@ -2167,9 +2188,9 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; - int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, @@ -2180,8 +2201,8 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; // process L band if (wavelet->width <= 1) { @@ -2197,7 +2218,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2208,7 +2229,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); @@ -2216,7 +2237,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) lineBufL2[2] = delta; } } else if (wavelet->width & 1) { - int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2226,7 +2247,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } // process H band - for (int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; i++) { lineBufH0[i] = lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); } @@ -2248,8 +2269,8 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; // process H band if (wavelet->width <= 1) { @@ -2265,7 +2286,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; @@ -2275,11 +2296,11 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else { @@ -2307,7 +2328,7 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) return; } - for (int32_t i = 0; i < image->subbandCount; i++) { + for (std::int32_t i = 0; i < image->subbandCount; i++) { if (comp->subBands[i].bandParam) { free(comp->subBands[i].bandParam); comp->subBands[i].bandParam = nullptr; @@ -2319,15 +2340,15 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) } void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, - int plane = 0, const int32_t* lineData = nullptr, + int plane = 0, const std::int32_t* lineData = nullptr, int lineLength = 0) { if (lineData) { - uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; + std::uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; if (img->encType == 1) { - int32_t maxVal = 1 << (img->nBits - 1); - int32_t minVal = -maxVal; + std::int32_t maxVal = 1 << (img->nBits - 1); + std::int32_t minVal = -maxVal; --maxVal; for (int i = 0; i < lineLength; i++) { @@ -2343,16 +2364,16 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { - int32_t median = 1 << (img->nBits - 1); - int32_t maxVal = (1 << img->nBits) - 1; + std::int32_t median = 1 << (img->nBits - 1); + std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = _constrain(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { - int32_t maxVal = (1 << img->nBits) - 1; - int32_t median = 1 << (img->nBits - 1); + std::int32_t maxVal = (1 << img->nBits) - 1; + std::int32_t median = 1 << (img->nBits - 1); rawOffset = img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; i++) { @@ -2361,21 +2382,21 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } } else if (img->encType == 3 && img->planeBuf) { - int32_t planeSize = img->planeWidth * img->planeHeight; - int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; - int16_t* plane1 = plane0 + planeSize; - int16_t* plane2 = plane1 + planeSize; - int16_t* plane3 = plane2 + planeSize; + std::int32_t planeSize = img->planeWidth * img->planeHeight; + std::int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; + std::int16_t* plane1 = plane0 + planeSize; + std::int16_t* plane2 = plane1 + planeSize; + std::int16_t* plane3 = plane2 + planeSize; - int32_t median = 1 << (img->nBits - 1) << 10; - int32_t maxVal = (1 << img->nBits) - 1; - uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + std::int32_t median = 1 << (img->nBits - 1) << 10; + std::int32_t maxVal = (1 << img->nBits) - 1; + std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored for (int i = 0; i < img->planeWidth; i++) { - int32_t gr = + std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - int32_t val = 0; + std::int32_t val = 0; if (gr < 0) { gr = -(((_abs(gr) + 512) >> 9) & ~1); @@ -2399,15 +2420,15 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } -int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, - uint64_t subbandDataSize, uint32_t subbandWidth, - uint32_t subbandHeight, int32_t supportsPartial, - uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) +int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, + std::uint64_t subbandDataSize, std::uint32_t subbandWidth, + std::uint32_t subbandHeight, std::int32_t supportsPartial, + std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) { - int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; - int32_t paramLength = 2 * subbandWidth + 4; - uint8_t* paramBuf = (uint8_t*)calloc( - 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; + std::int32_t paramLength = 2 * subbandWidth + 4; + std::uint8_t* paramBuf = (std::uint8_t*)calloc( + 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize); if (!paramBuf) { return -1; @@ -2417,7 +2438,7 @@ int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, paramBuf += sizeof(CrxBandParam); - (*param)->paramData = (int32_t*)paramBuf; + (*param)->paramData = (std::int32_t*)paramBuf; (*param)->nonProgrData = progrDataSize ? (*param)->paramData + paramLength : nullptr; (*param)->subbandWidth = subbandWidth; @@ -2440,25 +2461,25 @@ int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, } int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, - const CrxTile* tile, uint32_t mdatOffset) + const CrxTile* tile, std::uint32_t mdatOffset) { long compDataSize = 0; long waveletDataOffset = 0; long compCoeffDataOffset = 0; - int32_t toSubbands = 3 * img->levels + 1; - int32_t transformWidth = 0; + std::int32_t toSubbands = 3 * img->levels + 1; + std::int32_t transformWidth = 0; CrxSubband* subbands = planeComp->subBands; // calculate sizes - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(int32_t); // 4bytes + subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes compDataSize += subbands[subbandNum].bandSize; } if (img->levels) { - int32_t encLevels = img->levels ? img->levels : 1; + std::int32_t encLevels = img->levels ? img->levels : 1; waveletDataOffset = (compDataSize + 7) & ~7; compDataSize = (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; @@ -2467,26 +2488,26 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, // calc wavelet line buffer sizes (always at one level up from current) for (int level = 0; level < img->levels; ++level) { if (level < img->levels - 1) { - compDataSize += 8 * sizeof(int32_t) * + compDataSize += 8 * sizeof(std::int32_t) * planeComp->subBands[3 * (level + 1) + 2].width; } else { - compDataSize += 8 * sizeof(int32_t) * tile->width; + compDataSize += 8 * sizeof(std::int32_t) * tile->width; } } } // buffer allocation - planeComp->compBuf = (uint8_t*)malloc(compDataSize); + planeComp->compBuf = (std::uint8_t*)malloc(compDataSize); if (!planeComp->compBuf) { return -1; } // subbands buffer and sizes initialisation - uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; - uint8_t* subbandBuf = planeComp->compBuf; + std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + std::uint8_t* subbandBuf = planeComp->compBuf; - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; subbands[subbandNum].mdatOffset = @@ -2497,13 +2518,13 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, if (img->levels) { CrxWaveletTransform* waveletTransforms = (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); - int32_t* paramData = (int32_t*)(planeComp->compBuf + compCoeffDataOffset); + std::int32_t* paramData = (std::int32_t*)(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (int32_t*)subbands->bandBuf; + waveletTransforms[0].subband0Buf = (std::int32_t*)subbands->bandBuf; for (int level = 0; level < img->levels; ++level) { - int32_t band = 3 * level + 1; + std::int32_t band = 3 * level + 1; if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; @@ -2532,21 +2553,21 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband1Buf = (std::int32_t*)subbands[band].bandBuf; waveletTransforms[level].subband2Buf = - (int32_t*)subbands[band + 1].bandBuf; + (std::int32_t*)subbands[band + 1].bandBuf; waveletTransforms[level].subband3Buf = - (int32_t*)subbands[band + 2].bandBuf; + (std::int32_t*)subbands[band + 2].bandBuf; paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } } // decoding params and bitstream initialisation - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { if (subbands[subbandNum].dataSize) { - int32_t supportsPartial = 0; - uint32_t roundedBitsMask = 0; + std::int32_t supportsPartial = 0; + std::uint32_t roundedBitsMask = 0; if (planeComp->supportsPartial && subbandNum == 0) { roundedBitsMask = planeComp->roundedBitsMask; @@ -2567,7 +2588,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } } // namespace -int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) +int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { CrxImage* img = (CrxImage*)p; int imageRow = 0; @@ -2578,7 +2599,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) for (int tCol = 0; tCol < img->tileCols; tCol++) { CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; CrxPlaneComp* planeComp = tile->comps + planeNumber; - uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; // decode single tile if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { @@ -2596,7 +2617,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) return -1; } - int32_t* lineData = + std::int32_t* lineData = crxIdwt53FilterGetLine(planeComp, img->levels - 1); crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); @@ -2615,7 +2636,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) return -1; } - int32_t* lineData = (int32_t*)planeComp->subBands->bandBuf; + std::int32_t* lineData = (std::int32_t*)planeComp->subBands->bandBuf; crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } @@ -2635,14 +2656,14 @@ namespace using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, - CrxPlaneComp* comp, uint8_t** subbandMdatPtr, - uint32_t* mdatSize) + CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, + std::uint32_t* mdatSize) { CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band - uint32_t bandHeight = tile->height; - uint32_t bandWidth = tile->width; - int32_t bandWidthExCoef = 0; - int32_t bandHeightExCoef = 0; + std::uint32_t bandHeight = tile->height; + std::uint32_t bandWidth = tile->width; + std::int32_t bandWidthExCoef = 0; + std::int32_t bandHeightExCoef = 0; if (img->levels) { // Build up subband sequences to crxDecode to a level in a header @@ -2650,21 +2671,21 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - int32_t* rowExCoef = + std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - int32_t* colExCoef = + std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { - int32_t widthOddPixel = bandWidth & 1; - int32_t heightOddPixel = bandHeight & 1; + std::int32_t widthOddPixel = bandWidth & 1; + std::int32_t heightOddPixel = bandHeight & 1; bandWidth = (widthOddPixel + bandWidth) >> 1; bandHeight = (heightOddPixel + bandHeight) >> 1; - int32_t bandWidthExCoef0 = 0; - int32_t bandWidthExCoef1 = 0; - int32_t bandHeightExCoef0 = 0; - int32_t bandHeightExCoef1 = 0; + std::int32_t bandWidthExCoef0 = 0; + std::int32_t bandWidthExCoef1 = 0; + std::int32_t bandHeightExCoef0 = 0; + std::int32_t bandHeightExCoef1 = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { bandWidthExCoef0 = rowExCoef[0]; @@ -2720,7 +2741,7 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return 0; } - int32_t subbandOffset = 0; + std::int32_t subbandOffset = 0; band = comp->subBands; for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { @@ -2732,8 +2753,8 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return -1; } - uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); if (curSubband != bitData >> 28) { band->dataSize = subbandSize; @@ -2758,8 +2779,8 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return 0; } -int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, - uint32_t mdatSize) +int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mdatPtr, + std::uint32_t mdatSize) { unsigned int nTiles = img->tileRows * img->tileCols; @@ -2855,9 +2876,9 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, } } - uint32_t tileOffset = 0; - uint32_t dataSize = mdatSize; - uint8_t* dataPtr = mdatPtr; + std::uint32_t tileOffset = 0; + std::uint32_t dataSize = mdatSize; + std::uint8_t* dataPtr = mdatPtr; CrxTile* tile = img->tiles; for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { @@ -2878,12 +2899,12 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, tile->tileSize = sgetn(4, dataPtr + 4); tile->dataOffset = tileOffset; - int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; tileOffset += tile->tileSize; dataPtr += hdrExtraBytes + 0xC; dataSize -= hdrExtraBytes; - uint32_t compOffset = 0; + std::uint32_t compOffset = 0; CrxPlaneComp* comp = tile->comps; for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { @@ -2901,7 +2922,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, comp->compSize = sgetn(4, dataPtr + 4); - int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + std::int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; comp->supportsPartial = (dataPtr[8] & 8) != 0; comp->dataOffset = compOffset; @@ -2930,9 +2951,9 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, return 0; } -int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, - uint64_t mdatOffset, uint32_t mdatSize, - uint8_t* mdatHdrPtr) +int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBuf, + std::uint64_t mdatOffset, std::uint32_t mdatSize, + std::uint8_t* mdatHdrPtr) { int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 @@ -2975,7 +2996,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { img->planeBuf = - (int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * + (std::int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)); if (!img->planeBuf) { @@ -2983,7 +3004,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, } } - int32_t rowSize = 2 * img->planeWidth; + std::int32_t rowSize = 2 * img->planeWidth; if (img->nPlanes == 1) { img->outBufs[0] = outBuf; @@ -3041,9 +3062,9 @@ int crxFreeImageData(CrxImage* img) int nTiles = img->tileRows * img->tileCols; if (img->tiles) { - for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { + for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { if (tile[curTile].comps) { - for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + for (std::int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { crxFreeSubbandData(img, tile[curTile].comps + curPlane); } } @@ -3068,11 +3089,11 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) int results[4]; // nPlanes is always <= 4 #pragma omp parallel for - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { results[plane] = crxDecodePlane(img, plane); } - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { if (results[plane]) { derror(); } @@ -3080,7 +3101,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) #else - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { if (crxDecodePlane(img, plane)) { derror(); } @@ -3110,7 +3131,7 @@ void DCraw::crxLoadRaw() CrxImage img; if (RT_canon_CR3_data.crx_track_selected >= - LIBRAW_CRXTRACKS_MAXCOUNT) { + RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { derror(); } @@ -3131,7 +3152,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - uint8_t* hdrBuf = (uint8_t*)malloc(hdr.mdatHdrSize); + std::uint8_t* hdrBuf = (std::uint8_t*)malloc(hdr.mdatHdrSize); // read image header #ifdef _OPENMP @@ -3150,7 +3171,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (int16_t*)raw_image, + if (crxSetupImageData(&hdr, &img, (std::int16_t*)raw_image, hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); @@ -3169,7 +3190,7 @@ void DCraw::crxLoadRaw() int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { return -1; } @@ -3243,4 +3264,3 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) #undef _min #undef _constrain #undef libraw_inline -#undef LIBRAW_CRXTRACKS_MAXCOUNT From e89b6be76e08f8f3e6aaa85eca7ed9d29d19bf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 26 Nov 2019 09:52:51 +0100 Subject: [PATCH 008/100] `DCraw::parseCR3()` cleanup --- rtengine/canon_cr3_decoder.cc | 170 ++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 80 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 609f0c849..3fe221097 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -280,12 +280,17 @@ int DCraw::parseCR3( {"uuid", 3}, }; - const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + const char sHandlerType[5][5] = { + "unk.", + "soun", + "vide", + "hint", + "meta" + }; - unsigned int c; int err = 0; - ushort tL; // Atom length represented in 4 or 8 bytes + unsigned short tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name unsigned long long oAtom; unsigned long long szAtom; // Atom offset and Atom size @@ -297,19 +302,19 @@ int DCraw::parseCR3( uchar CMP1[36]; char HandlerType[5]; char MediaFormatID[5]; -// unsigned ImageWidth, ImageHeight; +// unsigned int ImageWidth, ImageHeight; long relpos_inDir; long relpos_inBox; - unsigned szItem; - unsigned Tag; - unsigned lTag; - ushort tItem; + unsigned int szItem; + unsigned int Tag; + unsigned int lTag; + unsigned short tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; - strcpy(HandlerType, sHandlerType[0]); + strncpy(HandlerType, sHandlerType[0], sizeof(HandlerType)); // ImageWidth = ImageHeight = 0U; oAtom = oAtomList; - nesting++; + ++nesting; if (nesting > 31) { return -14; // too deep nesting @@ -329,20 +334,20 @@ int DCraw::parseCR3( || get4() != 0x00000008; }; - while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { - lHdr = 0ULL; + while ((oAtom + 8) <= (oAtomList + szAtomList)) { + lHdr = 0U; err = 0; - order = 0x4d4d; + order = 0x4D4D; fseek(ifp, oAtom, SEEK_SET); szAtom = get4(); - for (c = 0; c < 4; c++) { + for (unsigned int c = 0; c < 4; ++c) { nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); } AtomNameStack[(nesting + 1) * 4] = '\0'; tL = 4; AtomType = 0; - for (c = 0; c < sizeof AtomNamesList / sizeof * AtomNamesList; c++) { + for (unsigned int c = 0; c < sizeof(AtomNamesList) / sizeof(*AtomNamesList); ++c) { if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { AtomType = AtomNamesList[c].AtomType; break; @@ -353,28 +358,28 @@ int DCraw::parseCR3( err = 1; } - if (szAtom == 0ULL) { + if (szAtom == 0) { if (nesting != 0) { err = -2; goto fin; } szAtom = szAtomList - oAtom; - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } else if (szAtom == 1ULL) { - if ((oAtom + 16ULL) > (oAtomList + szAtomList)) { + oAtomContent = oAtom + 8; + szAtomContent = szAtom - 8; + } else if (szAtom == 1) { + if ((oAtom + 16) > (oAtomList + szAtomList)) { err = -3; goto fin; } tL = 8; - szAtom = (((unsigned long long)get4()) << 32) | get4(); - oAtomContent = oAtom + 16ULL; - szAtomContent = szAtom - 16ULL; + szAtom = (static_cast(get4()) << 32) | get4(); + oAtomContent = oAtom + 16; + szAtomContent = szAtom - 16; } else { - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; + oAtomContent = oAtom + 8; + szAtomContent = szAtom - 8; } if (!strcmp(nmAtom, "trak")) { @@ -387,7 +392,7 @@ int DCraw::parseCR3( } if (!strcmp(AtomNameStack, "moovuuid")) { - lHdr = 16ULL; + lHdr = 16; fread(UIID, 1, lHdr, ifp); if (!strncmp(UIID, UIID_Canon, lHdr)) { @@ -396,12 +401,12 @@ int DCraw::parseCR3( fseek(ifp, -lHdr, SEEK_CUR); } } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { - lHdr = 12ULL; + lHdr = 12; } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -4; goto fin; } @@ -409,10 +414,10 @@ int DCraw::parseCR3( parse_tiff_ifd(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -5; goto fin; } @@ -420,10 +425,10 @@ int DCraw::parseCR3( parse_exif(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -6; goto fin; } @@ -432,26 +437,26 @@ int DCraw::parseCR3( parse_makernote(oAtomContent, 0); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -6; goto fin; } - std::int64_t off = ftell(ifp); + const std::int64_t off = ftell(ifp); // FIXME: ftell() returns int parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); + fseek(ifp, off, SEEK_SET); // FIXME: fseek() takes int offset // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { - fseek(ifp, 8L, SEEK_CUR); - for (c = 0; c < 4; c++) { + fseek(ifp, 8, SEEK_CUR); + for (unsigned int c = 0; c < 4; ++c) { HandlerType[c] = fgetc(ifp); } - for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { + for (unsigned int c = 1; c < sizeof(sHandlerType) / sizeof(*sHandlerType); ++c) { if (!strcmp(HandlerType, sHandlerType[c])) { TrackType = c; break; @@ -466,13 +471,13 @@ int DCraw::parseCR3( goto fin; } - for (c = 0; c < 4; c++) { + for (unsigned int c = 0; c < 4; ++c) { MediaFormatID[c] = fgetc(ifp); } - if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { + if (TrackType == 2 && !strcmp(MediaFormatID, "CRAW")) { if (szAtomContent >= 44) { - fseek(ifp, 24L, SEEK_CUR); + fseek(ifp, 24, SEEK_CUR); } else { err = -8; goto fin; @@ -482,8 +487,6 @@ int DCraw::parseCR3( lHdr = 0; } -#define current_track RT_canon_CR3_data.crx_header[nTrack] - /*ImageWidth = */ get2(); /*ImageHeight = */ get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { @@ -497,69 +500,81 @@ int DCraw::parseCR3( } if (!crxParseImageHeader(CMP1, nTrack)) { - current_track.MediaType = 1; + RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { - current_track.MediaType = 2; + RT_canon_CR3_data.crx_header[nTrack].MediaType = 2; } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { if (szAtomContent == 12) { - fseek(ifp, 4L, SEEK_CUR); + fseek(ifp, 4, SEEK_CUR); } else if (szAtomContent == 16) { - fseek(ifp, 12L, SEEK_CUR); + fseek(ifp, 12, SEEK_CUR); } else { err = -9; goto fin; } - current_track.MediaSize = get4(); + RT_canon_CR3_data.crx_header[nTrack].MediaSize = get4(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { if (szAtomContent == 16) { - fseek(ifp, 8L, SEEK_CUR); + fseek(ifp, 8, SEEK_CUR); } else { err = -10; goto fin; } - current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); + RT_canon_CR3_data.crx_header[nTrack].MediaOffset = (static_cast(get4()) << 32) | get4(); } - if (current_track.MediaSize && current_track.MediaOffset && - ((oAtom + szAtom) >= (oAtomList + szAtomList)) && - !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) { - if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) { + if ( + RT_canon_CR3_data.crx_header[nTrack].MediaSize + && RT_canon_CR3_data.crx_header[nTrack].MediaOffset + && oAtom + szAtom >= oAtomList + szAtomList + && !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20) + ) { + if (TrackType == 4 && !strcmp(MediaFormatID, "CTMD")) { order = 0x4949; - relpos_inDir = 0L; + relpos_inDir = 0; - while (relpos_inDir + 6 < current_track.MediaSize) { - fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); + while (relpos_inDir + 6 < RT_canon_CR3_data.crx_header[nTrack].MediaSize) { + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inDir, SEEK_SET); szItem = get4(); tItem = get2(); - if ((relpos_inDir + szItem) > current_track.MediaSize) { + if ((relpos_inDir + szItem) > RT_canon_CR3_data.crx_header[nTrack].MediaSize) { err = -11; goto fin; } - if ((tItem == 7) || (tItem == 8) || (tItem == 9)) { - relpos_inBox = relpos_inDir + 12L; + if ( + tItem == 7 + || tItem == 8 + || tItem == 9 + ) { + relpos_inBox = relpos_inDir + 12; while (relpos_inBox + 8 < relpos_inDir + szItem) { - fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox, SEEK_SET); lTag = get4(); Tag = get4(); if (lTag < 8) { err = -12; goto fin; - } else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) { + } else if (relpos_inBox + lTag > relpos_inDir + szItem) { err = -11; goto fin; } - if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) { - fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, - SEEK_SET); - short q_order = order; + if ( + Tag == 0x927C + && ( + tItem == 7 + || tItem == 8 + ) + ) { + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, SEEK_SET); + const short q_order = order; order = get2(); if (is_bad_header()) { @@ -567,10 +582,9 @@ int DCraw::parseCR3( goto fin; } - fseek(ifp, -8L, SEEK_CUR); + fseek(ifp, -8, SEEK_CUR); RT_canon_CR3_data.CR3_CTMDtag = 1; - parse_makernote(current_track.MediaOffset + relpos_inBox + 8, - 0); + parse_makernote(RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, 0); RT_canon_CR3_data.CR3_CTMDtag = 0; order = q_order; } @@ -582,15 +596,12 @@ int DCraw::parseCR3( relpos_inDir += szItem; } - order = 0x4d4d; + order = 0x4D4D; } } -#undef current_track - if (AtomType == 1) { - err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, - AtomNameStack, nTrack, TrackType); + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, AtomNameStack, nTrack, TrackType); if (err) { goto fin; @@ -601,7 +612,7 @@ int DCraw::parseCR3( } fin: - nesting--; + --nesting; if (nesting >= 0) { AtomNameStack[nesting * 4] = '\0'; @@ -610,7 +621,6 @@ fin: order = s_order; return err; } -#undef bad_hdr // ----------------------------------------------------------------------------- @@ -633,9 +643,9 @@ fin: namespace { -static unsigned sgetn(int n, unsigned char* s) +static unsigned int sgetn(int n, unsigned char* s) { - unsigned result = 0; + unsigned int result = 0; while (n-- > 0) { result = (result << 8) | (*s++); From 4f153a6d72b0a09ed4e58df230a05695ea75805d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 27 Nov 2019 09:49:13 +0100 Subject: [PATCH 009/100] Fix warnings --- rtengine/canon_cr3_decoder.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 3fe221097..4698f72c0 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -303,8 +303,8 @@ int DCraw::parseCR3( char HandlerType[5]; char MediaFormatID[5]; // unsigned int ImageWidth, ImageHeight; - long relpos_inDir; - long relpos_inBox; + unsigned long relpos_inDir; + unsigned long relpos_inBox; unsigned int szItem; unsigned int Tag; unsigned int lTag; @@ -2663,9 +2663,10 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) namespace { + using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; -int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, +int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, std::uint32_t* mdatSize) { @@ -2952,7 +2953,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); } - if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) { + if (crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { return -1; } } @@ -2980,9 +2981,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; - if (img->tileCols > 0xFF || img->tileRows > 0xFF || - img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || - img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { + if (img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { return -1; } From 97960f335f362264f5aa79f15a896678752bbfa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 27 Nov 2019 10:32:43 +0100 Subject: [PATCH 010/100] Fix silly error and with it the Clang build --- rtengine/canon_cr3_decoder.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 4698f72c0..f32258469 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -76,7 +76,7 @@ void DCraw::parse_canon_cr3() void DCraw::selectCRXTrack(unsigned short maxTrack) { - std::int64_t bitcounts[RT_canon_CR3_data.CRXTRACKS_MAXCOUNT] = {}; + std::int64_t bitcounts[CanonCR3Data::CRXTRACKS_MAXCOUNT] = {}; std::int64_t maxbitcount = 0; std::uint32_t maxjpegbytes = 0; From 85abe54a1638409c563f6bde93cf66fe584049ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 08:54:38 +0100 Subject: [PATCH 011/100] Replace defines --- rtengine/canon_cr3_decoder.cc | 117 ++++++++++++++-------------------- 1 file changed, 48 insertions(+), 69 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f32258469..0d284f68b 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -53,6 +53,8 @@ #include #include +#include +#include #include #include "dcraw.h" @@ -624,26 +626,10 @@ fin: // ----------------------------------------------------------------------------- -#ifdef _abs -#undef _abs -#undef _min -#undef _constrain -#endif -#define _abs(x) ((x) < 0 ? -(x) : (x)) -#define _min(a, b) ((a) < (b) ? (a) : (b)) -#define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) - -#if defined (__clang__) || defined (__GNUG__) -#define libraw_inline inline __attribute__((always_inline)) -#elif defined (_MSC_VER) && _MSC_VER > 1400 -#define libraw_inline __forceinline -#else -#define libraw_inline inline -#endif - namespace { -static unsigned int sgetn(int n, unsigned char* s) + +unsigned int sgetn(int n, unsigned char* s) { unsigned int result = 0; @@ -655,12 +641,11 @@ static unsigned int sgetn(int n, unsigned char* s) } // this should be divisible by 4 -#define CRX_BUF_SIZE 0x10000 +constexpr std::uint64_t CRX_BUF_SIZE = 0x10000; + #if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -using DWORD = std::uint32_t; -using byte = std::uint8_t; -libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) +inline void _BitScanReverse(std::uint32_t* Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } @@ -674,8 +659,6 @@ std::uint32_t _byteswap_ulong(std::uint32_t x) } #endif -#define LIBRAW_EXCEPTION_IO_EOF std::exception() - struct LibRaw_abstract_datastream { IMFILE* ifp; @@ -751,7 +734,7 @@ struct CrxSubband { }; struct CrxPlaneComp { - byte* compBuf; + std::uint8_t* compBuf; CrxSubband* subBands; CrxWaveletTransform* waveletTransform; std::int8_t compNumber; @@ -798,7 +781,7 @@ enum TileFlags { E_HAS_TILES_ON_THE_TOP = 8 }; -std::int32_t exCoefNumTbl[0x120] = { +const std::int32_t exCoefNumTbl[0x120] = { // level 1 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @@ -818,18 +801,20 @@ std::int32_t exCoefNumTbl[0x120] = { 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 }; -std::uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, - 4, 4, 4, 4, 8, 8, 8, 8, - 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 - }; +const std::uint32_t JS[32] = { + 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0010, 0x0010, 0x0020, 0x0020, 0x0040, 0x0040, 0x0080, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000 +}; -std::uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, - 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F - }; +const std::uint32_t J[32] = { + 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, + 0x2, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6, + 0x7, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF +}; -static inline void crxFillBuffer(CrxBitstream* bitStrm) +inline void crxFillBuffer(CrxBitstream* bitStrm) { if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) { bitStrm->curPos = 0; @@ -842,14 +827,13 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) bitStrm->input->lock(); #endif bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); - bitStrm->curBufSize = bitStrm->input->read( - bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); + bitStrm->curBufSize = bitStrm->input->read(bitStrm->mdatBuf, 1, std::min(bitStrm->mdatSize, CRX_BUF_SIZE)); #ifndef _OPENMP bitStrm->input->unlock(); #endif if (bitStrm->curBufSize < 1) { // nothing read - throw LIBRAW_EXCEPTION_IO_EOF; + throw std::exception(); } bitStrm->mdatSize -= bitStrm->curBufSize; @@ -857,7 +841,7 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) } } -libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) +inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { // std::uint32_t bitData = bitStrm->bitData; std::uint32_t nonZeroBit = 0; @@ -865,7 +849,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) std::int32_t result = 0; if (bitStrm->bitData) { - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)bitStrm->bitData); result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; @@ -880,7 +864,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) crxFillBuffer(bitStrm); if (nextData) { - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); result = bitsLeft + 31 - nonZeroBit; bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -904,7 +888,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitsLeft += 8; } - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -913,7 +897,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) return result; } -libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) +inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { int bitsLeft = bitStrm->bitsLeft; std::uint32_t bitData = bitStrm->bitData; @@ -953,7 +937,7 @@ libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, +inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, std::int32_t maxVal = 0) { std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + @@ -962,7 +946,7 @@ libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, return !maxVal || newKParam < maxVal ? newKParam : maxVal; } -libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, +inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, std::int32_t notEOL = 0) { @@ -997,7 +981,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; - bitCode = (bitCode + _abs(nextDelta)) >> 1; + bitCode = (bitCode + std::abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -1081,7 +1065,7 @@ int crxDecodeLine(CrxBandParam* param) return 0; } -libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, +inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, std::int32_t doSym = 1, std::int32_t doCode = 1) { @@ -1123,7 +1107,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, } param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * _abs(code)) >> 1, 15); + (bitCode + 2 * std::abs(code)) >> 1, 15); } else { param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); } @@ -1140,11 +1124,11 @@ int crxDecodeLineRounded(CrxBandParam* param) std::int32_t length = param->subbandWidth; for (; length > 1; --length) { - if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { + if (std::abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; valueReached = 1; - } else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > + } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; @@ -1201,7 +1185,7 @@ int crxDecodeLineRounded(CrxBandParam* param) if (length > 1) { crxDecodeSymbolL1Rounded(param, 0); ++param->lineBuf0; - valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > + valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; } else if (length == 1) { crxDecodeSymbolL1Rounded(param, 0, 0); @@ -1458,7 +1442,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) // read the line from bitstream for (; length > 1; --length) { - if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) { + if (std::abs(param->lineBuf1[0]) > param->roundedBitsMask) { param->lineBuf1[1] = param->lineBuf1[0]; } else { int nSyms = 0; @@ -2363,7 +2347,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = - _constrain(lineData[i], minVal, maxVal); + rtengine::LIM(lineData[i], minVal, maxVal); } } else if (img->encType == 3) { // copy to intermediate planeBuf @@ -2379,7 +2363,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = - _constrain(median + lineData[i], 0, maxVal); + rtengine::LIM(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { std::int32_t maxVal = (1 << img->nBits) - 1; @@ -2388,7 +2372,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[0][rawOffset + i] = - _constrain(median + lineData[i], 0, maxVal); + rtengine::LIM(median + lineData[i], 0, maxVal); } } } else if (img->encType == 3 && img->planeBuf) { @@ -2409,23 +2393,23 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t val = 0; if (gr < 0) { - gr = -(((_abs(gr) + 512) >> 9) & ~1); + gr = -(((std::abs(gr) + 512) >> 9) & ~1); } else { - gr = ((_abs(gr) + 512) >> 9) & ~1; + gr = ((std::abs(gr) + 512) >> 9) & ~1; } // Essentially R = round(median + P0 + 1.474*P3) val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; - img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[0][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) val = (plane2[i] + gr + 1) >> 1; - img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[1][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) val = (gr - plane2[i] + 1) >> 1; - img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[2][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially B = round(median + P0 + 1.881*P1) val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; - img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[3][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); } } } @@ -2682,9 +2666,9 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - std::int32_t* rowExCoef = + const std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - std::int32_t* colExCoef = + const std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { @@ -3268,8 +3252,3 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) return 0; } - -#undef _abs -#undef _min -#undef _constrain -#undef libraw_inline From 4529999f493d41458889f083eaf0a3d3a3cd3e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 09:11:56 +0100 Subject: [PATCH 012/100] C++-style casts (clang-tidy) --- rtengine/canon_cr3_decoder.cc | 86 +++++++++++++++++------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 0d284f68b..a64a83010 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -349,9 +349,9 @@ int DCraw::parseCR3( tL = 4; AtomType = 0; - for (unsigned int c = 0; c < sizeof(AtomNamesList) / sizeof(*AtomNamesList); ++c) { - if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { - AtomType = AtomNamesList[c].AtomType; + for (const auto& atom : AtomNamesList) { + if (!strcmp(nmAtom, atom.AtomName)) { + AtomType = atom.AtomType; break; } } @@ -849,7 +849,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) std::int32_t result = 0; if (bitStrm->bitData) { - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)bitStrm->bitData); + _BitScanReverse(&nonZeroBit, bitStrm->bitData); result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; @@ -859,12 +859,12 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextData = - _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); if (nextData) { - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); + _BitScanReverse(&nonZeroBit, static_cast(nextData)); result = bitsLeft + 31 - nonZeroBit; bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -888,8 +888,8 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitsLeft += 8; } - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); - result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); + _BitScanReverse(&nonZeroBit, static_cast(nextData)); + result = static_cast(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; } @@ -909,7 +909,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextWord = - _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -1661,7 +1661,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->supportsPartial) { if (param->roundedBitsMask <= 0) { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1680,7 +1680,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1692,8 +1692,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) ++param->curLine; } } else { - param->lineBuf2 = (std::int32_t*)param->nonProgrData; - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf2 = param->nonProgrData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1706,13 +1706,13 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } else if (!param->supportsPartial) { std::int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (std::int32_t*)param->nonProgrData; + param->lineBuf2 = param->nonProgrData; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1728,10 +1728,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1747,10 +1747,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1805,7 +1805,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } // update subband buffers - std::int32_t* bandBuf = (std::int32_t*)subband->bandBuf; + std::int32_t* bandBuf = reinterpret_cast(subband->bandBuf); std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); @@ -2421,18 +2421,18 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, { std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; std::int32_t paramLength = 2 * subbandWidth + 4; - std::uint8_t* paramBuf = (std::uint8_t*)calloc( - 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize); + std::uint8_t* paramBuf = static_cast(calloc( + 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); if (!paramBuf) { return -1; } - *param = (CrxBandParam*)paramBuf; + *param = reinterpret_cast(paramBuf); paramBuf += sizeof(CrxBandParam); - (*param)->paramData = (std::int32_t*)paramBuf; + (*param)->paramData = reinterpret_cast(paramBuf); (*param)->nonProgrData = progrDataSize ? (*param)->paramData + paramLength : nullptr; (*param)->subbandWidth = subbandWidth; @@ -2491,7 +2491,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } // buffer allocation - planeComp->compBuf = (std::uint8_t*)malloc(compDataSize); + planeComp->compBuf = static_cast(malloc(compDataSize)); if (!planeComp->compBuf) { return -1; @@ -2511,11 +2511,11 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, // wavelet data initialisation if (img->levels) { CrxWaveletTransform* waveletTransforms = - (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); - std::int32_t* paramData = (std::int32_t*)(planeComp->compBuf + compCoeffDataOffset); + reinterpret_cast(planeComp->compBuf + waveletDataOffset); + std::int32_t* paramData = reinterpret_cast(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (std::int32_t*)subbands->bandBuf; + waveletTransforms[0].subband0Buf = reinterpret_cast(subbands->bandBuf); for (int level = 0; level < img->levels; ++level) { std::int32_t band = 3 * level + 1; @@ -2547,11 +2547,11 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (std::int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband1Buf = reinterpret_cast(subbands[band].bandBuf); waveletTransforms[level].subband2Buf = - (std::int32_t*)subbands[band + 1].bandBuf; + reinterpret_cast(subbands[band + 1].bandBuf); waveletTransforms[level].subband3Buf = - (std::int32_t*)subbands[band + 2].bandBuf; + reinterpret_cast(subbands[band + 2].bandBuf); paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } @@ -2584,7 +2584,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { - CrxImage* img = (CrxImage*)p; + CrxImage* img = static_cast(p); int imageRow = 0; for (int tRow = 0; tRow < img->tileRows; tRow++) { @@ -2630,7 +2630,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) return -1; } - std::int32_t* lineData = (std::int32_t*)planeComp->subBands->bandBuf; + std::int32_t* lineData = reinterpret_cast(planeComp->subBands->bandBuf); crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } @@ -2784,10 +2784,10 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda } if (!img->tiles) { - img->tiles = (CrxTile*)malloc( + img->tiles = static_cast(malloc( sizeof(CrxTile) * nTiles + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount)); if (!img->tiles) { return -1; @@ -2795,8 +2795,8 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda // memory areas in allocated chunk CrxTile* tile = img->tiles; - CrxPlaneComp* comps = (CrxPlaneComp*)(tile + nTiles); - CrxSubband* bands = (CrxSubband*)(comps + img->nPlanes * nTiles); + CrxPlaneComp* comps = reinterpret_cast(tile + nTiles); + CrxSubband* bands = reinterpret_cast(comps + img->nPlanes * nTiles); for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags @@ -2989,8 +2989,8 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { img->planeBuf = - (std::int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3)); + static_cast(malloc(img->planeHeight * img->planeWidth * img->nPlanes * + ((img->samplePrecision + 7) >> 3))); if (!img->planeBuf) { return -1; @@ -3105,7 +3105,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) void DCraw::crxConvertPlaneLineDf(void* p, int imageRow) { - crxConvertPlaneLine((CrxImage*)p, imageRow); + crxConvertPlaneLine(static_cast(p), imageRow); } void DCraw::crxLoadFinalizeLoopE3(void* p, int planeHeight) @@ -3145,7 +3145,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - std::uint8_t* hdrBuf = (std::uint8_t*)malloc(hdr.mdatHdrSize); + std::uint8_t* hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); // read image header #ifdef _OPENMP @@ -3164,7 +3164,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (std::int16_t*)raw_image, + if (crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); From c5168038e8b4491fb5cb92cb05b4b9823c3b2898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 10:37:18 +0100 Subject: [PATCH 013/100] Add missing include --- rtengine/canon_cr3_decoder.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index a64a83010..8b39c3b02 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -59,6 +59,8 @@ #include "dcraw.h" +#include "rt_math.h" + void DCraw::parse_canon_cr3() { strncpy(make, "Canon", sizeof(make)); From c4fe355fbb3802fa104c07a108a7ee83ee440ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 29 Nov 2019 14:57:14 +0100 Subject: [PATCH 014/100] Fix formatting and use `bool` (WIP) --- rtengine/canon_cr3_decoder.cc | 173 ++++++++++++++++------------------ 1 file changed, 83 insertions(+), 90 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 8b39c3b02..6056f46bb 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -860,8 +860,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { - nextData = - _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); + nextData = _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); @@ -910,8 +909,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) if (bitsLeft < bits) { // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { - nextWord = - _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); + nextWord = _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -939,30 +937,34 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, - std::int32_t maxVal = 0) +inline std::int32_t crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, std::int32_t maxVal = 0) { - std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + - ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + const std::int32_t newKParam = + prevK + - (bitCode < (1 << prevK >> 1)) + + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); - return !maxVal || newKParam < maxVal ? newKParam : maxVal; + return + !maxVal || newKParam < maxVal + ? newKParam + : maxVal; } -inline void crxDecodeSymbolL1(CrxBandParam* param, - std::int32_t doMedianPrediction, - std::int32_t notEOL = 0) +inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, bool notEOL = false) { if (doMedianPrediction) { - std::int32_t symb[4]; + const std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + const std::int32_t symb[4] = { + delta + param->lineBuf1[0], + delta + param->lineBuf1[0], + param->lineBuf1[0], + param->lineBuf0[1] + }; - std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = delta + symb[2]; - symb[3] = param->lineBuf0[1]; - - param->lineBuf1[1] = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + param->lineBuf1[1] = symb[ + (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0)) + ]; } else { param->lineBuf1[1] = param->lineBuf0[1]; } @@ -973,8 +975,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } // add converted (+/-) error code to predicted value @@ -982,7 +983,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { - std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + const std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; bitCode = (bitCode + std::abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -993,17 +994,16 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, ++param->lineBuf1; } -int crxDecodeLine(CrxBandParam* param) +bool crxDecodeLine(CrxBandParam* param) { int length = param->subbandWidth; param->lineBuf1[0] = param->lineBuf0[1]; for (; length > 1; --length) { - if (param->lineBuf1[0] != param->lineBuf0[1] || - param->lineBuf1[0] != param->lineBuf0[2]) { - crxDecodeSymbolL1(param, 1, 1); - } else { + if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { + crxDecodeSymbolL1(param, 1, true); + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1036,7 +1036,7 @@ int crxDecodeLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1053,36 +1053,37 @@ int crxDecodeLine(CrxBandParam* param) } if (length > 0) { - crxDecodeSymbolL1(param, 0, (length > 1)); + crxDecodeSymbolL1(param, 0, length > 1); } } } if (length == 1) { - crxDecodeSymbolL1(param, 1, 0); + crxDecodeSymbolL1(param, 1, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } -inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, - std::int32_t doSym = 1, - std::int32_t doCode = 1) +inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, bool doSym = true, bool doCode = true) { std::int32_t sym = param->lineBuf0[1]; if (doSym) { // calculate the next symbol gradient - std::int32_t symb[4]; - std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = deltaH + symb[2]; - symb[3] = param->lineBuf0[1]; - sym = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + const std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + const std::int32_t symb[4] = { + deltaH + param->lineBuf1[0], + deltaH + param->lineBuf1[0], + param->lineBuf1[0], + param->lineBuf0[1] + }; + sym = symb[ + (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0)) + ]; } std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); @@ -1090,36 +1091,30 @@ inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } std::int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code < 0) + sym; if (doCode) { if (param->lineBuf0[2] > param->lineBuf0[1]) { - code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - - 1) >> - param->roundedBits; + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - 1) >> param->roundedBits; } else { - code = -( - (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> - param->roundedBits); + code = -((param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> param->roundedBits); } - param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * std::abs(code)) >> 1, 15); - } else { + param->kParam = crxPredictKParameter(param->kParam, (bitCode + 2 * std::abs(code)) >> 1, 15); + } else { param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); } ++param->lineBuf1; } -int crxDecodeLineRounded(CrxBandParam* param) +bool crxDecodeLineRounded(CrxBandParam* param) { - std::int32_t valueReached = 0; + bool valueReached = false; param->lineBuf0[0] = param->lineBuf0[1]; param->lineBuf1[0] = param->lineBuf0[1]; @@ -1129,13 +1124,12 @@ int crxDecodeLineRounded(CrxBandParam* param) if (std::abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; - valueReached = 1; - } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > - param->roundedBitsMask) { + valueReached = true; + } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; - valueReached = 0; - } else { + valueReached = false; + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1169,7 +1163,7 @@ int crxDecodeLineRounded(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1185,23 +1179,22 @@ int crxDecodeLineRounded(CrxBandParam* param) } if (length > 1) { - crxDecodeSymbolL1Rounded(param, 0); + crxDecodeSymbolL1Rounded(param, false); ++param->lineBuf0; - valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > - param->roundedBitsMask; + valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; } else if (length == 1) { - crxDecodeSymbolL1Rounded(param, 0, 0); + crxDecodeSymbolL1Rounded(param, false, false); } } } if (length == 1) { - crxDecodeSymbolL1Rounded(param, 1, 0); + crxDecodeSymbolL1Rounded(param, true, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } int crxDecodeLineNoRefPrevLine(CrxBandParam* param) @@ -1535,7 +1528,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) return 0; } -int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) +bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) { param->lineBuf0[0] = 0; param->lineBuf1[0] = 0; @@ -1587,7 +1580,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } } @@ -1642,21 +1635,21 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) param->lineBuf1[1] = 0; - return 0; + return true; } -int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) +bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) { if (!param || !bandBuf) { - return -1; + return false; } if (param->curLine >= param->subbandHeight) { - return -1; + return false; } if (param->curLine == 0) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; param->sParam = 0; param->kParam = 0; @@ -1665,10 +1658,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->roundedBitsMask <= 0) { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* const lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLine(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1687,7 +1680,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineRounded(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1699,8 +1692,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineNoRefPrevLine(param)) { - return -1; + if (!crxDecodeTopLineNoRefPrevLine(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1721,7 +1714,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineNoRefPrevLine(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1739,8 +1732,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeLine(param)) { - return -1; + if (!crxDecodeLine(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1758,15 +1751,15 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineRounded(param)) { - return -1; + if (!crxDecodeLineRounded(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - return 0; + return true; } int crxDecodeLineWithIQuantization(CrxSubband* subband) @@ -1798,7 +1791,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } } - if (crxDecodeLine(subband->bandParam, subband->bandBuf)) { + if (!crxDecodeLine(subband->bandParam, subband->bandBuf)) { return -1; } @@ -2627,7 +2620,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) } for (int i = 0; i < tile->height; ++i) { - if (crxDecodeLine(planeComp->subBands->bandParam, + if (!crxDecodeLine(planeComp->subBands->bandParam, planeComp->subBands->bandBuf)) { return -1; } From 49f5833002fbce0457fd0a13a85b20c9678187cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 4 Dec 2019 10:23:25 +0100 Subject: [PATCH 015/100] More `bool` and `const` (WIP) --- rtengine/canon_cr3_decoder.cc | 456 ++++++++++++++++------------------ 1 file changed, 215 insertions(+), 241 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 6056f46bb..f436c759e 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -158,7 +158,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) int tiff_idx = -1; std::int64_t tpixels = 0; - for (unsigned int i = 0; i < tiff_nifds; i++) { + for (unsigned int i = 0; i < tiff_nifds; ++i) { if (std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height) > tpixels) { tpixels = std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height); tiff_idx = i; @@ -381,7 +381,7 @@ int DCraw::parseCR3( szAtom = (static_cast(get4()) << 32) | get4(); oAtomContent = oAtom + 16; szAtomContent = szAtom - 16; - } else { + } else { oAtomContent = oAtom + 8; szAtomContent = szAtom - 8; } @@ -401,7 +401,7 @@ int DCraw::parseCR3( if (!strncmp(UIID, UIID_Canon, lHdr)) { AtomType = 1; - } else { + } else { fseek(ifp, -lHdr, SEEK_CUR); } } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { @@ -470,7 +470,7 @@ int DCraw::parseCR3( if (szAtomContent >= 16) { fseek(ifp, 12L, SEEK_CUR); lHdr = 8; - } else { + } else { err = -7; goto fin; } @@ -486,7 +486,7 @@ int DCraw::parseCR3( err = -8; goto fin; } - } else { + } else { AtomType = 2; // only continue for CRAW lHdr = 0; } @@ -855,7 +855,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; - } else { + } else { std::uint32_t bitsLeft = bitStrm->bitsLeft; while (true) { @@ -950,7 +950,7 @@ inline std::int32_t crxPredictKParameter(std::int32_t prevK, std::int32_t bitCod : maxVal; } -inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, bool notEOL = false) +inline void crxDecodeSymbolL1(CrxBandParam* param, bool doMedianPrediction, bool notEOL = false) { if (doMedianPrediction) { const std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; @@ -965,7 +965,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPredicti (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0)) ]; - } else { + } else { param->lineBuf1[1] = param->lineBuf0[1]; } @@ -1002,7 +1002,7 @@ bool crxDecodeLine(CrxBandParam* param) for (; length > 1; --length) { if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { - crxDecodeSymbolL1(param, 1, true); + crxDecodeSymbolL1(param, true, true); } else { int nSyms = 0; @@ -1053,13 +1053,13 @@ bool crxDecodeLine(CrxBandParam* param) } if (length > 0) { - crxDecodeSymbolL1(param, 0, length > 1); + crxDecodeSymbolL1(param, false, length > 1); } } } if (length == 1) { - crxDecodeSymbolL1(param, 1, false); + crxDecodeSymbolL1(param, true, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; @@ -1197,19 +1197,18 @@ bool crxDecodeLineRounded(CrxBandParam* param) return true; } -int crxDecodeLineNoRefPrevLine(CrxBandParam* param) +bool crxDecodeLineNoRefPrevLine(CrxBandParam* param) { std::int32_t i = 0; - for (; i < param->subbandWidth - 1; i++) { - if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { + for (; i < param->subbandWidth - 1; ++i) { + if (param->lineBuf0[i + 2] || param->lineBuf0[i + 1] || param->lineBuf1[i]) { std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1219,10 +1218,10 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (param->kParam >= 15) { param->kParam = 15; } - } else { + } else { ++param->kParam; } - } else { + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1257,11 +1256,11 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (i + nSyms > param->subbandWidth) { - return -1; + return false; } } } else if (i > param->subbandWidth) { - return -1; + return false; } if (nSyms > 0) { @@ -1277,8 +1276,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1287,14 +1285,13 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } continue; - } else { + } else { std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1304,7 +1301,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (param->kParam >= 15) { param->kParam = 15; } - } else { + } else { ++param->kParam; } } @@ -1319,8 +1316,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1328,10 +1324,10 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) param->lineBuf2[i] = param->kParam; } - return 0; + return true; } -int crxDecodeTopLine(CrxBandParam* param) +bool crxDecodeTopLine(CrxBandParam* param) { param->lineBuf1[0] = 0; @@ -1374,7 +1370,7 @@ int crxDecodeTopLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1399,8 +1395,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); @@ -1415,8 +1410,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); @@ -1426,10 +1420,10 @@ int crxDecodeTopLine(CrxBandParam* param) param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } -int crxDecodeTopLineRounded(CrxBandParam* param) +bool crxDecodeTopLineRounded(CrxBandParam* param) { param->lineBuf1[0] = 0; @@ -1472,7 +1466,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } } @@ -1497,11 +1491,10 @@ int crxDecodeTopLineRounded(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } - std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + const std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1513,11 +1506,10 @@ int crxDecodeTopLineRounded(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } - std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + const std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1525,7 +1517,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) @@ -1541,13 +1533,12 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } else { + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1604,8 +1595,7 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1623,8 +1613,7 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1658,15 +1647,15 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->roundedBitsMask <= 0) { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* const lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLine(param)) { + if (!crxDecodeTopLine(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else { + } else { param->roundedBits = 1; if (param->roundedBitsMask & ~1) { @@ -1677,20 +1666,20 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineRounded(param)) { + if (!crxDecodeTopLineRounded(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - } else { + } else { param->lineBuf2 = param->nonProgrData; param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeTopLineNoRefPrevLine(param)) { return false; @@ -1700,37 +1689,37 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) ++param->curLine; } } else if (!param->supportsPartial) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; param->lineBuf2 = param->nonProgrData; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineNoRefPrevLine(param)) { + if (!crxDecodeLineNoRefPrevLine(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else if (param->roundedBitsMask <= 0) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeLine(param)) { return false; @@ -1738,18 +1727,18 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else { - std::int32_t lineLength = param->subbandWidth + 2; + } else { + const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeLineRounded(param)) { return false; @@ -1762,13 +1751,13 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) return true; } -int crxDecodeLineWithIQuantization(CrxSubband* subband) +bool crxDecodeLineWithIQuantization(CrxSubband* subband) { - std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + constexpr std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; if (!subband->dataSize) { memset(subband->bandBuf, 0, subband->bandSize); - return 0; + return true; } if (subband->supportsPartial) { @@ -1777,49 +1766,48 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) if (bitCode >= 23) { bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); } else if (subband->paramK) { - bitCode = - crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | - (bitCode << subband->paramK); + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | (bitCode << subband->paramK); } - subband->quantValue += - -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer subband->paramK = crxPredictKParameter(subband->paramK, bitCode); if (subband->paramK > 7) { - return -1; + return false; } } if (!crxDecodeLine(subband->bandParam, subband->bandBuf)) { - return -1; + return false; } if (subband->width <= 0) { - return 0LL; + return true; } // update subband buffers - std::int32_t* bandBuf = reinterpret_cast(subband->bandBuf); - std::int32_t qScale = - q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + std::int32_t* const bandBuf = reinterpret_cast(subband->bandBuf); + std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); if (subband->quantValue / 6 >= 6) { - qScale = q_step_tbl[subband->quantValue % 6] * - (1 << (subband->quantValue / 6 + 26)); + qScale = q_step_tbl[subband->quantValue % 6] * (1 << (subband->quantValue / 6 + 26)); } if (qScale != 1) { - for (std::int32_t i = 0; i < subband->width; i++) { + for (std::int32_t i = 0; i < subband->width; ++i) { bandBuf[i] *= qScale; } } - return 0; + return true; } -void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, - CrxWaveletTransform* wavelet, std::uint32_t tileFlag) +void crxHorizontal53( + std::int32_t* lineBufLA, + std::int32_t* lineBufLB, + CrxWaveletTransform* wavelet, + std::uint32_t tileFlag +) { std::int32_t* band0Buf = wavelet->subband0Buf; std::int32_t* band1Buf = wavelet->subband1Buf; @@ -1829,13 +1817,13 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, if (wavelet->width <= 1) { lineBufLA[0] = band0Buf[0]; lineBufLB[0] = band2Buf[0]; - } else { + } else { if (tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band1Buf; ++band3Buf; - } else { + } else { lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } @@ -1861,10 +1849,10 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, } if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); if (wavelet->width & 1) { @@ -1872,16 +1860,12 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, lineBufLB[2] = deltaB; } } else if (wavelet->width & 1) { - lineBufLA[1] = - band1Buf[0] + - ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[1] = band1Buf[0] + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufLB[1] = - band3Buf[0] + - ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[1] = band3Buf[0] + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } else { + } else { lineBufLA[1] = lineBufLA[0] + band1Buf[0]; lineBufLB[1] = lineBufLB[0] + band3Buf[0]; } @@ -1890,64 +1874,62 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, std::int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, std::int32_t level) { - std::int32_t* result = comp->waveletTransform[level] - .lineBuf[(comp->waveletTransform[level].fltTapH - - comp->waveletTransform[level].curH + 5) % - 5 + - 3]; - comp->waveletTransform[level].curH--; + std::int32_t* const result = comp->waveletTransform[level].lineBuf[ + (comp->waveletTransform[level].fltTapH - comp->waveletTransform[level].curH + 5) % 5 + 3 + ]; + --comp->waveletTransform[level].curH; return result; } -int crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) +bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) { if (comp->waveletTransform[level].curH) { - return 0; + return true; } - CrxSubband* sband = comp->subBands + 3 * level; + CrxSubband* const sband = comp->subBands + 3 * level; - if (comp->waveletTransform[level].height - 3 <= - comp->waveletTransform[level].curLine && - !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (comp->waveletTransform[level].height - 3 <= comp->waveletTransform[level].curLine && !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { if (comp->waveletTransform[level].height & 1) { if (level) { - if (crxIdwt53FilterDecode(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterDecode(comp, level - 1)) { + return false; } - } else if (crxDecodeLineWithIQuantization(sband)) { - return -1; + } else if (!crxDecodeLineWithIQuantization(sband)) { + return false; } - if (crxDecodeLineWithIQuantization(sband + 1)) { - return -1; + if (!crxDecodeLineWithIQuantization(sband + 1)) { + return false; } } - } else { + } else { if (level) { - if (crxIdwt53FilterDecode(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterDecode(comp, level - 1)) { + return false; } - } else if (crxDecodeLineWithIQuantization(sband)) {// LL band - return -1; + } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band + return false; } - if (crxDecodeLineWithIQuantization(sband + 1) ||// HL band - crxDecodeLineWithIQuantization(sband + 2) ||// LH band - crxDecodeLineWithIQuantization(sband + 3)) {// HH band - return -1; + if ( + !crxDecodeLineWithIQuantization(sband + 1) // HL band + || !crxDecodeLineWithIQuantization(sband + 2) // LH band + || !crxDecodeLineWithIQuantization(sband + 3) // HH band + ) { + return false; } } - return 0; + return true; } -int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) +bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) { - CrxWaveletTransform* wavelet = comp->waveletTransform + level; + CrxWaveletTransform* const wavelet = comp->waveletTransform + level; if (wavelet->curH) { - return 0; + return true; } if (wavelet->curLine >= wavelet->height - 3) { @@ -1955,19 +1937,19 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->height & 1) { if (level) { if (!wavelet[-1].curH) { - if (crxIdwt53FilterTransform(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterTransform(comp, level - 1)) { + return false; } } wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; @@ -1977,19 +1959,18 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) // process L bands if (wavelet->width <= 1) { lineBufL0[0] = band0Buf[0]; - } else { + } else { if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); ++band1Buf; - } else { + } else { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); } ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - std::int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; ++band0Buf; @@ -1998,18 +1979,17 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); if (wavelet->width & 1) { lineBufL0[2] = delta; } } else if (wavelet->width & 1) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; - } else { + } else { lineBufL0[1] = band1Buf[0] + lineBufL0[0]; } } @@ -2018,8 +1998,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (std::int32_t i = 0; i < wavelet->width; i++) { - std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + const std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2027,14 +2007,14 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->curH += 3; wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } else { - std::int32_t* lineBufL2 = wavelet->lineBuf[2]; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + } else { + std::int32_t* const lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; wavelet->lineBuf[1] = lineBufL2; wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (std::int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; ++i) { lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; } @@ -2043,26 +2023,26 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } } - } else { + } else { if (level) { - if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) { - return -1; + if (!wavelet[-1].curH && !crxIdwt53FilterTransform(comp, level - 1)) { + return false; } wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; - std::int32_t* band2Buf = wavelet->subband2Buf; - std::int32_t* band3Buf = wavelet->subband3Buf; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* band2Buf = wavelet->subband2Buf; + const std::int32_t* band3Buf = wavelet->subband3Buf; std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; - std::int32_t* lineBufL2 = wavelet->lineBuf[2]; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -2071,13 +2051,13 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->width <= 1) { lineBufL0[0] = band0Buf[0]; lineBufL1[0] = band2Buf[0]; - } else { + } else { if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band1Buf; ++band3Buf; - } else { + } else { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } @@ -2103,10 +2083,10 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); if (wavelet->width & 1) { @@ -2121,7 +2101,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); lineBufL1[2] = delta; - } else { + } else { lineBufL0[1] = lineBufL0[0] + band1Buf[0]; lineBufL1[1] = lineBufL1[0] + band3Buf[0]; } @@ -2132,8 +2112,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL1 = wavelet->lineBuf[1]; lineBufL2 = wavelet->lineBuf[2]; - for (std::int32_t i = 0; i < wavelet->width; i++) { - std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + const std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2142,56 +2122,55 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->curH += 3; wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } else { + } else { wavelet->curH += 2; wavelet->curLine += 2; wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } } - return 0; + return true; } -int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) +bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) { if (prevLevel < 0) { - return 0; + return true; } - for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; - curLevel++, curBand += 3) { - CrxWaveletTransform* wavelet = comp->waveletTransform + curLevel; + for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; ++curLevel, curBand += 3) { + CrxWaveletTransform* const wavelet = comp->waveletTransform + curLevel; if (curLevel) { wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); - } else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) { - return -1; + } else if (!crxDecodeLineWithIQuantization(comp->subBands + curBand)) { + return false; } std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; if (wavelet->height > 1) { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) { - return -1; + if ( + !crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) + ) { + return false; } - std::int32_t* lineBufL0 = wavelet->lineBuf[0]; - std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* const lineBufL0 = wavelet->lineBuf[0]; + const std::int32_t* const lineBufL1 = wavelet->lineBuf[1]; std::int32_t* lineBufL2 = wavelet->lineBuf[2]; if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { - crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, - comp->tileFlag); + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, comp->tileFlag); - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { - return -1; + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)|| !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { + return false; } - std::int32_t* band2Buf = wavelet->subband2Buf; - std::int32_t* band3Buf = wavelet->subband3Buf; + const std::int32_t* band2Buf = wavelet->subband2Buf; + const std::int32_t* band3Buf = wavelet->subband3Buf; // process L band if (wavelet->width <= 1) { @@ -2200,15 +2179,14 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band3Buf; - } else { + } else { lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - std::int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2218,48 +2196,44 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); if (wavelet->width & 1) { lineBufL2[2] = delta; } } else if (wavelet->width & 1) { - std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; - } else { + } else { lineBufL2[1] = band3Buf[0] + lineBufL2[0]; } } // process H band - for (std::int32_t i = 0; i < wavelet->width; i++) { - lineBufH0[i] = - lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + lineBufH0[i] = lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); } - } else { - crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, - comp->tileFlag); + } else { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, comp->tileFlag); - for (int i = 0; i < wavelet->width; i++) { + for (int i = 0; i < wavelet->width; ++i) { lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); } } - if (crxIdwt53FilterDecode(comp, curLevel) || - crxIdwt53FilterTransform(comp, curLevel)) { - return -1; + if (!crxIdwt53FilterDecode(comp, curLevel) || !crxIdwt53FilterTransform(comp, curLevel)) { + return false; } - } else { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { - return -1; + } else { + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { + return false; } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; // process H band if (wavelet->width <= 1) { @@ -2268,7 +2242,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); ++band1Buf; - } else { + } else { lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); } @@ -2285,14 +2259,14 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else if (wavelet->width & 1) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; - } else { + } else { lineBufH0[1] = band1Buf[0] + lineBufH0[0]; } } @@ -2303,7 +2277,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } } - return 0; + return true; } void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) @@ -2317,7 +2291,7 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) return; } - for (std::int32_t i = 0; i < image->subbandCount; i++) { + for (std::int32_t i = 0; i < image->subbandCount; ++i) { if (comp->subBands[i].bandParam) { free(comp->subBands[i].bandParam); comp->subBands[i].bandParam = nullptr; @@ -2340,7 +2314,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t minVal = -maxVal; --maxVal; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal); } @@ -2349,14 +2323,14 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { std::int32_t median = 1 << (img->nBits - 1); std::int32_t maxVal = (1 << img->nBits) - 1; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } @@ -2365,7 +2339,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t median = 1 << (img->nBits - 1); rawOffset = img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } @@ -2382,7 +2356,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored - for (int i = 0; i < img->planeWidth; i++) { + for (int i = 0; i < img->planeWidth; ++i) { std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; std::int32_t val = 0; @@ -2461,7 +2435,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, CrxSubband* subbands = planeComp->subBands; // calculate sizes - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandSize = subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes compDataSize += subbands[subbandNum].bandSize; @@ -2496,7 +2470,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; std::uint8_t* subbandBuf = planeComp->compBuf; - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; subbands[subbandNum].mdatOffset = @@ -2518,7 +2492,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; transformWidth = tile->width; - } else { + } else { waveletTransforms[level].height = subbands[band + 3].height; transformWidth = subbands[band + 4].width; } @@ -2553,7 +2527,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } // decoding params and bitstream initialisation - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { if (subbands[subbandNum].dataSize) { std::int32_t supportsPartial = 0; std::uint32_t roundedBitsMask = 0; @@ -2582,10 +2556,10 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) CrxImage* img = static_cast(p); int imageRow = 0; - for (int tRow = 0; tRow < img->tileRows; tRow++) { + for (int tRow = 0; tRow < img->tileRows; ++tRow) { int imageCol = 0; - for (int tCol = 0; tCol < img->tileCols; tCol++) { + for (int tCol = 0; tCol < img->tileCols; ++tCol) { CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; CrxPlaneComp* planeComp = tile->comps + planeNumber; std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; @@ -2596,13 +2570,13 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) } if (img->levels) { - if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { return -1; } for (int i = 0; i < tile->height; ++i) { - if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || - crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || + !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { return -1; } @@ -2611,7 +2585,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } - } else { + } else { // we have the only subband in this case if (!planeComp->subBands->dataSize) { memset(planeComp->subBands->bandBuf, 0, @@ -2811,7 +2785,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; } } - } else { + } else { // last tile in a tile row tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); @@ -2831,7 +2805,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; } } - } else { + } else { // non first tile row tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); @@ -3052,7 +3026,7 @@ int crxFreeImageData(CrxImage* img) if (img->tiles) { for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { if (tile[curTile].comps) { - for (std::int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + for (std::int32_t curPlane = 0; curPlane < img->nPlanes; ++curPlane) { crxFreeSubbandData(img, tile[curTile].comps + curPlane); } } @@ -3212,7 +3186,7 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) if (hdr->nBits > 15) { return -1; } - } else { + } else { if (hdr->encType && hdr->encType != 3) { return -1; } From 10b085b01e06b3094f298563085009d73501810c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Dec 2019 21:40:32 +0100 Subject: [PATCH 016/100] lmmse demosaic: own compilation unit and some cleanups --- rtengine/CMakeLists.txt | 1 + rtengine/demosaic_algos.cc | 985 ------------------------------------- rtengine/lmmse_demosaic.cc | 824 +++++++++++++++++++++++++++++++ rtengine/rawimagesource.h | 3 +- 4 files changed, 826 insertions(+), 987 deletions(-) create mode 100644 rtengine/lmmse_demosaic.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index f58afde5e..6bce68d1a 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -103,6 +103,7 @@ set(RTENGINESOURCEFILES labimage.cc lcp.cc lj92.c + lmmse_demosaic.cc loadinitial.cc myfile.cc panasonic_decoders.cc diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index d547d3431..c48a002fb 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -21,11 +21,9 @@ #include "rawimagesource.h" #include "rawimage.h" -#include "mytime.h" #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" -#include "sleef.h" #include "opthelper.h" #include "median.h" //#define BENCHMARK @@ -39,16 +37,6 @@ using namespace std; namespace rtengine { -#undef ABS - -#define ABS(a) ((a)<0?-(a):(a)) -#define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] -#define x1125(a) (a + xdivf(a, 3)) -#define x0875(a) (a - xdivf(a, 3)) -#define x0250(a) xdivf(a, 2) -#define x00625(a) xdivf(a, 4) -#define x0125(a) xdivf(a, 3) - #undef fc #define fc(row,col) \ (ri->get_filters() >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) @@ -210,628 +198,6 @@ void RawImageSource::border_interpolate( int winw, int winh, int lborders, const } -// LSMME demosaicing algorithm -// L. Zhang and X. Wu, -// Color demozaicing via directional Linear Minimum Mean Square-error Estimation, -// IEEE Trans. on Image Processing, vol. 14, pp. 2167-2178, -// Dec. 2005. -// Adapted to RawTherapee by Jacques Desmis 3/2013 -// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015 -//TODO Tiles to reduce memory consumption -void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) -{ - const int width = winw, height = winh; - const int ba = 10; - const int rr1 = height + 2 * ba; - const int cc1 = width + 2 * ba; - const int w1 = cc1; - const int w2 = 2 * w1; - const int w3 = 3 * w1; - const int w4 = 4 * w1; - float h0, h1, h2, h3, h4, hs; - h0 = 1.0f; - h1 = exp( -1.0f / 8.0f); - h2 = exp( -4.0f / 8.0f); - h3 = exp( -9.0f / 8.0f); - h4 = exp(-16.0f / 8.0f); - hs = h0 + 2.0f * (h1 + h2 + h3 + h4); - h0 /= hs; - h1 /= hs; - h2 /= hs; - h3 /= hs; - h4 /= hs; - int passref = 0; - int iter = 0; - - if(iterations <= 4) { - iter = iterations - 1; - passref = 0; - } else if (iterations <= 6) { - iter = 3; - passref = iterations - 4; - } else if (iterations <= 8) { - iter = 3; - passref = iterations - 6; - } - - bool applyGamma = true; - - if(iterations == 0) { - applyGamma = false; - iter = 0; - } else { - applyGamma = true; - } - - float *rix[5]; - float *qix[5]; - float *buffer = (float *)calloc(static_cast(rr1) * cc1 * 5 * sizeof(float), 1); - - if(buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones - printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n"); - bool allocationFailed = false; - - for(int i = 0; i < 5; i++) { - qix[i] = (float *)calloc(static_cast(rr1) * cc1 * sizeof(float), 1); - - if(!qix[i]) { // allocation of at least one small block failed - allocationFailed = true; - } - } - - if(allocationFailed) { // fall back to igv_interpolate - printf("lmmse_interpolate_omp: allocation of 5 small memory blocks failed, falling back to igv_interpolate...\n"); - - for(int i = 0; i < 5; i++) { // free the already allocated buffers - if(qix[i]) { - free(qix[i]); - } - } - - igv_interpolate(winw, winh); - return; - } - } else { - qix[0] = buffer; - - for(int i = 1; i < 5; i++) { - qix[i] = qix[i - 1] + rr1 * cc1; - } - } - - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_LMMSE"))); - plistener->setProgress (0.0); - } - - - LUTf *gamtab; - - if(applyGamma) { - gamtab = &(Color::gammatab_24_17a); - } else { - gamtab = new LUTf(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); - gamtab->makeIdentity(65535.f); - } - - -#ifdef _OPENMP - #pragma omp parallel private(rix) -#endif - { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rrr = ba; rrr < rr1 - ba; rrr++) { - for (int ccc = ba, row = rrr - ba; ccc < cc1 - ba; ccc++) { - int col = ccc - ba; - float *rix = qix[4] + rrr * cc1 + ccc; - rix[0] = (*gamtab)[rawData[row][col]]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.1); - } - } - - // G-R(B) -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for (int rr = 2; rr < rr1 - 2; rr++) { - // G-R(B) at R(B) location - for (int cc = 2 + (FC(rr, 2) & 1); cc < cc1 - 2; cc += 2) { - rix[4] = qix[4] + rr * cc1 + cc; - float v0 = x00625(rix[4][-w1 - 1] + rix[4][-w1 + 1] + rix[4][w1 - 1] + rix[4][w1 + 1]) + x0250(rix[4][0]); - // horizontal - rix[0] = qix[0] + rr * cc1 + cc; - rix[0][0] = - x0250(rix[4][ -2] + rix[4][ 2]) + xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); - float Y = v0 + xdiv2f(rix[0][0]); - - if (rix[4][0] > 1.75f * Y) { - rix[0][0] = median(rix[0][0], rix[4][ -1], rix[4][ 1]); - } else { - rix[0][0] = LIM(rix[0][0], 0.0f, 1.0f); - } - - rix[0][0] -= rix[4][0]; - // vertical - rix[1] = qix[1] + rr * cc1 + cc; - rix[1][0] = -x0250(rix[4][-w2] + rix[4][w2]) + xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); - Y = v0 + xdiv2f(rix[1][0]); - - if (rix[4][0] > 1.75f * Y) { - rix[1][0] = median(rix[1][0], rix[4][-w1], rix[4][w1]); - } else { - rix[1][0] = LIM(rix[1][0], 0.0f, 1.0f); - } - - rix[1][0] -= rix[4][0]; - } - - // G-R(B) at G location - for (int ccc = 2 + (FC(rr, 3) & 1); ccc < cc1 - 2; ccc += 2) { - rix[0] = qix[0] + rr * cc1 + ccc; - rix[1] = qix[1] + rr * cc1 + ccc; - rix[4] = qix[4] + rr * cc1 + ccc; - rix[0][0] = x0250(rix[4][ -2] + rix[4][ 2]) - xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); - rix[1][0] = x0250(rix[4][-w2] + rix[4][w2]) - xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); - rix[0][0] = LIM(rix[0][0], -1.0f, 0.0f) + rix[4][0]; - rix[1][0] = LIM(rix[1][0], -1.0f, 0.0f) + rix[4][0]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.2); - } - } - - - // apply low pass filter on differential colors -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 4; rr < rr1 - 4; rr++) - for (int cc = 4; cc < cc1 - 4; cc++) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[2][0] = h0 * rix[0][0] + h1 * (rix[0][ -1] + rix[0][ 1]) + h2 * (rix[0][ -2] + rix[0][ 2]) + h3 * (rix[0][ -3] + rix[0][ 3]) + h4 * (rix[0][ -4] + rix[0][ 4]); - rix[1] = qix[1] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[3][0] = h0 * rix[1][0] + h1 * (rix[1][-w1] + rix[1][w1]) + h2 * (rix[1][-w2] + rix[1][w2]) + h3 * (rix[1][-w3] + rix[1][w3]) + h4 * (rix[1][-w4] + rix[1][w4]); - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.3); - } - } - - // interpolate G-R(B) at R(B) -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 4) & 1); -#ifdef __SSE2__ - __m128 p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v, muv, vxv, vnv, xhv, vhv, xvv, vvv; - __m128 epsv = _mm_set1_ps(1e-7); - __m128 ninev = _mm_set1_ps(9.f); - - for (; cc < cc1 - 10; cc += 8) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - // horizontal - p1v = LC2VFU(rix[2][-4]); - p2v = LC2VFU(rix[2][-3]); - p3v = LC2VFU(rix[2][-2]); - p4v = LC2VFU(rix[2][-1]); - p5v = LC2VFU(rix[2][ 0]); - p6v = LC2VFU(rix[2][ 1]); - p7v = LC2VFU(rix[2][ 2]); - p8v = LC2VFU(rix[2][ 3]); - p9v = LC2VFU(rix[2][ 4]); - muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; - vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); - p1v -= LC2VFU(rix[0][-4]); - p2v -= LC2VFU(rix[0][-3]); - p3v -= LC2VFU(rix[0][-2]); - p4v -= LC2VFU(rix[0][-1]); - p5v -= LC2VFU(rix[0][ 0]); - p6v -= LC2VFU(rix[0][ 1]); - p7v -= LC2VFU(rix[0][ 2]); - p8v -= LC2VFU(rix[0][ 3]); - p9v -= LC2VFU(rix[0][ 4]); - vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); - xhv = (LC2VFU(rix[0][0]) * vxv + LC2VFU(rix[2][0]) * vnv) / (vxv + vnv); - vhv = vxv * vnv / (vxv + vnv); - - // vertical - p1v = LC2VFU(rix[3][-w4]); - p2v = LC2VFU(rix[3][-w3]); - p3v = LC2VFU(rix[3][-w2]); - p4v = LC2VFU(rix[3][-w1]); - p5v = LC2VFU(rix[3][ 0]); - p6v = LC2VFU(rix[3][ w1]); - p7v = LC2VFU(rix[3][ w2]); - p8v = LC2VFU(rix[3][ w3]); - p9v = LC2VFU(rix[3][ w4]); - muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; - vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); - p1v -= LC2VFU(rix[1][-w4]); - p2v -= LC2VFU(rix[1][-w3]); - p3v -= LC2VFU(rix[1][-w2]); - p4v -= LC2VFU(rix[1][-w1]); - p5v -= LC2VFU(rix[1][ 0]); - p6v -= LC2VFU(rix[1][ w1]); - p7v -= LC2VFU(rix[1][ w2]); - p8v -= LC2VFU(rix[1][ w3]); - p9v -= LC2VFU(rix[1][ w4]); - vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); - xvv = (LC2VFU(rix[1][0]) * vxv + LC2VFU(rix[3][0]) * vnv) / (vxv + vnv); - vvv = vxv * vnv / (vxv + vnv); - // interpolated G-R(B) - muv = (xhv * vvv + xvv * vhv) / (vhv + vvv); - STC2VFU(rix[4][0], muv); - } - -#endif - - for (; cc < cc1 - 4; cc += 2) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - // horizontal - float p1 = rix[2][-4]; - float p2 = rix[2][-3]; - float p3 = rix[2][-2]; - float p4 = rix[2][-1]; - float p5 = rix[2][ 0]; - float p6 = rix[2][ 1]; - float p7 = rix[2][ 2]; - float p8 = rix[2][ 3]; - float p9 = rix[2][ 4]; - float mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; - float vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); - p1 -= rix[0][-4]; - p2 -= rix[0][-3]; - p3 -= rix[0][-2]; - p4 -= rix[0][-1]; - p5 -= rix[0][ 0]; - p6 -= rix[0][ 1]; - p7 -= rix[0][ 2]; - p8 -= rix[0][ 3]; - p9 -= rix[0][ 4]; - float vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); - float xh = (rix[0][0] * vx + rix[2][0] * vn) / (vx + vn); - float vh = vx * vn / (vx + vn); - - // vertical - p1 = rix[3][-w4]; - p2 = rix[3][-w3]; - p3 = rix[3][-w2]; - p4 = rix[3][-w1]; - p5 = rix[3][ 0]; - p6 = rix[3][ w1]; - p7 = rix[3][ w2]; - p8 = rix[3][ w3]; - p9 = rix[3][ w4]; - mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; - vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); - p1 -= rix[1][-w4]; - p2 -= rix[1][-w3]; - p3 -= rix[1][-w2]; - p4 -= rix[1][-w1]; - p5 -= rix[1][ 0]; - p6 -= rix[1][ w1]; - p7 -= rix[1][ w2]; - p8 -= rix[1][ w3]; - p9 -= rix[1][ w4]; - vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); - float xv = (rix[1][0] * vx + rix[3][0] * vn) / (vx + vn); - float vv = vx * vn / (vx + vn); - // interpolated G-R(B) - rix[4][0] = (xh * vv + xv * vh) / (vh + vv); - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.4); - } - } - - // copy CFA values -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 0; rr < rr1; rr++) - for (int cc = 0, row = rr - ba; cc < cc1; cc++) { - int col = cc - ba; - int c = FC(rr, cc); - rix[c] = qix[c] + rr * cc1 + cc; - - if ((row >= 0) & (row < height) & (col >= 0) & (col < width)) { - rix[c][0] = (*gamtab)[rawData[row][col]]; - } else { - rix[c][0] = 0.f; - } - - if (c != 1) { - rix[1] = qix[1] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - rix[1][0] = rix[c][0] + rix[4][0]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.5); - } - } - - // bilinear interpolation for R/B - // interpolate R/B at G location -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) - for (int cc = 1 + (FC(rr, 2) & 1), c = FC(rr, cc + 1); cc < cc1 - 1; cc += 2) { - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + xdiv2f(rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1]); - c = 2 - c; - rix[c] = qix[c] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + xdiv2f(rix[c][-w1] - rix[1][-w1] + rix[c][w1] - rix[1][w1]); - c = 2 - c; - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.6); - } - } - - // interpolate R/B at B/R location -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) - for (int cc = 1 + (FC(rr, 1) & 1), c = 2 - FC(rr, cc); cc < cc1 - 1; cc += 2) { - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + x0250(rix[c][-w1] - rix[1][-w1] + rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1] + rix[c][ w1] - rix[1][ w1]); - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.7); - } - } - - }// End of parallelization 1 - - // median filter/ - for (int pass = 0; pass < iter; pass++) { - // Apply 3x3 median filter - // Compute median(R-G) and median(B-G) - -#ifdef _OPENMP - #pragma omp parallel for private(rix) -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) { - for (int c = 0; c < 3; c += 2) { - int d = c + 3 - (c == 0 ? 0 : 1); - int cc = 1; -#ifdef __SSE2__ - - for (; cc < cc1 - 4; cc += 4) { - rix[d] = qix[d] + rr * cc1 + cc; - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - // Assign 3x3 differential color values - const std::array p = { - LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), - LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), - LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), - LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), - LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), - LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), - LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), - LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), - LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) - }; - _mm_storeu_ps(&rix[d][0], median(p)); - } - -#endif - - for (; cc < cc1 - 1; cc++) { - rix[d] = qix[d] + rr * cc1 + cc; - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - // Assign 3x3 differential color values - const std::array p = { - rix[c][-w1 - 1] - rix[1][-w1 - 1], - rix[c][-w1] - rix[1][-w1], - rix[c][-w1 + 1] - rix[1][-w1 + 1], - rix[c][ -1] - rix[1][ -1], - rix[c][ 0] - rix[1][ 0], - rix[c][ 1] - rix[1][ 1], - rix[c][ w1 - 1] - rix[1][ w1 - 1], - rix[c][ w1] - rix[1][ w1], - rix[c][ w1 + 1] - rix[1][ w1 + 1] - }; - rix[d][0] = median(p); - } - } - } - - // red/blue at GREEN pixel locations & red/blue and green at BLUE/RED pixel locations -#ifdef _OPENMP - #pragma omp parallel for private (rix) -#endif - - for (int rr = 0; rr < rr1; rr++) { - rix[0] = qix[0] + rr * cc1; - rix[1] = qix[1] + rr * cc1; - rix[2] = qix[2] + rr * cc1; - rix[3] = qix[3] + rr * cc1; - rix[4] = qix[4] + rr * cc1; - int c0 = FC(rr, 0); - int c1 = FC(rr, 1); - - if(c0 == 1) { - c1 = 2 - c1; - int d = c1 + 3 - (c1 == 0 ? 0 : 1); - int cc; - - for (cc = 0; cc < cc1 - 1; cc += 2) { - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - rix[c1][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - } - - if(cc < cc1) { // remaining pixel, only if width is odd - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - } - } else { - c0 = 2 - c0; - int d = c0 + 3 - (c0 == 0 ? 0 : 1); - int cc; - - for (cc = 0; cc < cc1 - 1; cc += 2) { - rix[c0][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - } - - if(cc < cc1) { // remaining pixel, only if width is odd - rix[c0][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - } - } - } - } - - if (plistener) { - plistener->setProgress (0.8); - } - - if(applyGamma) { - gamtab = &(Color::igammatab_24_17); - } else { - gamtab->makeIdentity(); - } - - array2D* rgb[3]; - rgb[0] = &red; - rgb[1] = &green; - rgb[2] = &blue; - - // copy result back to image matrix -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < height; row++) { - for (int col = 0, rr = row + ba; col < width; col++) { - int cc = col + ba; - int c = FC(row, col); - - for (int ii = 0; ii < 3; ii++) - if (ii != c) { - float *rix = qix[ii] + rr * cc1 + cc; - (*(rgb[ii]))[row][col] = (*gamtab)[65535.f * rix[0]]; - } else { - (*(rgb[ii]))[row][col] = CLIP(rawData[row][col]); - } - } - } - - if (plistener) { - plistener->setProgress (1.0); - } - - if(buffer) { - free(buffer); - } else - for(int i = 0; i < 5; i++) { - free(qix[i]); - } - - if(!applyGamma) { - delete gamtab; - } - - if(iterations > 4 && iterations <= 6) { - refinement(passref); - } else if(iterations > 6) { - refinement_lassus(passref); - } - -} - /*** * * Bayer CFA Demosaicing using Integrated Gaussian Vector on Color Differences @@ -1553,357 +919,6 @@ void RawImageSource::nodemosaic(bool bw) } } -/* - Refinement based on EECI demosaicing algorithm by L. Chang and Y.P. Tan - Paul Lee - Adapted for RawTherapee - Jacques Desmis 04/2013 -*/ - -#ifdef __SSE2__ -#define CLIPV(a) vclampf(a,ZEROV,c65535v) -#endif -void RawImageSource::refinement(int PassCount) -{ - MyTime t1e, t2e; - t1e.set(); - - int width = W; - int height = H; - int w1 = width; - int w2 = 2 * w1; - - if (plistener) { - plistener->setProgressStr (M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); - } - - array2D *rgb[3]; - rgb[0] = &red; - rgb[1] = &green; - rgb[2] = &blue; - - for (int b = 0; b < PassCount; b++) { - if (plistener) { - plistener->setProgress ((float)b / PassCount); - } - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float *pix[3]; - - /* Reinforce interpolated green pixels on RED/BLUE pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 2) & 1); - int c = FC(row, col); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[c] = (float*)(*rgb[c]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - dLv = onev / (onev + vabsf(LC2VFU(pix[c][ -2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[c][ 2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[c][-w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[c][ w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - v0v = CLIPV(LC2VFU(pix[c][0]) + zd5v + ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[1][0], v0v); - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[c] = (float*)(*rgb[c]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - float dL = 1.f / (1.f + fabsf(pix[c][ -2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dR = 1.f / (1.f + fabsf(pix[c][ 2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dU = 1.f / (1.f + fabsf(pix[c][-w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float dD = 1.f / (1.f + fabsf(pix[c][ w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float v0 = (pix[c][0] + 0.5f + ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[1][0] = CLIP(v0); - } - } - - /* Reinforce interpolated red/blue pixels on GREEN pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 3) & 1); - int c = FC(row, col + 1); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[1] = (float*)(*rgb[1]) + indx; - - for (int i = 0; i < 2; c = 2 - c, i++) { - pix[c] = (float*)(*rgb[c]) + indx; - dLv = onev / (onev + vabsf(LC2VFU(pix[1][ -2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[1][ 2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[1][-w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[1][ w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); - v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[c][0], v0v); - } - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[1] = (float*)(*rgb[1]) + indx; - - for (int i = 0; i < 2; c = 2 - c, i++) { - pix[c] = (float*)(*rgb[c]) + indx; - float dL = 1.f / (1.f + fabsf(pix[1][ -2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); - float dR = 1.f / (1.f + fabsf(pix[1][ 2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); - float dU = 1.f / (1.f + fabsf(pix[1][-w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); - float dD = 1.f / (1.f + fabsf(pix[1][ w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); - float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[c][0] = CLIP(v0); - } - } - } - - /* Reinforce integrated red/blue pixels on BLUE/RED pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 2) & 1); - int c = 2 - FC(row, col); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[0] = (float*)(*rgb[0]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - pix[2] = (float*)(*rgb[2]) + indx; - int d = 2 - c; - dLv = onev / (onev + vabsf(LC2VFU(pix[d][ -2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[d][ 2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[d][-w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[d][ w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[c][0], v0v); - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[0] = (float*)(*rgb[0]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - pix[2] = (float*)(*rgb[2]) + indx; - int d = 2 - c; - float dL = 1.f / (1.f + fabsf(pix[d][ -2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dR = 1.f / (1.f + fabsf(pix[d][ 2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dU = 1.f / (1.f + fabsf(pix[d][-w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float dD = 1.f / (1.f + fabsf(pix[d][ w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[c][0] = CLIP(v0); - } - } - } // end parallel - } - - t2e.set(); - - if (settings->verbose) { - printf("Refinement Lee %d usec\n", t2e.etime(t1e)); - } -} -#ifdef __SSE2__ -#undef CLIPV -#endif - - -// Refinement based on EECI demozaicing algorithm by L. Chang and Y.P. Tan -// from "Lassus" : Luis Sanz Rodriguez, adapted by Jacques Desmis - JDC - and Oliver Duis for RawTherapee -// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : -// eg: Lighthouse + AMaZE : without refinement:39.96 dB, with refinement:41.86 dB -// reduce color artifacts, improves the interpolation -// but it's relatively slow -// -// Should be DISABLED if it decreases image quality by increases some image noise and generates blocky edges -void RawImageSource::refinement_lassus(int PassCount) -{ - // const int PassCount=1; - - // if (settings->verbose) printf("Refinement\n"); - - MyTime t1e, t2e; - t1e.set(); - int u = W, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u; - float (*image)[3]; - image = (float(*)[3]) calloc(static_cast(W) * H, sizeof * image); -#ifdef _OPENMP - #pragma omp parallel shared(image) -#endif - { - // convert red, blue, green to image -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H; i++) { - for (int j = 0; j < W; j++) { - image[i * W + j][0] = red [i][j]; - image[i * W + j][1] = green[i][j]; - image[i * W + j][2] = blue [i][j]; - } - } - - for (int b = 0; b < PassCount; b++) { - if (plistener) { - plistener->setProgressStr (M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); - plistener->setProgress ((float)b / PassCount); - } - - // Reinforce interpolated green pixels on RED/BLUE pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 2) & 1), c = FC(row, col); col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - // Cubic Spline Interpolation by Li and Randhawa, modified by Luis Sanz Rodriguez - - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-v][c]) - x0875(pix[0][c]) - x0250(pix[-x][c]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[-w][1])) + fabs(x0875(pix[-w][1]) - x1125(pix[-u][1]) + x0250(pix[-y][1]))); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+2][c]) - x0875(pix[0][c]) - x0250(pix[+4][c]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[+3][1])) + fabs(x0875(pix[+3][1]) - x1125(pix[+1][1]) + x0250(pix[+5][1]))); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-2][c]) - x0875(pix[0][c]) - x0250(pix[-4][c]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[-3][1])) + fabs(x0875(pix[-3][1]) - x1125(pix[-1][1]) + x0250(pix[-5][1]))); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+v][c]) - x0875(pix[0][c]) - x0250(pix[+x][c]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[+w][1])) + fabs(x0875(pix[+w][1]) - x1125(pix[+u][1]) + x0250(pix[+y][1]))); - - float g[4];//CLIREF avoid overflow - g[0] = pix[0][c] + (x0875(CLIREF(pix[-u][1] - pix[-u][c])) + x0125(CLIREF(pix[+u][1] - pix[+u][c]))); - g[1] = pix[0][c] + (x0875(CLIREF(pix[+1][1] - pix[+1][c])) + x0125(CLIREF(pix[-1][1] - pix[-1][c]))); - g[2] = pix[0][c] + (x0875(CLIREF(pix[-1][1] - pix[-1][c])) + x0125(CLIREF(pix[+1][1] - pix[+1][c]))); - g[3] = pix[0][c] + (x0875(CLIREF(pix[+u][1] - pix[+u][c])) + x0125(CLIREF(pix[-u][1] - pix[-u][c]))); - - pix[0][1] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - - } - } - - // Reinforce interpolated red/blue pixels on GREEN pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 3) & 1), c = FC(row, col + 1); col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - for (int i = 0; i < 2; c = 2 - c, i++) { - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[-v][1]) - x1125(pix[0][1]) + x0250(pix[-x][1]))) + fabs(pix[u] [c] - pix[-u][c]) + fabs(pix[-w][c] - pix[-u][c])); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[+2][1]) - x1125(pix[0][1]) + x0250(pix[+4][1]))) + fabs(pix[+1][c] - pix[-1][c]) + fabs(pix[+3][c] - pix[+1][c])); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[-2][1]) - x1125(pix[0][1]) + x0250(pix[-4][1]))) + fabs(pix[+1][c] - pix[-1][c]) + fabs(pix[-3][c] - pix[-1][c])); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[+v][1]) - x1125(pix[0][1]) + x0250(pix[+x][1]))) + fabs(pix[u] [c] - pix[-u][c]) + fabs(pix[+w][c] - pix[+u][c])); - - float g[5];//CLIREF avoid overflow - g[0] = CLIREF(pix[-u][1] - pix[-u][c]); - g[1] = CLIREF(pix[+1][1] - pix[+1][c]); - g[2] = CLIREF(pix[-1][1] - pix[-1][c]); - g[3] = CLIREF(pix[+u][1] - pix[+u][c]); - g[4] = ((f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3])); - pix[0][c] = pix[0][1] - (0.65f * g[4] + 0.35f * CLIREF(pix[0][1] - pix[0][c])); - } - } - } - - // Reinforce integrated red/blue pixels on BLUE/RED pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 2) & 1), c = 2 - FC(row, col), d = 2 - c; col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-v][d]) - x0875(pix[0][d]) - x0250(pix[-x][d]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[-w][1])) + fabs(x0875(pix[-w][1]) - x1125(pix[-u][1]) + x0250(pix[-y][1]))); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+2][d]) - x0875(pix[0][d]) - x0250(pix[+4][d]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[+3][1])) + fabs(x0875(pix[+3][1]) - x1125(pix[+1][1]) + x0250(pix[+5][1]))); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-2][d]) - x0875(pix[0][d]) - x0250(pix[-4][d]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[-3][1])) + fabs(x0875(pix[-3][1]) - x1125(pix[-1][1]) + x0250(pix[-5][1]))); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+v][d]) - x0875(pix[0][d]) - x0250(pix[+x][d]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[+w][1])) + fabs(x0875(pix[+w][1]) - x1125(pix[+u][1]) + x0250(pix[+y][1]))); - - float g[5]; - g[0] = (x0875((pix[-u][1] - pix[-u][c])) + x0125((pix[-v][1] - pix[-v][c]))); - g[1] = (x0875((pix[+1][1] - pix[+1][c])) + x0125((pix[+2][1] - pix[+2][c]))); - g[2] = (x0875((pix[-1][1] - pix[-1][c])) + x0125((pix[-2][1] - pix[-2][c]))); - g[3] = (x0875((pix[+u][1] - pix[+u][c])) + x0125((pix[+v][1] - pix[+v][c]))); - - g[4] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - - const std::array p = { - pix[-u - 1][1] - pix[-u - 1][c], - pix[-u + 0][1] - pix[-u + 0][c], - pix[-u + 1][1] - pix[-u + 1][c], - pix[+0 - 1][1] - pix[+0 - 1][c], - pix[+0 + 0][1] - pix[+0 + 0][c], - pix[+0 + 1][1] - pix[+0 + 1][c], - pix[+u - 1][1] - pix[+u - 1][c], - pix[+u + 0][1] - pix[+u + 0][c], - pix[+u + 1][1] - pix[+u + 1][c] - }; - - const float med = median(p); - - pix[0][c] = LIM(pix[0][1] - (1.30f * g[4] - 0.30f * (pix[0][1] - pix[0][c])), 0.99f * (pix[0][1] - med), 1.01f * (pix[0][1] - med)); - - } - } - - } - - // put modified values to red, green, blue -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H; i++) { - for (int j = 0; j < W; j++) { - red [i][j] = image[i * W + j][0]; - green[i][j] = image[i * W + j][1]; - blue [i][j] = image[i * W + j][2]; - } - } - } - - free(image); - - t2e.set(); - - if (settings->verbose) { - printf("Refinement Lassus %d usec\n", t2e.etime(t1e)); - } -} - - /* * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/rtengine/lmmse_demosaic.cc b/rtengine/lmmse_demosaic.cc new file mode 100644 index 000000000..6191ca36c --- /dev/null +++ b/rtengine/lmmse_demosaic.cc @@ -0,0 +1,824 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include "rawimagesource.h" +#include "rt_math.h" +#include "color.h" +#include "../rtgui/multilangmgr.h" +#include "sleef.h" +#include "opthelper.h" +#include "median.h" + +using namespace std; + +namespace rtengine +{ + +// LSMME demosaicing algorithm +// L. Zhang and X. Wu, +// Color demozaicing via directional Linear Minimum Mean Square-error Estimation, +// IEEE Trans. on Image Processing, vol. 14, pp. 2167-2178, +// Dec. 2005. +// Adapted to RawTherapee by Jacques Desmis 3/2013 +// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015 +// TODO Tiles to reduce memory consumption +void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) +{ + const int width = winw, height = winh; + const int ba = 10; + const int rr1 = height + 2 * ba; + const int cc1 = width + 2 * ba; + const int w1 = cc1; + const int w2 = 2 * w1; + const int w3 = 3 * w1; + const int w4 = 4 * w1; + float h0, h1, h2, h3, h4, hs; + h0 = 1.0f; + h1 = exp( -1.0f / 8.0f); + h2 = exp( -4.0f / 8.0f); + h3 = exp( -9.0f / 8.0f); + h4 = exp(-16.0f / 8.0f); + hs = h0 + 2.0f * (h1 + h2 + h3 + h4); + h0 /= hs; + h1 /= hs; + h2 /= hs; + h3 /= hs; + h4 /= hs; + int passref = 0; + int iter = 0; + + if (iterations <= 4) { + iter = iterations - 1; + passref = 0; + } else if (iterations <= 6) { + iter = 3; + passref = iterations - 4; + } else if (iterations <= 8) { + iter = 3; + passref = iterations - 6; + } + + bool applyGamma = true; + + if (iterations == 0) { + applyGamma = false; + iter = 0; + } else { + applyGamma = true; + } + + float *rix[5]; + float *qix[5]; + float *buffer = (float *)calloc(static_cast(rr1) * cc1 * 5 * sizeof(float), 1); + + if (buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones + printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n"); + bool allocationFailed = false; + + for (int i = 0; i < 5; i++) { + qix[i] = (float *)calloc(static_cast(rr1) * cc1 * sizeof(float), 1); + + if (!qix[i]) { // allocation of at least one small block failed + allocationFailed = true; + } + } + + if (allocationFailed) { // fall back to igv_interpolate + printf("lmmse_interpolate_omp: allocation of 5 small memory blocks failed, falling back to igv_interpolate...\n"); + + for (int i = 0; i < 5; i++) { // free the already allocated buffers + if (qix[i]) { + free(qix[i]); + } + } + + igv_interpolate(winw, winh); + return; + } + } else { + qix[0] = buffer; + + for (int i = 1; i < 5; i++) { + qix[i] = qix[i - 1] + rr1 * cc1; + } + } + + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_LMMSE"))); + plistener->setProgress (0.0); + } + + + LUTf *gamtab; + + if (applyGamma) { + gamtab = &(Color::gammatab_24_17a); + } else { + gamtab = new LUTf(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); + gamtab->makeIdentity(65535.f); + } + + +#ifdef _OPENMP + #pragma omp parallel private(rix) +#endif + { +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rrr = ba; rrr < rr1 - ba; rrr++) { + for (int ccc = ba, row = rrr - ba; ccc < cc1 - ba; ccc++) { + int col = ccc - ba; + float *rix = qix[4] + rrr * cc1 + ccc; + rix[0] = (*gamtab)[rawData[row][col]]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.1); + } + } + + // G-R(B) +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int rr = 2; rr < rr1 - 2; rr++) { + // G-R(B) at R(B) location + for (int cc = 2 + (FC(rr, 2) & 1); cc < cc1 - 2; cc += 2) { + rix[4] = qix[4] + rr * cc1 + cc; + float v0 = 0.0625f * (rix[4][-w1 - 1] + rix[4][-w1 + 1] + rix[4][w1 - 1] + rix[4][w1 + 1]) + 0.25f * (rix[4][0]); + // horizontal + rix[0] = qix[0] + rr * cc1 + cc; + rix[0][0] = -0.25f * (rix[4][ -2] + rix[4][ 2]) + xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); + float Y = v0 + xdiv2f(rix[0][0]); + + if (rix[4][0] > 1.75f * Y) { + rix[0][0] = median(rix[0][0], rix[4][ -1], rix[4][ 1]); + } else { + rix[0][0] = LIM(rix[0][0], 0.0f, 1.0f); + } + + rix[0][0] -= rix[4][0]; + // vertical + rix[1] = qix[1] + rr * cc1 + cc; + rix[1][0] = -0.25f * (rix[4][-w2] + rix[4][w2]) + xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); + Y = v0 + xdiv2f(rix[1][0]); + + if (rix[4][0] > 1.75f * Y) { + rix[1][0] = median(rix[1][0], rix[4][-w1], rix[4][w1]); + } else { + rix[1][0] = LIM(rix[1][0], 0.0f, 1.0f); + } + + rix[1][0] -= rix[4][0]; + } + + // G-R(B) at G location + for (int ccc = 2 + (FC(rr, 3) & 1); ccc < cc1 - 2; ccc += 2) { + rix[0] = qix[0] + rr * cc1 + ccc; + rix[1] = qix[1] + rr * cc1 + ccc; + rix[4] = qix[4] + rr * cc1 + ccc; + rix[0][0] = 0.25f * (rix[4][ -2] + rix[4][ 2]) - xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); + rix[1][0] = 0.25f * (rix[4][-w2] + rix[4][w2]) - xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); + rix[0][0] = LIM(rix[0][0], -1.0f, 0.0f) + rix[4][0]; + rix[1][0] = LIM(rix[1][0], -1.0f, 0.0f) + rix[4][0]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.2); + } + } + + + // apply low pass filter on differential colors +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 4; rr < rr1 - 4; rr++) + for (int cc = 4; cc < cc1 - 4; cc++) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[2][0] = h0 * rix[0][0] + h1 * (rix[0][ -1] + rix[0][ 1]) + h2 * (rix[0][ -2] + rix[0][ 2]) + h3 * (rix[0][ -3] + rix[0][ 3]) + h4 * (rix[0][ -4] + rix[0][ 4]); + rix[1] = qix[1] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[3][0] = h0 * rix[1][0] + h1 * (rix[1][-w1] + rix[1][w1]) + h2 * (rix[1][-w2] + rix[1][w2]) + h3 * (rix[1][-w3] + rix[1][w3]) + h4 * (rix[1][-w4] + rix[1][w4]); + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.3); + } + } + + // interpolate G-R(B) at R(B) +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 4; rr < rr1 - 4; rr++) { + int cc = 4 + (FC(rr, 4) & 1); +#ifdef __SSE2__ + vfloat p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v, muv, vxv, vnv, xhv, vhv, xvv, vvv; + vfloat epsv = F2V(1e-7); + vfloat ninev = F2V(9.f); + + for (; cc < cc1 - 10; cc += 8) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + // horizontal + p1v = LC2VFU(rix[2][-4]); + p2v = LC2VFU(rix[2][-3]); + p3v = LC2VFU(rix[2][-2]); + p4v = LC2VFU(rix[2][-1]); + p5v = LC2VFU(rix[2][ 0]); + p6v = LC2VFU(rix[2][ 1]); + p7v = LC2VFU(rix[2][ 2]); + p8v = LC2VFU(rix[2][ 3]); + p9v = LC2VFU(rix[2][ 4]); + muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; + vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); + p1v -= LC2VFU(rix[0][-4]); + p2v -= LC2VFU(rix[0][-3]); + p3v -= LC2VFU(rix[0][-2]); + p4v -= LC2VFU(rix[0][-1]); + p5v -= LC2VFU(rix[0][ 0]); + p6v -= LC2VFU(rix[0][ 1]); + p7v -= LC2VFU(rix[0][ 2]); + p8v -= LC2VFU(rix[0][ 3]); + p9v -= LC2VFU(rix[0][ 4]); + vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); + xhv = (LC2VFU(rix[0][0]) * vxv + LC2VFU(rix[2][0]) * vnv) / (vxv + vnv); + vhv = vxv * vnv / (vxv + vnv); + + // vertical + p1v = LC2VFU(rix[3][-w4]); + p2v = LC2VFU(rix[3][-w3]); + p3v = LC2VFU(rix[3][-w2]); + p4v = LC2VFU(rix[3][-w1]); + p5v = LC2VFU(rix[3][ 0]); + p6v = LC2VFU(rix[3][ w1]); + p7v = LC2VFU(rix[3][ w2]); + p8v = LC2VFU(rix[3][ w3]); + p9v = LC2VFU(rix[3][ w4]); + muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; + vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); + p1v -= LC2VFU(rix[1][-w4]); + p2v -= LC2VFU(rix[1][-w3]); + p3v -= LC2VFU(rix[1][-w2]); + p4v -= LC2VFU(rix[1][-w1]); + p5v -= LC2VFU(rix[1][ 0]); + p6v -= LC2VFU(rix[1][ w1]); + p7v -= LC2VFU(rix[1][ w2]); + p8v -= LC2VFU(rix[1][ w3]); + p9v -= LC2VFU(rix[1][ w4]); + vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); + xvv = (LC2VFU(rix[1][0]) * vxv + LC2VFU(rix[3][0]) * vnv) / (vxv + vnv); + vvv = vxv * vnv / (vxv + vnv); + // interpolated G-R(B) + muv = (xhv * vvv + xvv * vhv) / (vhv + vvv); + STC2VFU(rix[4][0], muv); + } + +#endif + + for (; cc < cc1 - 4; cc += 2) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + // horizontal + float p1 = rix[2][-4]; + float p2 = rix[2][-3]; + float p3 = rix[2][-2]; + float p4 = rix[2][-1]; + float p5 = rix[2][ 0]; + float p6 = rix[2][ 1]; + float p7 = rix[2][ 2]; + float p8 = rix[2][ 3]; + float p9 = rix[2][ 4]; + float mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; + float vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); + p1 -= rix[0][-4]; + p2 -= rix[0][-3]; + p3 -= rix[0][-2]; + p4 -= rix[0][-1]; + p5 -= rix[0][ 0]; + p6 -= rix[0][ 1]; + p7 -= rix[0][ 2]; + p8 -= rix[0][ 3]; + p9 -= rix[0][ 4]; + float vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); + float xh = (rix[0][0] * vx + rix[2][0] * vn) / (vx + vn); + float vh = vx * vn / (vx + vn); + + // vertical + p1 = rix[3][-w4]; + p2 = rix[3][-w3]; + p3 = rix[3][-w2]; + p4 = rix[3][-w1]; + p5 = rix[3][ 0]; + p6 = rix[3][ w1]; + p7 = rix[3][ w2]; + p8 = rix[3][ w3]; + p9 = rix[3][ w4]; + mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; + vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); + p1 -= rix[1][-w4]; + p2 -= rix[1][-w3]; + p3 -= rix[1][-w2]; + p4 -= rix[1][-w1]; + p5 -= rix[1][ 0]; + p6 -= rix[1][ w1]; + p7 -= rix[1][ w2]; + p8 -= rix[1][ w3]; + p9 -= rix[1][ w4]; + vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); + float xv = (rix[1][0] * vx + rix[3][0] * vn) / (vx + vn); + float vv = vx * vn / (vx + vn); + // interpolated G-R(B) + rix[4][0] = (xh * vv + xv * vh) / (vh + vv); + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.4); + } + } + + // copy CFA values +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 0; rr < rr1; rr++) + for (int cc = 0, row = rr - ba; cc < cc1; cc++) { + int col = cc - ba; + int c = FC(rr, cc); + rix[c] = qix[c] + rr * cc1 + cc; + + if ((row >= 0) & (row < height) & (col >= 0) & (col < width)) { + rix[c][0] = (*gamtab)[rawData[row][col]]; + } else { + rix[c][0] = 0.f; + } + + if (c != 1) { + rix[1] = qix[1] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + rix[1][0] = rix[c][0] + rix[4][0]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.5); + } + } + + // bilinear interpolation for R/B + // interpolate R/B at G location +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) + for (int cc = 1 + (FC(rr, 2) & 1), c = FC(rr, cc + 1); cc < cc1 - 1; cc += 2) { + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + xdiv2f(rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1]); + c = 2 - c; + rix[c] = qix[c] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + xdiv2f(rix[c][-w1] - rix[1][-w1] + rix[c][w1] - rix[1][w1]); + c = 2 - c; + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.6); + } + } + + // interpolate R/B at B/R location +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) + for (int cc = 1 + (FC(rr, 1) & 1), c = 2 - FC(rr, cc); cc < cc1 - 1; cc += 2) { + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + 0.25f * (rix[c][-w1] - rix[1][-w1] + rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1] + rix[c][ w1] - rix[1][ w1]); + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.7); + } + } + + }// End of parallelization 1 + + // median filter/ + for (int pass = 0; pass < iter; pass++) { + // Apply 3x3 median filter + // Compute median(R-G) and median(B-G) + +#ifdef _OPENMP + #pragma omp parallel for private(rix) +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) { + for (int c = 0; c < 3; c += 2) { + int d = c + 3 - (c == 0 ? 0 : 1); + int cc = 1; +#ifdef __SSE2__ + + for (; cc < cc1 - 4; cc += 4) { + rix[d] = qix[d] + rr * cc1 + cc; + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + // Assign 3x3 differential color values + const std::array p = { + LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), + LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), + LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), + LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), + LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), + LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), + LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), + LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), + LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) + }; + _mm_storeu_ps(&rix[d][0], median(p)); + } + +#endif + + for (; cc < cc1 - 1; cc++) { + rix[d] = qix[d] + rr * cc1 + cc; + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + // Assign 3x3 differential color values + const std::array p = { + rix[c][-w1 - 1] - rix[1][-w1 - 1], + rix[c][-w1] - rix[1][-w1], + rix[c][-w1 + 1] - rix[1][-w1 + 1], + rix[c][ -1] - rix[1][ -1], + rix[c][ 0] - rix[1][ 0], + rix[c][ 1] - rix[1][ 1], + rix[c][ w1 - 1] - rix[1][ w1 - 1], + rix[c][ w1] - rix[1][ w1], + rix[c][ w1 + 1] - rix[1][ w1 + 1] + }; + rix[d][0] = median(p); + } + } + } + + // red/blue at GREEN pixel locations & red/blue and green at BLUE/RED pixel locations +#ifdef _OPENMP + #pragma omp parallel for private (rix) +#endif + + for (int rr = 0; rr < rr1; rr++) { + rix[0] = qix[0] + rr * cc1; + rix[1] = qix[1] + rr * cc1; + rix[2] = qix[2] + rr * cc1; + rix[3] = qix[3] + rr * cc1; + rix[4] = qix[4] + rr * cc1; + int c0 = FC(rr, 0); + int c1 = FC(rr, 1); + + if (c0 == 1) { + c1 = 2 - c1; + int d = c1 + 3 - (c1 == 0 ? 0 : 1); + int cc; + + for (cc = 0; cc < cc1 - 1; cc += 2) { + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + rix[c1][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + } + + if (cc < cc1) { // remaining pixel, only if width is odd + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + } + } else { + c0 = 2 - c0; + int d = c0 + 3 - (c0 == 0 ? 0 : 1); + int cc; + + for (cc = 0; cc < cc1 - 1; cc += 2) { + rix[c0][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + } + + if (cc < cc1) { // remaining pixel, only if width is odd + rix[c0][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + } + } + } + } + + if (plistener) { + plistener->setProgress (0.8); + } + + if (applyGamma) { + gamtab = &(Color::igammatab_24_17); + } else { + gamtab->makeIdentity(); + } + + array2D* rgb[3]; + rgb[0] = &red; + rgb[1] = &green; + rgb[2] = &blue; + + // copy result back to image matrix +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int row = 0; row < height; row++) { + for (int col = 0, rr = row + ba; col < width; col++) { + int cc = col + ba; + int c = FC(row, col); + + for (int ii = 0; ii < 3; ii++) + if (ii != c) { + float *rix = qix[ii] + rr * cc1 + cc; + (*(rgb[ii]))[row][col] = (*gamtab)[65535.f * rix[0]]; + } else { + (*(rgb[ii]))[row][col] = CLIP(rawData[row][col]); + } + } + } + + if (plistener) { + plistener->setProgress (1.0); + } + + if (buffer) { + free(buffer); + } else + for (int i = 0; i < 5; i++) { + free(qix[i]); + } + + if (!applyGamma) { + delete gamtab; + } + + if (iterations > 4) { + refinement(passref); + } + +} + +#ifdef __SSE2__ +#define CLIPV(a) vclampf(a,ZEROV,c65535v) +#endif +void RawImageSource::refinement(int PassCount) +{ + int width = W; + int height = H; + int w1 = width; + int w2 = 2 * w1; + + if (plistener) { + plistener->setProgressStr(M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); + } + + array2D *rgb[3]; + rgb[0] = &red; + rgb[1] = &green; + rgb[2] = &blue; + + for (int b = 0; b < PassCount; b++) { + if (plistener) { + plistener->setProgress((float)b / PassCount); + } + + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + float *pix[3]; + + /* Reinforce interpolated green pixels on RED/BLUE pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 2) & 1); + int c = FC(row, col); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[c] = (float*)(*rgb[c]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + dLv = onev / (onev + vabsf(LC2VFU(pix[c][ -2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[c][ 2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[c][-w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[c][ w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + v0v = CLIPV(LC2VFU(pix[c][0]) + zd5v + ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[1][0], v0v); + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[c] = (float*)(*rgb[c]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + float dL = 1.f / (1.f + fabsf(pix[c][ -2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dR = 1.f / (1.f + fabsf(pix[c][ 2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dU = 1.f / (1.f + fabsf(pix[c][-w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float dD = 1.f / (1.f + fabsf(pix[c][ w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float v0 = (pix[c][0] + 0.5f + ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[1][0] = CLIP(v0); + } + } + + /* Reinforce interpolated red/blue pixels on GREEN pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 3) & 1); + int c = FC(row, col + 1); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[1] = (float*)(*rgb[1]) + indx; + + for (int i = 0; i < 2; c = 2 - c, i++) { + pix[c] = (float*)(*rgb[c]) + indx; + dLv = onev / (onev + vabsf(LC2VFU(pix[1][ -2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[1][ 2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[1][-w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[1][ w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); + v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[c][0], v0v); + } + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[1] = (float*)(*rgb[1]) + indx; + + for (int i = 0; i < 2; c = 2 - c, i++) { + pix[c] = (float*)(*rgb[c]) + indx; + float dL = 1.f / (1.f + fabsf(pix[1][ -2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); + float dR = 1.f / (1.f + fabsf(pix[1][ 2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); + float dU = 1.f / (1.f + fabsf(pix[1][-w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); + float dD = 1.f / (1.f + fabsf(pix[1][ w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); + float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[c][0] = CLIP(v0); + } + } + } + + /* Reinforce integrated red/blue pixels on BLUE/RED pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 2) & 1); + int c = 2 - FC(row, col); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[0] = (float*)(*rgb[0]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + pix[2] = (float*)(*rgb[2]) + indx; + int d = 2 - c; + dLv = onev / (onev + vabsf(LC2VFU(pix[d][ -2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[d][ 2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[d][-w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[d][ w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[c][0], v0v); + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[0] = (float*)(*rgb[0]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + pix[2] = (float*)(*rgb[2]) + indx; + int d = 2 - c; + float dL = 1.f / (1.f + fabsf(pix[d][ -2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dR = 1.f / (1.f + fabsf(pix[d][ 2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dU = 1.f / (1.f + fabsf(pix[d][-w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float dD = 1.f / (1.f + fabsf(pix[d][ w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[c][0] = CLIP(v0); + } + } + } // end parallel + } +} +#ifdef __SSE2__ +#undef CLIPV +#endif + +} /* namespace */ diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index f7d905357..28cf30010 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -129,7 +129,6 @@ public: void flushRawData () override; void flushRGB () override; void HLRecovery_Global (const procparams::ToneCurveParams &hrp) override; - void refinement_lassus (int PassCount); void refinement(int PassCount); void setBorder(unsigned int rawBorder) override {border = rawBorder;} bool isRGBSourceModified() const override @@ -267,7 +266,7 @@ protected: void hphd_demosaic(); void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); void igv_interpolate(int winw, int winh); - void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); + void lmmse_interpolate_omp(int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); void amaze_demosaic_RT(int winx, int winy, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize = 1, bool measure = false);//Emil's code for AMaZE void dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast = false); void fast_demosaic();//Emil's code for fast demosaicing From 8f82a8362afe90151b2d3d95339fdd13e2e2b122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 08:18:17 +0100 Subject: [PATCH 017/100] Finalize `const`/`bool` cleanup --- rtengine/canon_cr3_decoder.cc | 445 ++++++++++++++++++---------------- rtengine/dcraw.h | 4 +- 2 files changed, 236 insertions(+), 213 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f436c759e..3912af6b4 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -503,7 +503,7 @@ int DCraw::parseCR3( goto fin; } - if (!crxParseImageHeader(CMP1, nTrack)) { + if (crxParseImageHeader(CMP1, nTrack)) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { @@ -2302,64 +2302,63 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) } } -void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, - int plane = 0, const std::int32_t* lineData = nullptr, - int lineLength = 0) +void crxConvertPlaneLine( + CrxImage* img, + int imageRow, + int imageCol = 0, + int plane = 0, + const std::int32_t* lineData = nullptr, + int lineLength = 0 +) { if (lineData) { std::uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; if (img->encType == 1) { - std::int32_t maxVal = 1 << (img->nBits - 1); - std::int32_t minVal = -maxVal; - --maxVal; + const std::int32_t maxVal = 1 << (img->nBits - 1); + const std::int32_t minVal = -maxVal; for (int i = 0; i < lineLength; ++i) { - img->outBufs[plane][rawOffset + 2 * i] = - rtengine::LIM(lineData[i], minVal, maxVal); + img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal - 1); } } else if (img->encType == 3) { // copy to intermediate planeBuf - rawOffset = plane * img->planeWidth * img->planeHeight + - img->planeWidth * imageRow + imageCol; + rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { - std::int32_t median = 1 << (img->nBits - 1); - std::int32_t maxVal = (1 << img->nBits) - 1; + const std::int32_t median = 1 << (img->nBits - 1); + const std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; ++i) { - img->outBufs[plane][rawOffset + 2 * i] = - rtengine::LIM(median + lineData[i], 0, maxVal); + img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { - std::int32_t maxVal = (1 << img->nBits) - 1; - std::int32_t median = 1 << (img->nBits - 1); + const std::int32_t maxVal = (1 << img->nBits) - 1; + const std::int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { - img->outBufs[0][rawOffset + i] = - rtengine::LIM(median + lineData[i], 0, maxVal); + img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } } else if (img->encType == 3 && img->planeBuf) { - std::int32_t planeSize = img->planeWidth * img->planeHeight; - std::int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; - std::int16_t* plane1 = plane0 + planeSize; - std::int16_t* plane2 = plane1 + planeSize; - std::int16_t* plane3 = plane2 + planeSize; + const std::int32_t planeSize = img->planeWidth * img->planeHeight; + const std::int16_t* const plane0 = img->planeBuf + imageRow * img->planeWidth; + const std::int16_t* const plane1 = plane0 + planeSize; + const std::int16_t* const plane2 = plane1 + planeSize; + const std::int16_t* const plane3 = plane2 + planeSize; - std::int32_t median = 1 << (img->nBits - 1) << 10; - std::int32_t maxVal = (1 << img->nBits) - 1; - std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + const std::int32_t median = 1 << (img->nBits - 1) << 10; + const std::int32_t maxVal = (1 << img->nBits) - 1; + const std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored for (int i = 0; i < img->planeWidth; ++i) { - std::int32_t gr = - median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - std::int32_t val = 0; + std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; if (gr < 0) { gr = -(((std::abs(gr) + 512) >> 9) & ~1); @@ -2368,7 +2367,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } // Essentially R = round(median + P0 + 1.474*P3) - val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + std::int32_t val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; img->outBufs[0][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) val = (plane2[i] + gr + 1) >> 1; @@ -2383,18 +2382,27 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } -int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, - std::uint64_t subbandDataSize, std::uint32_t subbandWidth, - std::uint32_t subbandHeight, std::int32_t supportsPartial, - std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) +bool crxParamInit( + CrxBandParam** param, + std::uint64_t subbandMdatOffset, + std::uint64_t subbandDataSize, + std::uint32_t subbandWidth, + std::uint32_t subbandHeight, + std::int32_t supportsPartial, + std::uint32_t roundedBitsMask, + LibRaw_abstract_datastream* input +) { - std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; - std::int32_t paramLength = 2 * subbandWidth + 4; - std::uint8_t* paramBuf = static_cast(calloc( - 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); + const std::int32_t progrDataSize = + supportsPartial + ? 0 + : sizeof(std::int32_t) * subbandWidth; + const std::int32_t paramLength = 2 * subbandWidth + 4; + + std::uint8_t* paramBuf = static_cast(calloc(1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); if (!paramBuf) { - return -1; + return false; } *param = reinterpret_cast(paramBuf); @@ -2403,7 +2411,9 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, (*param)->paramData = reinterpret_cast(paramBuf); (*param)->nonProgrData = - progrDataSize ? (*param)->paramData + paramLength : nullptr; + progrDataSize + ? (*param)->paramData + paramLength + : nullptr; (*param)->subbandWidth = subbandWidth; (*param)->subbandHeight = subbandHeight; (*param)->roundedBits = 0; @@ -2420,39 +2430,42 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, crxFillBuffer(&(*param)->bitStream); - return 0; + return true; } -int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, - const CrxTile* tile, std::uint32_t mdatOffset) +bool crxSetupSubbandData( + CrxImage* img, + CrxPlaneComp* planeComp, + const CrxTile* tile, + std::uint32_t mdatOffset +) { long compDataSize = 0; long waveletDataOffset = 0; long compCoeffDataOffset = 0; - std::int32_t toSubbands = 3 * img->levels + 1; - std::int32_t transformWidth = 0; + const std::int32_t toSubbands = 3 * img->levels + 1; - CrxSubband* subbands = planeComp->subBands; + CrxSubband* const subbands = planeComp->subBands; // calculate sizes for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { - subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes + subbands[subbandNum].bandSize = subbands[subbandNum].width * sizeof(std::int32_t); // 4 bytes compDataSize += subbands[subbandNum].bandSize; } if (img->levels) { - std::int32_t encLevels = img->levels ? img->levels : 1; + const std::int32_t encLevels = + img->levels + ? img->levels + : 1; waveletDataOffset = (compDataSize + 7) & ~7; - compDataSize = - (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compDataSize = (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; compCoeffDataOffset = compDataSize; // calc wavelet line buffer sizes (always at one level up from current) for (int level = 0; level < img->levels; ++level) { if (level < img->levels - 1) { - compDataSize += 8 * sizeof(std::int32_t) * - planeComp->subBands[3 * (level + 1) + 2].width; + compDataSize += 8 * sizeof(std::int32_t) * planeComp->subBands[3 * (level + 1) + 2].width; } else { compDataSize += 8 * sizeof(std::int32_t) * tile->width; } @@ -2463,31 +2476,31 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, planeComp->compBuf = static_cast(malloc(compDataSize)); if (!planeComp->compBuf) { - return -1; + return false; } // subbands buffer and sizes initialisation - std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + const std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; std::uint8_t* subbandBuf = planeComp->compBuf; for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; - subbands[subbandNum].mdatOffset = - subbandMdatOffset + subbands[subbandNum].dataOffset; + subbands[subbandNum].mdatOffset = subbandMdatOffset + subbands[subbandNum].dataOffset; } // wavelet data initialisation if (img->levels) { - CrxWaveletTransform* waveletTransforms = - reinterpret_cast(planeComp->compBuf + waveletDataOffset); + CrxWaveletTransform* const waveletTransforms = reinterpret_cast(planeComp->compBuf + waveletDataOffset); std::int32_t* paramData = reinterpret_cast(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; waveletTransforms[0].subband0Buf = reinterpret_cast(subbands->bandBuf); for (int level = 0; level < img->levels; ++level) { - std::int32_t band = 3 * level + 1; + const std::int32_t band = 3 * level + 1; + + std::int32_t transformWidth = 0; if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; @@ -2499,28 +2512,19 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].width = transformWidth; waveletTransforms[level].lineBuf[0] = paramData; - waveletTransforms[level].lineBuf[1] = - waveletTransforms[level].lineBuf[0] + transformWidth; - waveletTransforms[level].lineBuf[2] = - waveletTransforms[level].lineBuf[1] + transformWidth; - waveletTransforms[level].lineBuf[3] = - waveletTransforms[level].lineBuf[2] + transformWidth; - waveletTransforms[level].lineBuf[4] = - waveletTransforms[level].lineBuf[3] + transformWidth; - waveletTransforms[level].lineBuf[5] = - waveletTransforms[level].lineBuf[4] + transformWidth; - waveletTransforms[level].lineBuf[6] = - waveletTransforms[level].lineBuf[5] + transformWidth; - waveletTransforms[level].lineBuf[7] = - waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].lineBuf[1] = waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = waveletTransforms[level].lineBuf[6] + transformWidth; waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; waveletTransforms[level].subband1Buf = reinterpret_cast(subbands[band].bandBuf); - waveletTransforms[level].subband2Buf = - reinterpret_cast(subbands[band + 1].bandBuf); - waveletTransforms[level].subband3Buf = - reinterpret_cast(subbands[band + 2].bandBuf); + waveletTransforms[level].subband2Buf = reinterpret_cast(subbands[band + 1].bandBuf); + waveletTransforms[level].subband3Buf = reinterpret_cast(subbands[band + 2].bandBuf); paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } @@ -2537,71 +2541,73 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, supportsPartial = 1; } - if (crxParamInit(&subbands[subbandNum].bandParam, - subbands[subbandNum].mdatOffset, - subbands[subbandNum].dataSize, - subbands[subbandNum].width, subbands[subbandNum].height, - supportsPartial, roundedBitsMask, img->input)) { - return -1; + if ( + !crxParamInit( + &subbands[subbandNum].bandParam, + subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, + subbands[subbandNum].width, + subbands[subbandNum].height, + supportsPartial, + roundedBitsMask, + img->input + ) + ) { + return false; } } } - return 0; + return true; } -} // namespace -int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) +} // namespace + +bool DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { - CrxImage* img = static_cast(p); + CrxImage* const img = static_cast(p); int imageRow = 0; for (int tRow = 0; tRow < img->tileRows; ++tRow) { int imageCol = 0; for (int tCol = 0; tCol < img->tileCols; ++tCol) { - CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; - CrxPlaneComp* planeComp = tile->comps + planeNumber; - std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + const CrxTile* const tile = img->tiles + tRow * img->tileRows + tCol; + CrxPlaneComp* const planeComp = tile->comps + planeNumber; + const std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; // decode single tile - if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { - return -1; + if (!crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { + return false; } if (img->levels) { if (!crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { - return -1; + return false; } for (int i = 0; i < tile->height; ++i) { - if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || - !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { - return -1; + if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + return false; } - std::int32_t* lineData = - crxIdwt53FilterGetLine(planeComp, img->levels - 1); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); + const std::int32_t* const lineData = crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } } else { // we have the only subband in this case if (!planeComp->subBands->dataSize) { - memset(planeComp->subBands->bandBuf, 0, - planeComp->subBands->bandSize); - return 0; + memset(planeComp->subBands->bandBuf, 0, planeComp->subBands->bandSize); + return true; } for (int i = 0; i < tile->height; ++i) { - if (!crxDecodeLine(planeComp->subBands->bandParam, - planeComp->subBands->bandBuf)) { - return -1; + if (!crxDecodeLine(planeComp->subBands->bandParam, planeComp->subBands->bandBuf)) { + return false; } - std::int32_t* lineData = reinterpret_cast(planeComp->subBands->bandBuf); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); + const std::int32_t* const lineData = reinterpret_cast(planeComp->subBands->bandBuf); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } } @@ -2611,7 +2617,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) imageRow += img->tiles[tRow * img->tileRows].height; } - return 0; + return true; } namespace @@ -2619,9 +2625,13 @@ namespace using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; -int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, - CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, - std::uint32_t* mdatSize) +bool crxReadSubbandHeaders( + CrxImage* img, + CrxTile* tile, + CrxPlaneComp* comp, + std::uint8_t** subbandMdatPtr, + std::uint32_t* mdatSize +) { CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band std::uint32_t bandHeight = tile->height; @@ -2635,14 +2645,12 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - const std::int32_t* rowExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - const std::int32_t* colExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + const std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); + const std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { - std::int32_t widthOddPixel = bandWidth & 1; - std::int32_t heightOddPixel = bandHeight & 1; + const std::int32_t widthOddPixel = bandWidth & 1; + const std::int32_t heightOddPixel = bandHeight & 1; bandWidth = (widthOddPixel + bandWidth) >> 1; bandHeight = (heightOddPixel + bandHeight) >> 1; @@ -2683,18 +2691,15 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, band -= 3; } - bandWidthExCoef = bandHeightExCoef = 0; + bandWidthExCoef = 0; + bandHeightExCoef = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - bandWidthExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + - 4 * (img->levels - 1) + 1]; + bandWidthExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + 4 * (img->levels - 1) + 1]; } if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { - bandHeightExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + - 4 * (img->levels - 1) + 1]; + bandHeightExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + 4 * (img->levels - 1) + 1]; } } @@ -2702,7 +2707,7 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, band->height = bandHeightExCoef + bandHeight; if (!img->subbandCount) { - return 0; + return true; } std::int32_t subbandOffset = 0; @@ -2710,19 +2715,19 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { if (*mdatSize < 0xC) { - return -1; + return false; } if (sgetn(2, *subbandMdatPtr) != 0xFF03) { - return -1; + return false; } - std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + const std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + const std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); if (curSubband != bitData >> 28) { band->dataSize = subbandSize; - return -1; + return false; } band->dataSize = subbandSize - (bitData & 0x7FF); @@ -2740,32 +2745,39 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, *mdatSize -= 0xC; } - return 0; + return true; } -int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mdatPtr, - std::uint32_t mdatSize) +bool crxReadImageHeaders( + crx_data_header_t* hdr, + CrxImage* img, + std::uint8_t* mdatPtr, + std::uint32_t mdatSize +) { - unsigned int nTiles = img->tileRows * img->tileCols; + const unsigned int nTiles = img->tileRows * img->tileCols; if (!nTiles) { - return -1; + return false; } if (!img->tiles) { - img->tiles = static_cast(malloc( - sizeof(CrxTile) * nTiles + - sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount)); + img->tiles = static_cast( + malloc( + sizeof(CrxTile) * nTiles + + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount + ) + ); if (!img->tiles) { - return -1; + return false; } // memory areas in allocated chunk CrxTile* tile = img->tiles; - CrxPlaneComp* comps = reinterpret_cast(tile + nTiles); - CrxSubband* bands = reinterpret_cast(comps + img->nPlanes * nTiles); + CrxPlaneComp* const comps = reinterpret_cast(tile + nTiles); + CrxSubband* const bands = reinterpret_cast(comps + img->nPlanes * nTiles); for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags @@ -2827,8 +2839,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda comp->waveletTransform = nullptr; if (img->subbandCount) { - for (int curBand = 0; curBand < img->subbandCount; - curBand++, band++) { + for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) { band->supportsPartial = 0; band->quantValue = 4; band->bandParam = nullptr; @@ -2847,15 +2858,15 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { if (dataSize < 0xC) { - return -1; + return false; } if (sgetn(2, dataPtr) != 0xFF01) { - return -1; + return false; } if (sgetn(2, dataPtr + 8) != curTile) { - return -1; + return false; } dataSize -= 0xC; @@ -2863,7 +2874,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileSize = sgetn(4, dataPtr + 4); tile->dataOffset = tileOffset; - std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + const std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; tileOffset += tile->tileSize; dataPtr += hdrExtraBytes + 0xC; dataSize -= hdrExtraBytes; @@ -2873,15 +2884,15 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { if (dataSize < 0xC) { - return -1; + return false; } if (sgetn(2, dataPtr) != 0xFF02) { - return -1; + return false; } if (compNum != dataPtr[8] >> 4) { - return -1; + return false; } comp->compSize = sgetn(4, dataPtr + 4); @@ -2900,42 +2911,52 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda if (compHdrRoundedBits) { if (img->levels || !comp->supportsPartial) { - return -1; + return false; } comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); } - if (crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { - return -1; + if (!crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { + return false; } } } - return 0; + return true; } -int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBuf, - std::uint64_t mdatOffset, std::uint32_t mdatSize, - std::uint8_t* mdatHdrPtr) +bool crxSetupImageData( + crx_data_header_t* hdr, + CrxImage* img, + std::int16_t* outBuf, + std::uint64_t mdatOffset, + std::uint32_t mdatSize, + std::uint8_t* mdatHdrPtr +) { - int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 - }; + constexpr bool IncrBitTable[32] = { + false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, + false, false, true, false, false, true, true, true, false, true, true, true, false, false, false, false + }; img->planeWidth = hdr->f_width; img->planeHeight = hdr->f_height; - if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || - img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) { - return -1; + if ( + hdr->tileWidth < 0x16 + || hdr->tileHeight < 0x16 + || img->planeWidth > 0x7FFF + || img->planeHeight > 0x7FFF + ) { + return false; } img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; if (img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { - return -1; + return false; } img->tiles = nullptr; @@ -2957,16 +2978,16 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu // intermediate plane buffer. At the moment though it's too many changes so // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { - img->planeBuf = - static_cast(malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3))); + img->planeBuf = static_cast( + malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)) + ); if (!img->planeBuf) { - return -1; + return false; } } - std::int32_t rowSize = 2 * img->planeWidth; + const std::int32_t rowSize = 2 * img->planeWidth; if (img->nPlanes == 1) { img->outBufs[0] = outBuf; @@ -3018,10 +3039,10 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); } -int crxFreeImageData(CrxImage* img) +void crxFreeImageData(CrxImage* img) { CrxTile* tile = img->tiles; - int nTiles = img->tileRows * img->tileCols; + const int nTiles = img->tileRows * img->tileCols; if (img->tiles) { for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { @@ -3040,15 +3061,14 @@ int crxFreeImageData(CrxImage* img) free(img->planeBuf); img->planeBuf = nullptr; } - - return 0; } + } // namespace void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) { #ifdef _OPENMP - int results[4]; // nPlanes is always <= 4 + bool results[4]; // nPlanes is always <= 4 #pragma omp parallel for for (std::int32_t plane = 0; plane < nPlanes; ++plane) { @@ -3056,7 +3076,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) } for (std::int32_t plane = 0; plane < nPlanes; ++plane) { - if (results[plane]) { + if (!results[plane]) { derror(); } } @@ -3064,7 +3084,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) #else for (std::int32_t plane = 0; plane < nPlanes; ++plane) { - if (crxDecodePlane(img, plane)) { + if (!crxDecodePlane(img, plane)) { derror(); } } @@ -3092,14 +3112,11 @@ void DCraw::crxLoadRaw() { CrxImage img; - if (RT_canon_CR3_data.crx_track_selected >= - RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { + if (RT_canon_CR3_data.crx_track_selected >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { derror(); } - crx_data_header_t hdr = - RT_canon_CR3_data - .crx_header[RT_canon_CR3_data.crx_track_selected]; + crx_data_header_t hdr = RT_canon_CR3_data.crx_header[RT_canon_CR3_data.crx_track_selected]; LibRaw_abstract_datastream input = {ifp}; img.input = &input; // libraw_internal_data.internal_data.input; @@ -3114,7 +3131,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - std::uint8_t* hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); + std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); // read image header #ifdef _OPENMP @@ -3124,8 +3141,7 @@ void DCraw::crxLoadRaw() #ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/ input.lock(); #endif - /*libraw_internal_data.internal_data.input->*/ input.seek( - data_offset, SEEK_SET); + /*libraw_internal_data.internal_data.input->*/ input.seek(data_offset, SEEK_SET); /*libraw_internal_data.internal_data.input->*/ input.read(hdrBuf, 1, hdr.mdatHdrSize); #ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/ input.unlock(); @@ -3133,9 +3149,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), - hdr.MediaOffset /*data_offset*/, - hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { + if (!crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); } @@ -3150,18 +3164,17 @@ void DCraw::crxLoadRaw() crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) +bool DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { - return -1; + return false; } if (!cmp1TagData) { - return -1; + return false; } - crx_data_header_t* hdr = - &RT_canon_CR3_data.crx_header[nTrack]; + crx_data_header_t* const hdr = &RT_canon_CR3_data.crx_header[nTrack]; hdr->version = sgetn(2, cmp1TagData + 4); hdr->f_width = sgetn(4, cmp1TagData + 8); @@ -3179,45 +3192,55 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) // validation if (hdr->version != 0x100 || !hdr->mdatHdrSize) { - return -1; + return false; } if (hdr->encType == 1) { if (hdr->nBits > 15) { - return -1; + return false; } } else { if (hdr->encType && hdr->encType != 3) { - return -1; + return false; } if (hdr->nBits > 14) { - return -1; + return false; } } if (hdr->nPlanes == 1) { if (hdr->cfaLayout || hdr->encType) { - return -1; + return false; } if (hdr->nBits != 8) { - return -1; + return false; } - } else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || - (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || - (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || - hdr->nBits == 8) { - return -1; + } else if ( + hdr->nPlanes != 4 + || (hdr->f_width & 1) + || (hdr->f_height & 1) + || (hdr->tileWidth & 1) + || (hdr->tileHeight & 1) + || hdr->cfaLayout > 3 + || ( + hdr->encType + && hdr->encType != 1 + && hdr->encType != 3 + ) + || hdr->nBits == 8 + ) { + return false; } if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) { - return -1; + return false; } if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) { - return -1; + return false; } - return 0; + return true; } diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index c18e6c2ff..a47d1c88a 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -567,12 +567,12 @@ void selectCRXTrack(unsigned short maxTrack); int parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, char *AtomNameStack, unsigned short &nTrack, short &TrackType); -int crxDecodePlane(void *p, uint32_t planeNumber); +bool crxDecodePlane(void *p, uint32_t planeNumber); void crxLoadDecodeLoop(void *img, int nPlanes); void crxConvertPlaneLineDf(void *p, int imageRow); void crxLoadFinalizeLoopE3(void *p, int planeHeight); void crxLoadRaw(); -int crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); +bool crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); //----------------------------------------------------------------------------- }; From 03c094a42bcf9d6d7a0198eadc758b9fc32e38fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 09:18:16 +0100 Subject: [PATCH 018/100] Fix `fseek()`/`ftell()` issue --- rtengine/canon_cr3_decoder.cc | 8 ++++---- rtengine/dcraw.h | 2 +- rtengine/myfile.h | 10 ++++------ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 3912af6b4..14a7f0e14 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -449,9 +449,9 @@ int DCraw::parseCR3( goto fin; } - const std::int64_t off = ftell(ifp); // FIXME: ftell() returns int + const long off = ftell(ifp); parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); // FIXME: fseek() takes int offset + fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { @@ -468,7 +468,7 @@ int DCraw::parseCR3( } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { if (szAtomContent >= 16) { - fseek(ifp, 12L, SEEK_CUR); + fseek(ifp, 12, SEEK_CUR); lHdr = 8; } else { err = -7; @@ -670,7 +670,7 @@ struct LibRaw_abstract_datastream { void unlock() { } - void seek(int p, int how) + void seek(long p, int how) { fseek(ifp, p, how); } diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index a47d1c88a..89c1fcaff 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -184,7 +184,7 @@ public: int32_t mdatHdrSize; // Not from header, but from datastream uint32_t MediaSize; - INT64 MediaOffset; + int64_t MediaOffset; uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG */ }; static constexpr size_t CRXTRACKS_MAXCOUNT = 16; diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 7c498e556..423edea9a 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -56,28 +56,26 @@ IMFILE* fopen (const char* fname); IMFILE* gfopen (const char* fname); IMFILE* fopen (unsigned* buf, int size); void fclose (IMFILE* f); -inline int ftell (IMFILE* f) +inline long ftell (IMFILE* f) { - return f->pos; } inline int feof (IMFILE* f) { - return f->eof; } -inline void fseek (IMFILE* f, int p, int how) +inline void fseek (IMFILE* f, long p, int how) { - int fpos = f->pos; + ssize_t fpos = f->pos; if (how == SEEK_SET) { f->pos = p; } else if (how == SEEK_CUR) { f->pos += p; } else if (how == SEEK_END) { - if(p <= 0 && -p <= f->size) { + if (p <= 0 && -p <= f->size) { f->pos = f->size + p; } return; From b0e52b32023524e2be22ebb03fd465af0f9e05d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 09:28:34 +0100 Subject: [PATCH 019/100] Whitespace corrections --- rtengine/canon_cr3_decoder.cc | 68 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 14a7f0e14..ba92bf04a 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -87,13 +87,13 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[i]; - if (d->MediaType == 1) {// RAW + if (d->MediaType == 1) { // RAW bitcounts[i] = std::int64_t(d->nBits) * std::int64_t(d->f_width) * std::int64_t(d->f_height); if (bitcounts[i] > maxbitcount) { maxbitcount = bitcounts[i]; } - } else if (d->MediaType == 2) {// JPEG + } else if (d->MediaType == 2) { // JPEG if (d->MediaSize > maxjpegbytes) { maxjpegbytes = d->MediaSize; thumb_offset = d->MediaOffset; @@ -371,7 +371,7 @@ int DCraw::parseCR3( szAtom = szAtomList - oAtom; oAtomContent = oAtom + 8; szAtomContent = szAtom - 8; - } else if (szAtom == 1) { + } else if (szAtom == 1) { if ((oAtom + 16) > (oAtomList + szAtomList)) { err = -3; goto fin; @@ -404,9 +404,9 @@ int DCraw::parseCR3( } else { fseek(ifp, -lHdr, SEEK_CUR); } - } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { + } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { lHdr = 12; - } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { const short q_order = order; order = get2(); @@ -417,7 +417,7 @@ int DCraw::parseCR3( parse_tiff_ifd(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { const short q_order = order; order = get2(); @@ -428,7 +428,7 @@ int DCraw::parseCR3( parse_exif(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { const short q_order = order; order = get2(); @@ -440,7 +440,7 @@ int DCraw::parseCR3( fseek(ifp, -12L, SEEK_CUR); parse_makernote(oAtomContent, 0); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { const short q_order = order; order = get2(); @@ -454,7 +454,7 @@ int DCraw::parseCR3( fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { fseek(ifp, 8, SEEK_CUR); for (unsigned int c = 0; c < 4; ++c) { HandlerType[c] = fgetc(ifp); @@ -466,7 +466,7 @@ int DCraw::parseCR3( break; } } - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { if (szAtomContent >= 16) { fseek(ifp, 12, SEEK_CUR); lHdr = 8; @@ -493,9 +493,9 @@ int DCraw::parseCR3( /*ImageWidth = */ get2(); /*ImageHeight = */ get2(); - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { lHdr = 82; - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { if (szAtomContent >= 40) { fread(CMP1, 1, 36, ifp); } else { @@ -506,9 +506,9 @@ int DCraw::parseCR3( if (crxParseImageHeader(CMP1, nTrack)) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 2; - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { if (szAtomContent == 12) { fseek(ifp, 4, SEEK_CUR); } else if (szAtomContent == 16) { @@ -519,7 +519,7 @@ int DCraw::parseCR3( } RT_canon_CR3_data.crx_header[nTrack].MediaSize = get4(); - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { if (szAtomContent == 16) { fseek(ifp, 8, SEEK_CUR); } else { @@ -771,7 +771,7 @@ struct CrxImage { CrxTile* tiles; std::uint64_t mdatOffset; std::uint64_t mdatSize; - std::int16_t* outBufs[4];// one per plane + std::int16_t* outBufs[4]; // one per plane std::int16_t* planeBuf; LibRaw_abstract_datastream* input; }; @@ -931,7 +931,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) } while (bitsLeft < bits); } - result = bitData >> (32 - bits);// 32-bits + result = bitData >> (32 - bits); // 32-bits bitStrm->bitData = bitData << bits; bitStrm->bitsLeft = bitsLeft - bits; return result; @@ -1182,7 +1182,7 @@ bool crxDecodeLineRounded(CrxBandParam* param) crxDecodeSymbolL1Rounded(param, false); ++param->lineBuf0; valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; - } else if (length == 1) { + } else if (length == 1) { crxDecodeSymbolL1Rounded(param, false, false); } } @@ -1259,7 +1259,7 @@ bool crxDecodeLineNoRefPrevLine(CrxBandParam* param) return false; } } - } else if (i > param->subbandWidth) { + } else if (i > param->subbandWidth) { return false; } @@ -1688,7 +1688,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - } else if (!param->supportsPartial) { + } else if (!param->supportsPartial) { const std::int32_t lineLength = param->subbandWidth + 2; param->lineBuf2 = param->nonProgrData; @@ -1708,7 +1708,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else if (param->roundedBitsMask <= 0) { + } else if (param->roundedBitsMask <= 0) { const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { @@ -1769,7 +1769,7 @@ bool crxDecodeLineWithIQuantization(CrxSubband* subband) bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | (bitCode << subband->paramK); } - subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer subband->paramK = crxPredictKParameter(subband->paramK, bitCode); if (subband->paramK > 7) { @@ -1859,7 +1859,7 @@ void crxHorizontal53( lineBufLA[2] = deltaA; lineBufLB[2] = deltaB; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { lineBufLA[1] = band1Buf[0] + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); @@ -1895,7 +1895,7 @@ bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) if (!crxIdwt53FilterDecode(comp, level - 1)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { + } else if (!crxDecodeLineWithIQuantization(sband)) { return false; } @@ -1908,7 +1908,7 @@ bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) if (!crxIdwt53FilterDecode(comp, level - 1)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band + } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band return false; } @@ -1985,7 +1985,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->width & 1) { lineBufL0[2] = delta; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; @@ -2093,7 +2093,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL0[2] = deltaA; lineBufL1[2] = deltaB; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2202,7 +2202,7 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (wavelet->width & 1) { lineBufL2[2] = delta; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); @@ -2262,7 +2262,7 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; @@ -2321,21 +2321,21 @@ void crxConvertPlaneLine( for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal - 1); } - } else if (img->encType == 3) { + } else if (img->encType == 3) { // copy to intermediate planeBuf rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } - } else if (img->nPlanes == 4) { + } else if (img->nPlanes == 4) { const std::int32_t median = 1 << (img->nBits - 1); const std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } - } else if (img->nPlanes == 1) { + } else if (img->nPlanes == 1) { const std::int32_t maxVal = (1 << img->nBits) - 1; const std::int32_t median = 1 << (img->nBits - 1); @@ -2345,7 +2345,7 @@ void crxConvertPlaneLine( img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } - } else if (img->encType == 3 && img->planeBuf) { + } else if (img->encType == 3 && img->planeBuf) { const std::int32_t planeSize = img->planeWidth * img->planeHeight; const std::int16_t* const plane0 = img->planeBuf + imageRow * img->planeWidth; const std::int16_t* const plane1 = plane0 + planeSize; @@ -2961,7 +2961,7 @@ bool crxSetupImageData( img->tiles = nullptr; img->levels = hdr->imageLevels; - img->subbandCount = 3 * img->levels + 1;// 3 bands per level + one last LL + img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL img->nPlanes = hdr->nPlanes; img->nBits = hdr->nBits; img->encType = hdr->encType; From 743827c7c86f8de14b50ca76b05530e3ea30259f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 6 Dec 2019 12:21:19 +0100 Subject: [PATCH 020/100] Fix cppcheck warnings --- rtengine/canon_cr3_decoder.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index ba92bf04a..9e3b3ef4b 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -1004,10 +1004,8 @@ bool crxDecodeLine(CrxBandParam* param) if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { crxDecodeSymbolL1(param, true, true); } else { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) { - nSyms = 1; + int nSyms = 1; while (crxBitstreamGetBits(¶m->bitStream, 1)) { nSyms += JS[param->sParam]; @@ -1338,10 +1336,8 @@ bool crxDecodeTopLine(CrxBandParam* param) if (param->lineBuf1[0]) { param->lineBuf1[1] = param->lineBuf1[0]; } else { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) { - nSyms = 1; + int nSyms = 1; while (crxBitstreamGetBits(¶m->bitStream, 1)) { nSyms += JS[param->sParam]; @@ -1781,7 +1777,7 @@ bool crxDecodeLineWithIQuantization(CrxSubband* subband) return false; } - if (subband->width <= 0) { + if (subband->width == 0) { return true; } @@ -2039,7 +2035,6 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; - const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; @@ -2110,7 +2105,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) // process H bands lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; for (std::int32_t i = 0; i < wavelet->width; ++i) { const std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); @@ -2731,7 +2726,7 @@ bool crxReadSubbandHeaders( } band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = bitData & 0x8000 ? 1 : 0; + band->supportsPartial = (bitData & 0x8000) ? 1 : 0; band->dataOffset = subbandOffset; band->quantValue = (bitData >> 19) & 0xFF; band->paramK = 0; From b1bce98c069959564382a9882c89d32176ccfdd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 7 Dec 2019 09:38:18 +0100 Subject: [PATCH 021/100] `supportsPartial` is `bool` --- rtengine/canon_cr3_decoder.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 9e3b3ef4b..6274154cb 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -705,7 +705,7 @@ struct CrxBandParam { std::int32_t kParam; std::int32_t* paramData; std::int32_t* nonProgrData; - std::int8_t supportsPartial; + bool supportsPartial; }; struct CrxWaveletTransform { @@ -727,7 +727,7 @@ struct CrxSubband { std::uint8_t* bandBuf; std::int32_t bandSize; std::uint64_t dataSize; - std::int8_t supportsPartial; + bool supportsPartial; std::int32_t quantValue; std::uint16_t width; std::uint16_t height; @@ -742,7 +742,7 @@ struct CrxPlaneComp { std::int8_t compNumber; std::int64_t dataOffset; std::int32_t compSize; - std::int8_t supportsPartial; + bool supportsPartial; std::int32_t roundedBitsMask; std::int8_t tileFlag; }; @@ -2383,7 +2383,7 @@ bool crxParamInit( std::uint64_t subbandDataSize, std::uint32_t subbandWidth, std::uint32_t subbandHeight, - std::int32_t supportsPartial, + bool supportsPartial, std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input ) @@ -2528,12 +2528,12 @@ bool crxSetupSubbandData( // decoding params and bitstream initialisation for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { if (subbands[subbandNum].dataSize) { - std::int32_t supportsPartial = 0; + bool supportsPartial = false; std::uint32_t roundedBitsMask = 0; if (planeComp->supportsPartial && subbandNum == 0) { roundedBitsMask = planeComp->roundedBitsMask; - supportsPartial = 1; + supportsPartial = true; } if ( @@ -2726,7 +2726,7 @@ bool crxReadSubbandHeaders( } band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = (bitData & 0x8000) ? 1 : 0; + band->supportsPartial = bitData & 0x8000; band->dataOffset = subbandOffset; band->quantValue = (bitData >> 19) & 0xFF; band->paramK = 0; @@ -2827,7 +2827,7 @@ bool crxReadImageHeaders( for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) { comp->compNumber = curComp; - comp->supportsPartial = 1; + comp->supportsPartial = true; comp->tileFlag = tile->tileFlag; comp->subBands = band; comp->compBuf = nullptr; @@ -2835,7 +2835,7 @@ bool crxReadImageHeaders( if (img->subbandCount) { for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) { - band->supportsPartial = 0; + band->supportsPartial = false; band->quantValue = 4; band->bandParam = nullptr; band->dataSize = 0; From 1d08c9355d91e654a5ef1723d00371b75a682979 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 9 Dec 2019 15:34:04 +0100 Subject: [PATCH 022/100] Capture sharpening: speedup processing of flat areas --- rtengine/capturesharpening.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e8770f95a..910de6fd3 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -541,6 +541,7 @@ BENCHFUN double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); + constexpr float minBlend = 0.01f; #ifdef _OPENMP #pragma omp parallel @@ -563,11 +564,17 @@ BENCHFUN if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column if (checkIterStop) { + float maxVal = 0.f; for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj] * 0.5f; + maxVal = std::max(maxVal, clipmask[ii][jj]); } } + if (maxVal < minBlend) { + // no pixel of the tile has a blend factor >= minBlend => skip the tile + continue; + } } for (int k = 0, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize; ++l, ++jj) { @@ -577,11 +584,17 @@ BENCHFUN } } else { if (checkIterStop) { + float maxVal = 0.f; for (int ii = 0; ii < tileSize; ++ii) { for (int jj = 0; jj < tileSize; ++jj) { iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj] * 0.5f; + maxVal = std::max(maxVal, clipmask[i + ii][j + jj]); } } + if (maxVal < minBlend) { + // no pixel of the tile has a blend factor >= minBlend => skip the tile + continue; + } } for (int ii = i; ii < i + fullTileSize; ++ii) { for (int jj = j; jj < j + fullTileSize; ++jj) { From a2dd9061156fd267ced0364e40e0cffa43f1e093 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 11 Dec 2019 13:00:09 +0100 Subject: [PATCH 023/100] flush denormals to zeros for mask blur, #5560 --- rtengine/rt_algo.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index b02e75461..79a7c3679 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -473,8 +473,18 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, } } +#ifdef __SSE2__ + // flush denormals to zero for gaussian blur to avoid performance penalty if there are a lot of zero values in the mask + const auto oldMode = _MM_GET_FLUSH_ZERO_MODE(); + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); +#endif + // blur blend mask to smooth transitions gaussianBlur(blend, blend, W, H, 2.0); + +#ifdef __SSE2__ + _MM_SET_FLUSH_ZERO_MODE(oldMode); +#endif } } } From 0edbdc88622e27b6aff253f8fd83dfc3cefcd2a5 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 12 Dec 2019 12:53:39 +0100 Subject: [PATCH 024/100] Added image/x-canon-cr3 mime type #5319 --- rtdata/mime-types | 1 + rtdata/rawtherapee.desktop.in | 2 +- tools/gimp-plugin/file-formats.h | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rtdata/mime-types b/rtdata/mime-types index 505b00140..bfd1ccbd9 100644 --- a/rtdata/mime-types +++ b/rtdata/mime-types @@ -6,6 +6,7 @@ image/png; image/tiff; image/x-adobe-dng; image/x-canon-cr2; +image/x-canon-cr3; image/x-canon-crf; image/x-canon-crw; image/x-fuji-raf; diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index f6bc3afeb..350afc45e 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -14,7 +14,7 @@ Icon=rawtherapee TryExec=rawtherapee Exec=rawtherapee %f Terminal=false -MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; +MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-cr3;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif;inode/directory; Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK; Keywords=raw;photo;photography;develop;pp3;graphics; StartupNotify=true diff --git a/tools/gimp-plugin/file-formats.h b/tools/gimp-plugin/file-formats.h index ac8c2fa54..1956988d8 100644 --- a/tools/gimp-plugin/file-formats.h +++ b/tools/gimp-plugin/file-formats.h @@ -39,8 +39,8 @@ static const FileFormat file_formats[] = { { N_("Raw Canon"), - "image/x-canon-cr2,image/x-canon-crw", - "cr2,crw", + "image/x-canon-cr2,image/x-canon-cr3,image/x-canon-crw", + "cr2,cr3,crw", NULL, "file-rawtherapee-canon-load", From b2218d05dd9b850f1e9c509a20009b639c8f8030 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 12 Dec 2019 18:45:18 +0100 Subject: [PATCH 025/100] clip negative output of demosaicers to zero, #5561 --- rtengine/amaze_demosaic_RT.cc | 80 +++++++++++++++++------------------ rtengine/demosaic_algos.cc | 48 ++++++++++----------- rtengine/eahd_demosaic.cc | 12 +++--- rtengine/fast_demo.cc | 18 ++++---- rtengine/hphd_demosaic_RT.cc | 6 +-- rtengine/lmmse_demosaic.cc | 22 ++++------ rtengine/rawimagesource_i.h | 12 +++--- rtengine/rcd_demosaic.cc | 6 +-- rtengine/vng4_demosaic_RT.cc | 8 ++-- rtengine/xtrans_demosaic.cc | 6 +-- 10 files changed, 105 insertions(+), 113 deletions(-) diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 24c463458..2041f3130 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -1470,48 +1470,48 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c vfloat bluev1 = greenv - (temp00v * vdup(LVFU(Dgrb[1][(indx - v1) >> 1])) + (onev - vdup(LVFU(hvwt[(indx + 1 + offset) >> 1]))) * vdup(LVFU(Dgrb[1][(indx + 1 + offset) >> 1])) + (onev - vdup(LVFU(hvwt[(indx - 1 + offset) >> 1]))) * vdup(LVFU(Dgrb[1][(indx - 1 + offset) >> 1])) + temp01v * vdup(LVFU(Dgrb[1][(indx + v1) >> 1]))) * tempv; vfloat redv2 = greenv - vdup(LVFU(Dgrb[0][indx >> 1])); vfloat bluev2 = greenv - vdup(LVFU(Dgrb[1][indx >> 1])); - STVFU(red[row][col], c65535v * vself(selmask, redv1, redv2)); - STVFU(blue[row][col], c65535v * vself(selmask, bluev1, bluev2)); + STVFU(red[row][col], vmaxf(c65535v * vself(selmask, redv1, redv2), ZEROV)); + STVFU(blue[row][col], vmaxf(c65535v * vself(selmask, bluev1, bluev2), ZEROV)); } if(offset == 0) { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); indx++; col++; - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); } if(cc1 & 1) { // width of tile is odd float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); } } else { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); indx++; col++; float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); } if(cc1 & 1) { // width of tile is odd - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); } } @@ -1520,41 +1520,41 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c if((fc(cfarray, rr, 2) & 1) == 1) { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); indx++; col++; - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); } if(cc1 & 1) { // width of tile is odd float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); } } else { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); indx++; col++; float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); - red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * - temp); - blue[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * - temp); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * + temp)); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1]) * + temp)); } if(cc1 & 1) { // width of tile is odd - red[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1]); - blue[row][col] = 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1]); + red[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[0][indx >> 1])); + blue[row][col] = std::max(0.f, 65535.f * (rgbgreen[indx] - Dgrb[1][indx >> 1])); } } @@ -1568,13 +1568,13 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #ifdef __SSE2__ for (; cc < cc1 - 19; cc += 4) { - STVFU(green[row][cc + left], LVF(rgbgreen[rr * ts + cc]) * c65535v); + STVFU(green[row][cc + left], vmaxf(LVF(rgbgreen[rr * ts + cc]) * c65535v, ZEROV)); } #endif for (; cc < cc1 - 16; cc++) { - green[row][cc + left] = 65535.f * rgbgreen[rr * ts + cc]; + green[row][cc + left] = std::max(0.f, 65535.f * rgbgreen[rr * ts + cc]); } } diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index c48a002fb..538858a9a 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -215,7 +215,6 @@ void RawImageSource::border_interpolate( int winw, int winh, int lborders, const // Adapted to RawTherapee by Jacques Desmis 3/2013 // SSE version by Ingo Weyrich 5/2013 #ifdef __SSE2__ -#define CLIPV(a) vclampf(a,zerov,c65535v) void RawImageSource::igv_interpolate(int winw, int winh) { static const float eps = 1e-5f, epssq = 1e-5f; //mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero) @@ -284,9 +283,9 @@ void RawImageSource::igv_interpolate(int winw, int winh) for (col = 0, indx = row * width + col; col < width - 7; col += 8, indx += 8) { temp1v = LVFU( rawData[row][col] ); - temp1v = CLIPV( temp1v ); + temp1v = vmaxf(temp1v, ZEROV); temp2v = LVFU( rawData[row][col + 4] ); - temp2v = CLIPV( temp2v ); + temp2v = vmaxf(temp2v, ZEROV); tempv = _mm_shuffle_ps( temp1v, temp2v, _MM_SHUFFLE( 2, 0, 2, 0 ) ); _mm_storeu_ps( &dest1[indx >> 1], tempv ); tempv = _mm_shuffle_ps( temp1v, temp2v, _MM_SHUFFLE( 3, 1, 3, 1 ) ); @@ -294,10 +293,10 @@ void RawImageSource::igv_interpolate(int winw, int winh) } for (; col < width; col++, indx += 2) { - dest1[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT data + dest1[indx >> 1] = std::max(0.f, rawData[row][col]); //rawData = RT data col++; if(col < width) - dest2[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT data + dest2[indx >> 1] = std::max(0.f, rawData[row][col]); //rawData = RT data } } @@ -556,42 +555,42 @@ void RawImageSource::igv_interpolate(int winw, int winh) temp2v = LVFU( src2[(indx + 1) >> 1] ); tempv = _mm_shuffle_ps( temp1v, temp2v, _MM_SHUFFLE( 1, 0, 1, 0 ) ); tempv = _mm_shuffle_ps( tempv, tempv, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - _mm_storeu_ps( &green[row][col], CLIPV( tempv )); + _mm_storeu_ps( &green[row][col], vmaxf(tempv, ZEROV)); temp5v = LVFU(redsrc0[indx >> 1]); temp6v = LVFU(redsrc1[(indx + 1) >> 1]); temp3v = _mm_shuffle_ps( temp5v, temp6v, _MM_SHUFFLE( 1, 0, 1, 0 ) ); temp3v = _mm_shuffle_ps( temp3v, temp3v, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - temp3v = CLIPV( tempv - c65535v * temp3v ); + temp3v = vmaxf(tempv - c65535v * temp3v, ZEROV); _mm_storeu_ps( &red[row][col], temp3v); temp7v = LVFU(bluesrc0[indx >> 1]); temp8v = LVFU(bluesrc1[(indx + 1) >> 1]); temp4v = _mm_shuffle_ps( temp7v, temp8v, _MM_SHUFFLE( 1, 0, 1, 0 ) ); temp4v = _mm_shuffle_ps( temp4v, temp4v, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - temp4v = CLIPV( tempv - c65535v * temp4v ); + temp4v = vmaxf(tempv - c65535v * temp4v, ZEROV); _mm_storeu_ps( &blue[row][col], temp4v); tempv = _mm_shuffle_ps( temp1v, temp2v, _MM_SHUFFLE( 3, 2, 3, 2 ) ); tempv = _mm_shuffle_ps( tempv, tempv, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - _mm_storeu_ps( &green[row][col + 4], CLIPV( tempv )); + _mm_storeu_ps( &green[row][col + 4], vmaxf(tempv, ZEROV)); temp3v = _mm_shuffle_ps( temp5v, temp6v, _MM_SHUFFLE( 3, 2, 3, 2 ) ); temp3v = _mm_shuffle_ps( temp3v, temp3v, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - temp3v = CLIPV( tempv - c65535v * temp3v ); + temp3v = vmaxf(tempv - c65535v * temp3v, ZEROV); _mm_storeu_ps( &red[row][col + 4], temp3v); temp4v = _mm_shuffle_ps( temp7v, temp8v, _MM_SHUFFLE( 3, 2, 3, 2 ) ); temp4v = _mm_shuffle_ps( temp4v, temp4v, _MM_SHUFFLE( 3, 1, 2, 0 ) ); - temp4v = CLIPV( tempv - c65535v * temp4v ); + temp4v = vmaxf(tempv - c65535v * temp4v, ZEROV); _mm_storeu_ps( &blue[row][col + 4], temp4v); } for(; col < width - 7; col++, indx += 2) { - red [row][col] = CLIP(src1[indx >> 1] - 65535.f * redsrc0[indx >> 1]); - green[row][col] = CLIP(src1[indx >> 1]); - blue [row][col] = CLIP(src1[indx >> 1] - 65535.f * bluesrc0[indx >> 1]); + red [row][col] = std::max(0.f, src1[indx >> 1] - 65535.f * redsrc0[indx >> 1]); + green[row][col] = std::max(0.f, src1[indx >> 1]); + blue [row][col] = std::max(0.f, src1[indx >> 1] - 65535.f * bluesrc0[indx >> 1]); col++; - red [row][col] = CLIP(src2[(indx + 1) >> 1] - 65535.f * redsrc1[(indx + 1) >> 1]); - green[row][col] = CLIP(src2[(indx + 1) >> 1]); - blue [row][col] = CLIP(src2[(indx + 1) >> 1] - 65535.f * bluesrc1[(indx + 1) >> 1]); + red [row][col] = std::max(0.f, src2[(indx + 1) >> 1] - 65535.f * redsrc1[(indx + 1) >> 1]); + green[row][col] = std::max(0.f, src2[(indx + 1) >> 1]); + blue [row][col] = std::max(0.f, src2[(indx + 1) >> 1] - 65535.f * bluesrc1[(indx + 1) >> 1]); } } }// End of parallelization @@ -606,7 +605,6 @@ void RawImageSource::igv_interpolate(int winw, int winh) free(vdif); free(hdif); } -#undef CLIPV #else void RawImageSource::igv_interpolate(int winw, int winh) { @@ -649,7 +647,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) for (int row = 0; row < height - 0; row++) for (int col = 0, indx = row * width + col; col < width - 0; col++, indx++) { int c = FC(row, col); - rgb[c][indx] = CLIP(rawData[row][col]); //rawData = RT data + rgb[c][indx] = std::max(0.f, rawData[row][col]); //rawData = RT data } #ifdef _OPENMP @@ -848,9 +846,9 @@ void RawImageSource::igv_interpolate(int winw, int winh) for(int row = 7; row < height - 7; row++) for(int col = 7, indx = row * width + col; col < width - 7; col++, indx++) { - red [row][col] = CLIP(rgb[1][indx] - 65535.f * chr[0][indx]); - green[row][col] = CLIP(rgb[1][indx]); - blue [row][col] = CLIP(rgb[1][indx] - 65535.f * chr[1][indx]); + red [row][col] = std::max(0.f, rgb[1][indx] - 65535.f * chr[0][indx]); + green[row][col] = std::max(0.f, rgb[1][indx]); + blue [row][col] = std::max(0.f, rgb[1][indx] - 65535.f * chr[1][indx]); } }// End of parallelization border_interpolate(winw, winh, 8, rawData, red, green, blue); @@ -1520,9 +1518,9 @@ BENCHFUN */ for(int y = 0; y < TILESIZE && y0 + y < H; y++) { for (int j = 0; j < TILESIZE && x0 + j < W; j++) { - red[y0 + y][x0 + j] = tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][0]; - green[y0 + y][x0 + j] = tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][1]; - blue[y0 + y][x0 + j] = tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][2]; + red[y0 + y][x0 + j] = std::max(0.f, tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][0]); + green[y0 + y][x0 + j] = std::max(0.f, tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][1]); + blue[y0 + y][x0 + j] = std::max(0.f, tile[(y + TILEBORDER) * CACHESIZE + TILEBORDER + j][2]); } } diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index c470eb297..ad4bda3cd 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -400,11 +400,11 @@ void RawImageSource::eahd_demosaic () int vc = homv[imx][j]; if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; + green[i - 1][j] = std::max(0.f, gh[(i - 1) % 4][j]); } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; + green[i - 1][j] = std::max(0.f, gv[(i - 1) % 4][j]); } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + green[i - 1][j] = std::max(0.f, (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2); } } } @@ -421,11 +421,11 @@ void RawImageSource::eahd_demosaic () int vc = homv[(i - 1) % 3][j]; if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; + green[i - 1][j] = std::max(0.f, gh[(i - 1) % 4][j]); } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; + green[i - 1][j] = std::max(0.f, gv[(i - 1) % 4][j]); } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + green[i - 1][j] = std::max(0.f, (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2); } } diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index aaa5ceb02..772096b87 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -452,23 +452,23 @@ void RawImageSource::fast_demosaic() #ifdef __SSE2__ for (j = left + 2, cc = 2; j < right - 5; j += 4, cc += 4) { - _mm_storeu_ps(&red[i][j], LVFU(redtile[rr * TS + cc])); - _mm_storeu_ps(&green[i][j], LVFU(greentile[rr * TS + cc])); - _mm_storeu_ps(&blue[i][j], LVFU(bluetile[rr * TS + cc])); + _mm_storeu_ps(&red[i][j], vmaxf(LVFU(redtile[rr * TS + cc]), ZEROV)); + _mm_storeu_ps(&green[i][j], vmaxf(LVFU(greentile[rr * TS + cc]), ZEROV)); + _mm_storeu_ps(&blue[i][j], vmaxf(LVFU(bluetile[rr * TS + cc]), ZEROV)); } for (; j < right - 2; j++, cc++) { - red[i][j] = redtile[rr * TS + cc]; - green[i][j] = greentile[rr * TS + cc]; - blue[i][j] = bluetile[rr * TS + cc]; + red[i][j] = std::max(0.f, redtile[rr * TS + cc]); + green[i][j] = std::max(0.f, greentile[rr * TS + cc]); + blue[i][j] = std::max(0.f, bluetile[rr * TS + cc]); } #else for (int j = left + 2, cc = 2; j < right - 2; j++, cc++) { - red[i][j] = redtile[rr * TS + cc]; - green[i][j] = greentile[rr * TS + cc]; - blue[i][j] = bluetile[rr * TS + cc]; + red[i][j] = std::max(0.f, redtile[rr * TS + cc]); + green[i][j] = std::max(0.f, greentile[rr * TS + cc]); + blue[i][j] = std::max(0.f, bluetile[rr * TS + cc]); } #endif diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc index 5e05b128e..936c8fa4f 100644 --- a/rtengine/hphd_demosaic_RT.cc +++ b/rtengine/hphd_demosaic_RT.cc @@ -217,7 +217,7 @@ void hphd_green(const RawImage *ri, const array2D &rawData, float** hpmap const float e4 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); - green[i][j] = rawData[i][j] * 0.5f + (e2 * g2 + e4 * g4) / (e2 + e4); + green[i][j] = std::max(0.f, rawData[i][j] * 0.5f + (e2 * g2 + e4 * g4) / (e2 + e4)); } else if (hpmap[i][j] == 2) { const float g1 = rawData[i - 1][j] - rawData[i - 2][j] * 0.5f; const float g3 = rawData[i + 1][j] - rawData[i + 2][j] * 0.5f; @@ -237,7 +237,7 @@ void hphd_green(const RawImage *ri, const array2D &rawData, float** hpmap const float e3 = 1.f / (dy + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); - green[i][j] = rawData[i][j] * 0.5f + (e1 * g1 + e3 * g3) / (e1 + e3); + green[i][j] = std::max(0.f, rawData[i][j] * 0.5f + (e1 * g1 + e3 * g3) / (e1 + e3)); } else { const float g1 = rawData[i - 1][j] - rawData[i - 2][j] * 0.5f; const float g2 = rawData[i][j + 1] - rawData[i][j + 2] * 0.5f; @@ -275,7 +275,7 @@ void hphd_green(const RawImage *ri, const array2D &rawData, float** hpmap const float e4 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); - green[i][j] = rawData[i][j] * 0.5f + ((e1 * g1 + e2 * g2) + (e3 * g3 + e4 * g4)) / (e1 + e2 + e3 + e4); + green[i][j] = std::max(0.f, rawData[i][j] * 0.5f + ((e1 * g1 + e2 * g2) + (e3 * g3 + e4 * g4)) / (e1 + e2 + e3 + e4)); } } } diff --git a/rtengine/lmmse_demosaic.cc b/rtengine/lmmse_demosaic.cc index 6191ca36c..f4af1b801 100644 --- a/rtengine/lmmse_demosaic.cc +++ b/rtengine/lmmse_demosaic.cc @@ -131,7 +131,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2DmakeIdentity(65535.f); } @@ -623,7 +623,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2D &raw } b = g_mul * cg[j] + b / std::max(1, n); - ab[jx] = b; + ab[jx] = std::max(0.f, b); } else { // linear R-G interp. horizontally float r; @@ -103,7 +103,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw r = g_mul * cg[j] + (r_mul * rawData[i][j - 1] - g_mul * cg[j - 1] + r_mul * rawData[i][j + 1] - g_mul * cg[j + 1]) / 2; } - ar[jx] = r; + ar[jx] = std::max(0.f, r); // linear B-G interp. vertically float b; @@ -115,7 +115,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw b = g_mul * cg[j] + (b_mul * rawData[i - 1][j] - g_mul * pg[j] + b_mul * rawData[i + 1][j] - g_mul * ng[j]) / 2; } - ab[jx] = b; + ab[jx] = std::max(0.f, b); } } } else if(pg && ng) { @@ -150,7 +150,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw r = g_mul * cg[j] + r / std::max(n, 1); - ar[jx] = r; + ar[jx] = std::max(0.f, r); } else { // linear B-G interp. horizontally float b; @@ -163,7 +163,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw b = g_mul * cg[j] + (b_mul * rawData[i][j - 1] - g_mul * cg[j - 1] + b_mul * rawData[i][j + 1] - g_mul * cg[j + 1]) / 2; } - ab[jx] = b; + ab[jx] = std::max(0.f, b); // linear R-G interp. vertically float r; @@ -175,7 +175,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw r = g_mul * cg[j] + (r_mul * rawData[i - 1][j] - g_mul * pg[j] + r_mul * rawData[i + 1][j] - g_mul * ng[j]) / 2; } - ar[jx] = r; + ar[jx] = std::max(0.f, r); } } } diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 4ceb92b26..5a86aec40 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -275,9 +275,9 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) for (int row = rowStart + rcdBorder; row < rowEnd - rcdBorder; ++row) { for (int col = colStart + rcdBorder; col < colEnd - rcdBorder; ++col) { int idx = (row - rowStart) * tileSize + col - colStart ; - red[row][col] = CLIP(rgb[0][idx] * 65535.f); - green[row][col] = CLIP(rgb[1][idx] * 65535.f); - blue[row][col] = CLIP(rgb[2][idx] * 65535.f); + red[row][col] = std::max(0.f, rgb[0][idx] * 65535.f); + green[row][col] = std::max(0.f, rgb[1][idx] * 65535.f); + blue[row][col] = std::max(0.f, rgb[2][idx] * 65535.f); } } diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 47982b6da..ef456af3a 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -45,12 +45,12 @@ inline void vng4interpolate_row_redblue (const RawImage *ri, const array2D &rawData, array2D firstRow) { vng4interpolate_row_redblue(ri, rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, W); diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index c1a526535..cb1315ed0 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -939,9 +939,9 @@ void RawImageSource::xtrans_interpolate (const int passes, const bool useCieLab, avg[3]++; } - red[row + top][col + left] = avg[0] / avg[3]; - green[row + top][col + left] = avg[1] / avg[3]; - blue[row + top][col + left] = avg[2] / avg[3]; + red[row + top][col + left] = std::max(0.f, avg[0] / avg[3]); + green[row + top][col + left] = std::max(0.f, avg[1] / avg[3]); + blue[row + top][col + left] = std::max(0.f, avg[2] / avg[3]); } if(plistenerActive && ((++progressCounter) % 32 == 0)) { From 637e8454efbda9132ce9c30021e6e0df300c4db5 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 12 Dec 2019 19:59:27 +0100 Subject: [PATCH 026/100] Do not generate negative values in output of raw ca-correction, #5562 --- rtengine/CA_correct_RT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 4dc2019c1..f4d082199 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -1258,12 +1258,12 @@ float* RawImageSource::CA_correct_RT( int indx = (row * width + col) >> 1; #ifdef __SSE2__ for (; col < width - 7 - cb; col += 8, indx += 4) { - vfloat val = LVFU(RawDataTmp[indx]); + const vfloat val = vmaxf(LVFU(RawDataTmp[indx]), ZEROV); STC2VFU(rawData[row][col], val); } #endif for (; col < width - cb; col += 2, indx++) { - rawData[row][col] = RawDataTmp[indx]; + rawData[row][col] = std::max(0.f, RawDataTmp[indx]); } } From 4d72fc0b5bab964fd3ee5ffb7b5df1c8d2ac9963 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 12 Dec 2019 20:05:43 +0100 Subject: [PATCH 027/100] Do not generate negative values if raw values are less than black level, #5562 --- rtengine/rawimagesource.cc | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index ea3152918..d00812d88 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2543,12 +2543,10 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R for (int row = winy; row < winy + winh; row ++) { for (int col = winx; col < winx + winw; col++) { - float val = rawData[row][col]; - int c = FC(row, col); // three colors, 0=R, 1=G, 2=B - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 - val -= cblacksom[c4]; - val *= scale_mul[c4]; - rawData[row][col] = (val); + const int c = FC(row, col); // three colors, 0=R, 1=G, 2=B + const int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 + const float val = max(0.f, rawData[row][col] - cblacksom[c4]) * scale_mul[c4]; + rawData[row][col] = val; tmpchmax[c] = max(tmpchmax[c], val); } } @@ -2575,10 +2573,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R for (int row = winy; row < winy + winh; row ++) { for (int col = winx; col < winx + winw; col++) { - float val = rawData[row][col]; - val -= cblacksom[0]; - val *= scale_mul[0]; - rawData[row][col] = (val); + const float val = max(0.f, rawData[row][col] - cblacksom[0]) * scale_mul[0]; + rawData[row][col] = val; tmpchmax = max(tmpchmax, val); } } @@ -2604,12 +2600,9 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R for (int row = winy; row < winy + winh; row ++) { for (int col = winx; col < winx + winw; col++) { - float val = rawData[row][col]; - int c = ri->XTRANSFC(row, col); - val -= cblacksom[c]; - val *= scale_mul[c]; - - rawData[row][col] = (val); + const int c = ri->XTRANSFC(row, col); + const float val = max(0.f, rawData[row][col] - cblacksom[c]) * scale_mul[c]; + rawData[row][col] = val; tmpchmax[c] = max(tmpchmax[c], val); } } @@ -2638,10 +2631,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R { for (int col = winx; col < winx + winw; col++) { for (int c = 0; c < 3; c++) { // three colors, 0=R, 1=G, 2=B - float val = rawData[row][3 * col + c]; - val -= cblacksom[c]; - val *= scale_mul[c]; - rawData[row][3 * col + c] = (val); + const float val = max(0.f, rawData[row][3 * col + c] - cblacksom[c]) * scale_mul[c]; + rawData[row][3 * col + c] = val; tmpchmax[c] = max(tmpchmax[c], val); } } From 91d6211b00326dbee89a165c6c5a145410bb7528 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 12:29:19 +0100 Subject: [PATCH 028/100] first github actions experiment --- .github/workflows/main.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..6c083056a --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,17 @@ +name: CI + +on: [push] + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v1 + - name: Run a one-line script + run: echo Hello, world! + - name: Run a multi-line script + run: | + echo Add other actions to build, + echo test, and deploy your project. From ffb9ddc286e71242e7dfa5a210d3446a686e10c9 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 12:45:39 +0100 Subject: [PATCH 029/100] ci macos: install dependencies --- .github/workflows/main.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6c083056a..17ecc4bd9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,7 @@ name: CI -on: [push] +on: + - push jobs: build: @@ -9,9 +10,5 @@ jobs: steps: - uses: actions/checkout@v1 - - name: Run a one-line script - run: echo Hello, world! - - name: Run a multi-line script - run: | - echo Add other actions to build, - echo test, and deploy your project. + - name: Install dependencies + run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun wget llvm cmake expat pkgconfig libomp From f7e826359e44346ee7135a752628794286b806bb Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:14:50 +0100 Subject: [PATCH 030/100] ci macos: first build attempt --- .github/workflows/main.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 17ecc4bd9..4b53fc69b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,5 +10,18 @@ jobs: steps: - uses: actions/checkout@v1 + - name: test getting the git branch of the triggering ref + run: echo ${GITHUB_REF##*/} - name: Install dependencies run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun wget llvm cmake expat pkgconfig libomp + - name: cmake + env: + CMAKE_CXX_STANDARD: 11 + run: | + cmake \ + -DCMAKE_BUILD_TYPE="release" \ + -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ + -DPROC_TARGET_NUMBER="2" \ + -DBUILD_BUNDLE="ON" \ + -DWITH_LTO="OFF" \ + -DLENSFUNDBDIR="./share/lensfun" From 0a492de25fc1a3c7122fb285e4941258cac963d6 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:17:57 +0100 Subject: [PATCH 031/100] ci macos: do not install already installed libs --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b53fc69b..39d1835fa 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: - name: test getting the git branch of the triggering ref run: echo ${GITHUB_REF##*/} - name: Install dependencies - run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun wget llvm cmake expat pkgconfig libomp + run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp - name: cmake env: CMAKE_CXX_STANDARD: 11 From caeeeaec3954152c80c9538c7625386fb8986d91 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:31:54 +0100 Subject: [PATCH 032/100] ci macos: remove default option --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 39d1835fa..b5c00ebdc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,6 +22,5 @@ jobs: -DCMAKE_BUILD_TYPE="release" \ -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ - -DBUILD_BUNDLE="ON" \ -DWITH_LTO="OFF" \ -DLENSFUNDBDIR="./share/lensfun" From 370044fbfed2cac13fee031524372ce0d1280b73 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:32:41 +0100 Subject: [PATCH 033/100] ci macos: point cmake to source directory --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b5c00ebdc..5de9ff6fc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,4 +23,5 @@ jobs: -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ -DWITH_LTO="OFF" \ - -DLENSFUNDBDIR="./share/lensfun" + -DLENSFUNDBDIR="./share/lensfun" \ + . From 3eff4ae873714486dacd8874c738f13f3571008e Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:37:04 +0100 Subject: [PATCH 034/100] ci macos: remove test lines --- .github/workflows/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5de9ff6fc..f880f9dad 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,8 +10,6 @@ jobs: steps: - uses: actions/checkout@v1 - - name: test getting the git branch of the triggering ref - run: echo ${GITHUB_REF##*/} - name: Install dependencies run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp - name: cmake From d404072c32368b94ec0fb5aaee6b1ac1e471a33f Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:58:15 +0100 Subject: [PATCH 035/100] ci macos: whitespace fix --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f880f9dad..fc86e3f31 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: CMAKE_CXX_STANDARD: 11 run: | cmake \ - -DCMAKE_BUILD_TYPE="release" \ + -DCMAKE_BUILD_TYPE="release" \ -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ -DWITH_LTO="OFF" \ From 0b725ab252016c09df2311aa0503b4024b05f469 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 13:58:46 +0100 Subject: [PATCH 036/100] ci macos: link keg-only libs --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fc86e3f31..a1047150e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,4 +22,6 @@ jobs: -DPROC_TARGET_NUMBER="2" \ -DWITH_LTO="OFF" \ -DLENSFUNDBDIR="./share/lensfun" \ + -DLDFLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ + -DCXXFLAGS="-I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include" \ . From 62a71be567427a87f3bc0e650aad4d92a2d70d26 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:09:50 +0100 Subject: [PATCH 037/100] ci macos: set pkg config path --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a1047150e..6ae59b34a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,6 +15,7 @@ jobs: - name: cmake env: CMAKE_CXX_STANDARD: 11 + PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig run: | cmake \ -DCMAKE_BUILD_TYPE="release" \ From d17e1f303afc334d3bc041e086e094446e311507 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:34:19 +0100 Subject: [PATCH 038/100] ci macos: move to out-of-source build --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6ae59b34a..892da1ed8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,6 +12,8 @@ jobs: - uses: actions/checkout@v1 - name: Install dependencies run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp + - name: create and move to build directory + run: mkdir build && cd build - name: cmake env: CMAKE_CXX_STANDARD: 11 @@ -25,4 +27,4 @@ jobs: -DLENSFUNDBDIR="./share/lensfun" \ -DLDFLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ -DCXXFLAGS="-I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include" \ - . + .. From b1c6e20ce4c217903b245e530b578910391c8b83 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:38:09 +0100 Subject: [PATCH 039/100] ci macos: verbose make file --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 892da1ed8..66ccf7b32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,6 +21,7 @@ jobs: run: | cmake \ -DCMAKE_BUILD_TYPE="release" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ -DWITH_LTO="OFF" \ From aafaf33d0766cc9a33404f1b9a19fa545617cced Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:52:03 +0100 Subject: [PATCH 040/100] ci macos: add proc_label --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 66ccf7b32..11eedf096 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,6 +24,7 @@ jobs: -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ + -DPROC_LABEL="generic processor" \ -DWITH_LTO="OFF" \ -DLENSFUNDBDIR="./share/lensfun" \ -DLDFLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ From 429f6bd5b3b95f2a2147757d7f1b8e83d9863eb7 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:52:36 +0100 Subject: [PATCH 041/100] ci macos: add openmp --- .github/workflows/main.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 11eedf096..83914af61 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,6 +27,12 @@ jobs: -DPROC_LABEL="generic processor" \ -DWITH_LTO="OFF" \ -DLENSFUNDBDIR="./share/lensfun" \ - -DLDFLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ - -DCXXFLAGS="-I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include" \ + -DOpenMP_C_FLAGS=-fopenmp=libomp \ + -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ + -DOpenMP_C_LIB_NAMES="libomp" \ + -DOpenMP_CXX_LIB_NAMES="libomp" \ + -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ + -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include" \ + -DOpenMP_CXX_LIB_NAMES="libomp" \ + -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include" \ .. From 4a6c6041d921bc621424904a9f7f0112d3f99730 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:55:23 +0100 Subject: [PATCH 042/100] ci macos: add make commands --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 83914af61..d2831984b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -36,3 +36,6 @@ jobs: -DOpenMP_CXX_LIB_NAMES="libomp" \ -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include" \ .. + make --jobs 8 + make install + make macosx_bundle From 3ab43669e90f0f2063c45b1c5d19676bae662e4a Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 14:57:33 +0100 Subject: [PATCH 043/100] ci macos: add minor version number --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d2831984b..7cf7f6871 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,11 +18,13 @@ jobs: env: CMAKE_CXX_STANDARD: 11 PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + RAW_THERAPEE_MAJOR: '5' + RAW_THERAPEE_MINOR: '7' run: | cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCACHE_NAME_SUFFIX="5-${GITHUB_REF##*/}" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ -DWITH_LTO="OFF" \ From c4869d08d4a124057c513a13cd6eaf4b1f6d65e9 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 16:16:32 +0100 Subject: [PATCH 044/100] ci macos: fix out-of-source build --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7cf7f6871..fa9bb8be5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,8 +12,6 @@ jobs: - uses: actions/checkout@v1 - name: Install dependencies run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp - - name: create and move to build directory - run: mkdir build && cd build - name: cmake env: CMAKE_CXX_STANDARD: 11 @@ -21,6 +19,7 @@ jobs: RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '7' run: | + mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ From 4aad850267c9fd057dad14218a2c143ba6c1de7a Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 16:16:49 +0100 Subject: [PATCH 045/100] ci macos: attempt to fix linking issues --- .github/workflows/main.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fa9bb8be5..06cb73145 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,11 +18,13 @@ jobs: PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '7' + C_FLAGS: -Xpreprocessor -fopenmp /usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${GITHUB_REF##*/}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ @@ -32,10 +34,9 @@ jobs: -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ -DOpenMP_C_LIB_NAMES="libomp" \ -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ - -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include" \ - -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include" \ + -DOpenMP_libomp_LIBRARY="/usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib" \ + -DOpenMP_C_FLAGS="${C_FLAGS}" \ + -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ .. make --jobs 8 make install From edfadf4ff20980efe6d03490b743cd5c30005bb8 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 16:38:07 +0100 Subject: [PATCH 046/100] ci macos: fix permission denieds --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 06cb73145..e7f97f410 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,4 +40,5 @@ jobs: .. make --jobs 8 make install - make macosx_bundle + sudo make macosx_bundle + From dbf2c3fe2d0a000e687dd8017f18f8b88c721b91 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 16:44:28 +0100 Subject: [PATCH 047/100] ci macos: fix branch ref --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e7f97f410..31fc77522 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,12 +20,13 @@ jobs: RAW_THERAPEE_MINOR: '7' C_FLAGS: -Xpreprocessor -fopenmp /usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | + REF=${GITHUB_REF##*/} mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ - -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${GITHUB_REF##*/}" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ -DWITH_LTO="OFF" \ From 2179b74c37a25726dcd81a745c0cbeb3552a9f58 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 17:09:32 +0100 Subject: [PATCH 048/100] ci macos: distinctively name macos build --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 31fc77522..0fdc726a8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: CI +name: Mac OS build on: - push From b41cf71aace0ccbfd013e149992feb7bf6c609bf Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 17:34:37 +0100 Subject: [PATCH 049/100] ci macos: upload dmg artifact --- .github/workflows/main.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0fdc726a8..e288fda9b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,7 +1,7 @@ name: Mac OS build on: - - push + push jobs: build: @@ -42,4 +42,11 @@ jobs: make --jobs 8 make install sudo make macosx_bundle - + + ARTIFACT=$(ls | grep .dmg) + echo "Writing -${ARTIFACT} to the ARTIFACT environment variable for use in upload-artifact step" + echo "::set-env name=ARTIFACT::${ARTIFACT}" + - uses: actions/upload-artifact@v1 + with: + name: ${{env.ARTIFACT}} + path: build/${{env.ARTIFACT}} From 92c29bcd65ae36c418b5bd29393602ad905c8fbf Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 13 Dec 2019 13:50:00 +0100 Subject: [PATCH 050/100] Skip capture sharpening for predemosaiced raw files, fixes #5563 --- rtengine/capturesharpening.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 910de6fd3..281a2ad71 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -700,6 +700,10 @@ namespace rtengine void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) { + if (!(ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1)) { + return; + } + if (plistener) { plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.0); From 03d2393af39bb136155a75c0a924648dc4892065 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 18:09:56 +0100 Subject: [PATCH 051/100] ci macos: remove empty line in run statement --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e288fda9b..995b1c210 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -42,9 +42,8 @@ jobs: make --jobs 8 make install sudo make macosx_bundle - ARTIFACT=$(ls | grep .dmg) - echo "Writing -${ARTIFACT} to the ARTIFACT environment variable for use in upload-artifact step" + echo "===== Writing ${ARTIFACT} to the ARTIFACT environment variable for use in upload-artifact step =====" echo "::set-env name=ARTIFACT::${ARTIFACT}" - uses: actions/upload-artifact@v1 with: From 59106b89a17d8d7be4913503487fdb3811273c17 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sat, 7 Dec 2019 19:44:58 +0100 Subject: [PATCH 052/100] ci macos: fix artifact upload --- .github/workflows/main.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 995b1c210..f386bdda7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -42,10 +42,11 @@ jobs: make --jobs 8 make install sudo make macosx_bundle - ARTIFACT=$(ls | grep .dmg) - echo "===== Writing ${ARTIFACT} to the ARTIFACT environment variable for use in upload-artifact step =====" - echo "::set-env name=ARTIFACT::${ARTIFACT}" + ARTIFACT=$(ls | grep RawTherapee*.zip) + echo "=== artifact: ${ARTIFACT}" + echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" + echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" - uses: actions/upload-artifact@v1 with: - name: ${{env.ARTIFACT}} - path: build/${{env.ARTIFACT}} + name: ${{env.ARTIFACT_FILE}} + path: ${{env.ARTIFACT_PATH}} From 64ce4d6bb9fcf721f613fed2d1586747ed31a6e9 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sun, 8 Dec 2019 21:56:32 +0100 Subject: [PATCH 053/100] macos: patch libiconv 1.16 --- tools/osx/libiconv_1.16_rt.patch | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tools/osx/libiconv_1.16_rt.patch diff --git a/tools/osx/libiconv_1.16_rt.patch b/tools/osx/libiconv_1.16_rt.patch new file mode 100644 index 000000000..470f7780c --- /dev/null +++ b/tools/osx/libiconv_1.16_rt.patch @@ -0,0 +1,31 @@ +diff --git a/lib/iconv.c b/lib/iconv.c +index b7a04f8..41c5896 100644 +--- a/lib/iconv.c ++++ b/lib/iconv.c +@@ -610,5 +610,26 @@ strong_alias (libiconv_open, iconv_open) + strong_alias (libiconv, iconv) + strong_alias (libiconv_close, iconv_close) + #endif ++ ++#undef iconv_open ++#undef iconv ++#undef iconv_close ++ ++LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) ++{ ++ return libiconv_open(tocode, fromcode); ++} ++ ++LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, ++ ICONV_CONST char * * inbuf, size_t *inbytesleft, ++ char * * outbuf, size_t *outbytesleft) ++{ ++ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); ++} ++ ++LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) ++{ ++ return libiconv_close(icd); ++} + + #endif From 6d6fbef216693259b7188a82e697192046361605 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sun, 8 Dec 2019 22:22:41 +0100 Subject: [PATCH 054/100] ci macos: patch libiconv --- .github/workflows/main.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f386bdda7..4cb80a2fe 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,6 +12,20 @@ jobs: - uses: actions/checkout@v1 - name: Install dependencies run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp + - name: patch libiconv + run: | + mkdir libiconv && cd libiconv + wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz + tar xf libiconv-1.16.tar.gz + cd libiconv-1.16 + patch -p1 < "${GITHUB_WORKSPACE}/tools/osx/libiconv_1.16_rt.patch" + mkdir build && cd build + destDir="$(pwd)" + ../configure --prefix=/opt/local --disable-static 'CFLAGS=-arch x86_64 -mmacosx-version-min=10.9' 'LDFLAGS=-arch x86_64 -mmacosx-version-min=10.9' CXXFLAGS="-arch x86_64 -mmacosx-version-min=10.9" + make --jobs 2 + make DESTDIR="${destDir}" install + sudo cp opt/local/lib/libiconv.2.dylib /usr/lib/libiconv.2.dylib + cd - - name: cmake env: CMAKE_CXX_STANDARD: 11 @@ -39,7 +53,7 @@ jobs: -DOpenMP_C_FLAGS="${C_FLAGS}" \ -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ .. - make --jobs 8 + make --jobs 2 make install sudo make macosx_bundle ARTIFACT=$(ls | grep RawTherapee*.zip) From 7d403407e5d79cd6afd9c90cdc116eaf4dacdcd4 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Sun, 8 Dec 2019 23:18:35 +0100 Subject: [PATCH 055/100] ci macos: install and use entire patched libiconv --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4cb80a2fe..950e7587d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: ../configure --prefix=/opt/local --disable-static 'CFLAGS=-arch x86_64 -mmacosx-version-min=10.9' 'LDFLAGS=-arch x86_64 -mmacosx-version-min=10.9' CXXFLAGS="-arch x86_64 -mmacosx-version-min=10.9" make --jobs 2 make DESTDIR="${destDir}" install - sudo cp opt/local/lib/libiconv.2.dylib /usr/lib/libiconv.2.dylib + sudo mv opt/local /usr/local/opt/libiconv cd - - name: cmake env: @@ -32,14 +32,14 @@ jobs: PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '7' - C_FLAGS: -Xpreprocessor -fopenmp /usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include + C_FLAGS: -Xpreprocessor -fopenmp /usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | REF=${GITHUB_REF##*/} mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/opt/libffi/lib -L/usr/local/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ From 72f261a1b0270aebadf06bdb4d292cdca59b7d18 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Mon, 9 Dec 2019 15:26:26 +0100 Subject: [PATCH 056/100] Print /usr/local/lib contents & link it before other libs --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 950e7587d..cdd0033f2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,6 +26,8 @@ jobs: make DESTDIR="${destDir}" install sudo mv opt/local /usr/local/opt/libiconv cd - + - name: print /usr/local/lib contents + run: ls -al /usr/local/lib - name: cmake env: CMAKE_CXX_STANDARD: 11 @@ -39,7 +41,7 @@ jobs: cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ From aa0a1a870f219e18c760cadd301db38eb46f478f Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Mon, 9 Dec 2019 23:25:12 +0100 Subject: [PATCH 057/100] ci macos: remove unneccesary cd statement --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cdd0033f2..bdedf5432 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,6 @@ jobs: make --jobs 2 make DESTDIR="${destDir}" install sudo mv opt/local /usr/local/opt/libiconv - cd - - name: print /usr/local/lib contents run: ls -al /usr/local/lib - name: cmake From 62da9d434a3abc49f0c19090cdc7607aa381439a Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Mon, 9 Dec 2019 23:25:50 +0100 Subject: [PATCH 058/100] ci macos: change order of linker statements --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bdedf5432..4bc769e3f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,7 +40,7 @@ jobs: cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ From 0e662ccb4a68ca4e46397bca299892bdd9257406 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Mon, 9 Dec 2019 23:26:28 +0100 Subject: [PATCH 059/100] ci macos: configure AR and RANLIB libraries for cmake --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4bc769e3f..b90fedef1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -53,6 +53,8 @@ jobs: -DOpenMP_libomp_LIBRARY="/usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib" \ -DOpenMP_C_FLAGS="${C_FLAGS}" \ -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ + -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ + -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ .. make --jobs 2 make install From d5b8c9658ddcd183f1fada371929a05f07d4ad0b Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Mon, 9 Dec 2019 23:34:23 +0100 Subject: [PATCH 060/100] ci macos: use symlink reference for libomp --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b90fedef1..dad60b0db 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,7 +33,7 @@ jobs: PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '7' - C_FLAGS: -Xpreprocessor -fopenmp /usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include + C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | REF=${GITHUB_REF##*/} mkdir build && cd build @@ -50,7 +50,7 @@ jobs: -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ -DOpenMP_C_LIB_NAMES="libomp" \ -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_libomp_LIBRARY="/usr/local/Cellar/libomp/9.0.0/lib/libomp.dylib" \ + -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ -DOpenMP_C_FLAGS="${C_FLAGS}" \ -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ From 0c10b1466ef0220d1aec9d924c2edbd34f80c86f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 13 Dec 2019 14:39:05 +0100 Subject: [PATCH 061/100] raw crop for Leica SL2 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 8639ea2e1..a3bab58a8 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1398,6 +1398,11 @@ Camera constants: "raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000 }, + { // Quality C, only raw crop + "make_model": "Leica SL2", + "raw_crop": [ 0, 0, 0, -18 ] // 18 rows at bottom are garbage + }, + { // Quality C "make_model": "LG mobile LG-H815", "dcraw_matrix": [ 5859,547,-1250,-6484,15547,547,-2422,5625,3906 ], // DNG D65 From 0a4f140aadfa9e1e2e90df68180cf812dc4d015e Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 00:05:08 +0100 Subject: [PATCH 062/100] ci macos: fix path for gdk-pixbuf-2.0 --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 2501e936b..d3da8c7b7 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -117,7 +117,7 @@ msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" msg "Copying library modules from ${GTK_PREFIX}:" -ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gdk-pixbuf-2.0 +ditto --arch "${arch}" {"/usr/local/Cellar/gdk-pixbuf/2*/lib","${LIB}"}/gdk-pixbuf-2.0 ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gtk-3.0 msg "Removing static libraries and cache files:" From 7eb2366e98d17a853a301e32de7691a20b292970 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 00:36:32 +0100 Subject: [PATCH 063/100] ci macos: link gdk-pixbuf from usr/local/opt --- .github/workflows/main.yml | 4 ++-- tools/osx/macosx_bundle.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dad60b0db..7ff4c4352 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,14 +33,14 @@ jobs: PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '7' - C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include + C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | REF=${GITHUB_REF##*/} mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE="release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="2" \ -DPROC_LABEL="generic processor" \ diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index d3da8c7b7..e697ec766 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -117,7 +117,7 @@ msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" msg "Copying library modules from ${GTK_PREFIX}:" -ditto --arch "${arch}" {"/usr/local/Cellar/gdk-pixbuf/2*/lib","${LIB}"}/gdk-pixbuf-2.0 +ditto --arch "${arch}" {"/usr/local/opt/gdk-pixbuf/lib","${LIB}"}/gdk-pixbuf-2.0 ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gtk-3.0 msg "Removing static libraries and cache files:" From 351fe7e2f11ca1da45edac219dd9e92e223e51e4 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 19:39:28 +0100 Subject: [PATCH 064/100] ci macos: fix for gdk-pixbuf not being within gtk+3 (on brew) --- tools/osx/macosx_bundle.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index e697ec766..44cacef88 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -99,6 +99,7 @@ MACOS="${CONTENTS}/MacOS" LIB="${CONTENTS}/Frameworks" ETC="${RESOURCES}/etc" EXECUTABLE="${MACOS}/rawtherapee" +GDK_PREFIX="/usr/local/opt/gdk-pixbuf" msg "Removing old files:" rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" @@ -117,7 +118,7 @@ msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" msg "Copying library modules from ${GTK_PREFIX}:" -ditto --arch "${arch}" {"/usr/local/opt/gdk-pixbuf/lib","${LIB}"}/gdk-pixbuf-2.0 +ditto --arch "${arch}" {"${GDK_PREFIX}/lib","${LIB}"}/gdk-pixbuf-2.0 ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gtk-3.0 msg "Removing static libraries and cache files:" @@ -132,8 +133,8 @@ mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gdk-pixbuf-2.0 -"${GTK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" -"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" +"${GDK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" +"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas From fa2e8e63545e22e2ee829841058a76e910a8ba1c Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 19:40:27 +0100 Subject: [PATCH 065/100] ci macos: many fixes for library locations (homebrew) --- tools/osx/macosx_bundle.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 44cacef88..fd3a84c14 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -137,43 +137,43 @@ rm -r "${LIB}"/gdk-pixbuf-2.0 "${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" -ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas -"${GTK_PREFIX}/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" +ditto {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas +"/usr/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" msg "Copying shared files from ${GTK_PREFIX}:" -ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/mime +ditto {"/usr/local","${RESOURCES}"}/share/mime # GTK3 themes -ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css -ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css +ditto {"/usr/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css +ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css # Adwaita icons iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do - ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/"$f" + ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/"$f" done -ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme -"${GTK_PREFIX}/bin/gtk-update-icon-cache-3.0" "${RESOURCES}/share/icons/Adwaita" +ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme +"/usr/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" # Copy libjpeg-turbo into the app bundle -cp /opt/local/lib/libjpeg.62.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libjpeg.*.dylib "${RESOURCES}/../Frameworks" -# Copy libexpat into the app bundle -cp /opt/local/lib/libexpat.1.dylib "${RESOURCES}/../Frameworks" +# Copy libexpat into the app bundle (which is keg-only) +cp /usr/local/Cellar/expat/*/lib/libexpat.1.dylib "${RESOURCES}/../Frameworks" # Copy libz into the app bundle -cp /opt/local/lib/libz.1.dylib "${RESOURCES}/../Frameworks" +cp /usr/lib/libz.1.dylib "${RESOURCES}/../Frameworks" # Copy libtiff into the app bundle -cp /opt/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks" # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" -cp /opt/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" +cp /usr/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" # Copy liblensfun to Frameworks -cp /opt/local/lib/liblensfun.2.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/liblensfun.2.dylib "${RESOURCES}/../Frameworks" # Copy libomp to Frameworks -cp /opt/local/lib/libomp.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libomp.dylib "${RESOURCES}/../Frameworks" # Install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do From 56169fb95d9129d98bdd693d2fda7a4d4e5cd805 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 20:10:27 +0100 Subject: [PATCH 066/100] ci macos: cp resources from where they actually are --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index fd3a84c14..9236f8fac 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -112,7 +112,7 @@ install -d "${RESOURCES}" \ msg "Copying release files:" ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" -ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" +ditto "Resources" "${RESOURCES}" msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" From f463cf8085fb37cfe8f4091d7e963668710f2adb Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 21:18:48 +0100 Subject: [PATCH 067/100] ci macos: fix, libprint .so files are now also in target LIB --- tools/osx/macosx_bundle.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 9236f8fac..267d20f0c 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -130,6 +130,7 @@ install -d "${ETC}/gtk-3.0" # Make Frameworks folder flat mv "${LIB}"/gdk-pixbuf-2.0/2*/loaders/*.so "${LIB}" mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" +mv "${LIB}"/gtk-3.0/3*/printbackends/*.so "${LIB}" rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gdk-pixbuf-2.0 From aa6140198b6f619cc2dc259f897b2079b6f2d06b Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 21:21:24 +0100 Subject: [PATCH 068/100] ci macos: simplify frameworks path --- tools/osx/macosx_bundle.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 267d20f0c..70bbf6f7d 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -155,26 +155,26 @@ ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "/usr/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" # Copy libjpeg-turbo into the app bundle -cp /usr/local/lib/libjpeg.*.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libjpeg.*.dylib "${CONTENTS}/Frameworks" # Copy libexpat into the app bundle (which is keg-only) -cp /usr/local/Cellar/expat/*/lib/libexpat.1.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/Cellar/expat/*/lib/libexpat.1.dylib "${CONTENTS}/Frameworks" # Copy libz into the app bundle -cp /usr/lib/libz.1.dylib "${RESOURCES}/../Frameworks" +cp /usr/lib/libz.1.dylib "${CONTENTS}/Frameworks" # Copy libtiff into the app bundle -cp /usr/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libtiff.5.dylib "${CONTENTS}/Frameworks" # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" cp /usr/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" # Copy liblensfun to Frameworks -cp /usr/local/lib/liblensfun.2.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks" # Copy libomp to Frameworks -cp /usr/local/lib/libomp.dylib "${RESOURCES}/../Frameworks" +cp /usr/local/lib/libomp.dylib "${CONTENTS}/Frameworks" # Install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do From 5298f95cbdf4ef3c375963986157f4a76a9c85f1 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 21:30:05 +0100 Subject: [PATCH 069/100] ci macos: follow symlinked files while copying --- tools/osx/macosx_bundle.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 70bbf6f7d..2b008fbf5 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -138,7 +138,8 @@ rm -r "${LIB}"/gdk-pixbuf-2.0 "${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" -ditto {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas +mkdir -p ${RESOURCES}/share/glib-2.0 +cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas "/usr/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" msg "Copying shared files from ${GTK_PREFIX}:" From bff973eef83adca82fbe4fcac6c6a4b9aaa1e9bc Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 21:56:36 +0100 Subject: [PATCH 070/100] ci macos: debug printing for mime copy action --- tools/osx/macosx_bundle.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 2b008fbf5..d2fefc7ac 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -143,7 +143,10 @@ cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas "/usr/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" msg "Copying shared files from ${GTK_PREFIX}:" +set -x +find /usr/local -name mime ditto {"/usr/local","${RESOURCES}"}/share/mime +set +x # GTK3 themes ditto {"/usr/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css From f6f9da10cc550b1ded3fc66ecca9d53ec59c109c Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 23:40:22 +0100 Subject: [PATCH 071/100] ci macos: do not include libprint to avoid error --- tools/osx/macosx_bundle.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index d2fefc7ac..31233ef38 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -130,12 +130,14 @@ install -d "${ETC}/gtk-3.0" # Make Frameworks folder flat mv "${LIB}"/gdk-pixbuf-2.0/2*/loaders/*.so "${LIB}" mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" -mv "${LIB}"/gtk-3.0/3*/printbackends/*.so "${LIB}" +# the print*.so lead to errors when running gtk-query-immodules-3.0, just seeing what the app does without, since they are not in immodules +# and including them leads to errors and a completely empty gtk.immodules file +# mv "${LIB}"/gtk-3.0/3*/printbackends/*.so "${LIB}" rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gdk-pixbuf-2.0 "${GDK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" -"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" +"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so} > "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" mkdir -p ${RESOURCES}/share/glib-2.0 From ed05d156126a4c36416812732a253a0741c58ffd Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Tue, 10 Dec 2019 23:40:58 +0100 Subject: [PATCH 072/100] ci macos: follow symlink files in copy --- tools/osx/macosx_bundle.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 31233ef38..4a0dc30be 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -146,8 +146,8 @@ cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas msg "Copying shared files from ${GTK_PREFIX}:" set -x -find /usr/local -name mime -ditto {"/usr/local","${RESOURCES}"}/share/mime +sudo find / -name mime +cp -pRL {"/usr/local","${RESOURCES}"}/share/mime set +x # GTK3 themes ditto {"/usr/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css @@ -155,7 +155,7 @@ ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css # Adwaita icons iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do - ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/"$f" + cp -pRL {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/"$f" done ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "/usr/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" From 055072c15a3e3c91d95973c740eeb4ff18c712f2 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Wed, 11 Dec 2019 00:06:29 +0100 Subject: [PATCH 073/100] ci macos: install shared-mime-info --- .github/workflows/main.yml | 2 +- tools/osx/macosx_bundle.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7ff4c4352..1468a069e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Install dependencies - run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp + run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp shared-mime-info - name: patch libiconv run: | mkdir libiconv && cd libiconv diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 4a0dc30be..e3012d453 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -146,7 +146,7 @@ cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas msg "Copying shared files from ${GTK_PREFIX}:" set -x -sudo find / -name mime +find /usr -name mime cp -pRL {"/usr/local","${RESOURCES}"}/share/mime set +x # GTK3 themes From 0e7a7efa1a5299febe93c4b28ab80392e67c5bd6 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Wed, 11 Dec 2019 00:32:54 +0100 Subject: [PATCH 074/100] ci macos: create directories for icons --- tools/osx/macosx_bundle.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index e3012d453..bf2357c62 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -145,16 +145,15 @@ cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas "/usr/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" msg "Copying shared files from ${GTK_PREFIX}:" -set -x -find /usr -name mime cp -pRL {"/usr/local","${RESOURCES}"}/share/mime -set +x + # GTK3 themes ditto {"/usr/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css # Adwaita icons iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do + mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} cp -pRL {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/"$f" done ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme From 10d5fc4d8e837a8d9db687060e26e92465fdc30f Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Wed, 11 Dec 2019 17:41:47 +0100 Subject: [PATCH 075/100] ci macos: fix globbing --- tools/osx/macosx_bundle.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index bf2357c62..cadb1d5e8 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -136,8 +136,8 @@ mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gdk-pixbuf-2.0 -"${GDK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" -"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so} > "${ETC}/gtk-3.0/gtk.immodules" +"${GDK_PREFIX}"/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders +"${GTK_PREFIX}"/bin/gtk-query-immodules-3.0 "${LIB}"/im*.so > "${ETC}"/gtk-3.0/gtk.immodules sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" mkdir -p ${RESOURCES}/share/glib-2.0 From 67e35fdb5d37386064d56aeb2c1f7799297b24fb Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Wed, 11 Dec 2019 18:31:04 +0100 Subject: [PATCH 076/100] ci macos: fix icons path --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index cadb1d5e8..3958326e8 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -154,7 +154,7 @@ ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} - cp -pRL {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/"$f" + cp /usr/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} done ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "/usr/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" From 2498423a6f010ab4fc11598858b36ace5458494e Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Thu, 12 Dec 2019 15:32:59 +0100 Subject: [PATCH 077/100] ci macos: avoid ls parsing bugs --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1468a069e..ba6e44172 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -59,7 +59,7 @@ jobs: make --jobs 2 make install sudo make macosx_bundle - ARTIFACT=$(ls | grep RawTherapee*.zip) + ARTIFACT=(RawTherapee*.zip) echo "=== artifact: ${ARTIFACT}" echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" From ec00334acba24a9f48b07b5b2ac951f0d5fb3ea2 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Thu, 12 Dec 2019 15:37:01 +0100 Subject: [PATCH 078/100] ci macos: use Apple's way of spelling macOS --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba6e44172..ff9eb98a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Mac OS build +name: macOS build on: push From ed6eeca929041a448f293f7e623cb5546bebe29c Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Thu, 12 Dec 2019 15:42:53 +0100 Subject: [PATCH 079/100] ci macos: explain GITHUB_REF parsing --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ff9eb98a2..e17414f44 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -35,6 +35,7 @@ jobs: RAW_THERAPEE_MINOR: '7' C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | + # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) REF=${GITHUB_REF##*/} mkdir build && cd build cmake \ From 8071e4229250d30087611e2bb44106a2000caf2a Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Thu, 12 Dec 2019 16:12:36 +0100 Subject: [PATCH 080/100] ci macos: automatic jobs config test 2 --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e17414f44..0bb14c479 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,7 +22,7 @@ jobs: mkdir build && cd build destDir="$(pwd)" ../configure --prefix=/opt/local --disable-static 'CFLAGS=-arch x86_64 -mmacosx-version-min=10.9' 'LDFLAGS=-arch x86_64 -mmacosx-version-min=10.9' CXXFLAGS="-arch x86_64 -mmacosx-version-min=10.9" - make --jobs 2 + make --jobs make DESTDIR="${destDir}" install sudo mv opt/local /usr/local/opt/libiconv - name: print /usr/local/lib contents @@ -57,7 +57,7 @@ jobs: -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ .. - make --jobs 2 + make --jobs make install sudo make macosx_bundle ARTIFACT=(RawTherapee*.zip) From 8425e974e6033a84c2eced672be13169a6daf8dd Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Fri, 13 Dec 2019 14:04:46 +0100 Subject: [PATCH 081/100] ci macos: document echo ::set-env --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0bb14c479..5f5b93686 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -62,6 +62,7 @@ jobs: sudo make macosx_bundle ARTIFACT=(RawTherapee*.zip) echo "=== artifact: ${ARTIFACT}" + # defining environment variables for next step as per https://github.com/actions/starter-workflows/issues/68 echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" - uses: actions/upload-artifact@v1 From 66cf9f0c7a7f93b062b05cb8d4ed5be3d8c5dd41 Mon Sep 17 00:00:00 2001 From: Quinten Krijger Date: Fri, 13 Dec 2019 14:13:50 +0100 Subject: [PATCH 082/100] ci macos: cleanup debug print statement --- .github/workflows/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5f5b93686..bab7397a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,8 +25,6 @@ jobs: make --jobs make DESTDIR="${destDir}" install sudo mv opt/local /usr/local/opt/libiconv - - name: print /usr/local/lib contents - run: ls -al /usr/local/lib - name: cmake env: CMAKE_CXX_STANDARD: 11 From 6b221015001e3f5fbbfe63855cc3746e94562238 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Dec 2019 17:00:50 +0100 Subject: [PATCH 083/100] better white level for FUJIFILM X-A7 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index a3bab58a8..ab42f3d19 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1323,6 +1323,11 @@ Camera constants: "ranges": { "white": 16100 } }, + { // Quality C, bisected from the overexposed region of one pre-release sample file + "make_model": "FUJIFILM X-A7", + "ranges": { "white": 16382 } + }, + { // Quality B "make_model": "FUJIFILM X-A10", "dcraw_matrix": [ 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 ], // DNGv9.12 D65 From 4a25633bd72604535ed9198a21117e7e556ae9c3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Dec 2019 14:35:40 +0100 Subject: [PATCH 084/100] Do not gray out adjusters when automatic is enabled, fixes #5565 --- rtgui/adjuster.cc | 44 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 2267a9fc1..142374213 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -230,22 +230,7 @@ void Adjuster::setDefaultEditedState (EditedState eState) void Adjuster::autoToggled () { - if (!editedCheckBox) { - // If not used in the BatchEditor panel - if (automatic->get_active()) { - // Disable the slider and spin button - spin->set_sensitive(false); - slider->set_sensitive(false); - reset->set_sensitive(false); - } else { - // Enable the slider and spin button - spin->set_sensitive(true); - slider->set_sensitive(true); - reset->set_sensitive(true); - } - } - - if (adjusterListener != nullptr && !blocked) { + if (adjusterListener && !blocked) { adjusterListener->adjusterAutoToggled(this); } } @@ -380,6 +365,9 @@ void Adjuster::spinChanged () if (adjusterListener && !blocked) { if (!buttonReleaseSlider.connected() || afterReset) { eventPending = false; + if (automatic) { + setAutoValue(false); + } adjusterListener->adjusterChanged(this, spin->get_value()); } else { eventPending = true; @@ -419,6 +407,9 @@ void Adjuster::sliderChanged () if (adjusterListener && !blocked) { if (!buttonReleaseSlider.connected() || afterReset) { eventPending = false; + if (automatic) { + setAutoValue(false); + } adjusterListener->adjusterChanged(this, spin->get_value()); } else { eventPending = true; @@ -459,21 +450,6 @@ void Adjuster::setAutoValue (bool a) const bool oldVal = autoChange.block(true); automatic->set_active(a); autoChange.block(oldVal); - - if (!editedCheckBox) { - // If not used in the BatchEditor panel - if (a) { - // Disable the slider and spin button - spin->set_sensitive(false); - slider->set_sensitive(false); - reset->set_sensitive(false); - } else { - // Enable the slider and spin button - spin->set_sensitive(true); - slider->set_sensitive(true); - reset->set_sensitive(true); - } - } } } @@ -481,6 +457,9 @@ bool Adjuster::notifyListener () { if (eventPending && adjusterListener != nullptr && !blocked) { + if (automatic) { + setAutoValue(false); + } adjusterListener->adjusterChanged(this, spin->get_value()); } @@ -571,6 +550,9 @@ void Adjuster::showEditedCB () void Adjuster::editedToggled () { if (adjusterListener && !blocked) { + if (automatic) { + setAutoValue(false); + } adjusterListener->adjusterChanged(this, spin->get_value()); } From d6f65dc8e22262e331c2e0553aaf3acb3f4c2e6a Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 16 Dec 2019 23:42:48 +0100 Subject: [PATCH 085/100] Added help button to main menu #5566 Opens RawPedia in the default URI handler --- rtdata/languages/default | 1 + rtgui/rtwindow.cc | 20 +++++++++++++++++--- rtgui/rtwindow.h | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index da4d5c804..5004bf25c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -225,6 +225,7 @@ GENERAL_DISABLED;Disabled GENERAL_ENABLE;Enable GENERAL_ENABLED;Enabled GENERAL_FILE;File +GENERAL_HELP;Help GENERAL_LANDSCAPE;Landscape GENERAL_NA;n/a GENERAL_NO;No diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 5ab3ab85d..7f3c409a6 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -383,8 +383,13 @@ RTWindow::RTWindow () iccProfileCreator->set_tooltip_markup (M ("MAIN_BUTTON_ICCPROFCREATOR")); iccProfileCreator->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showICCProfileCreator) ); - //Gtk::LinkButton* rtWeb = Gtk::manage (new Gtk::LinkButton ("http://rawtherapee.com")); // unused... but fail to be linked anyway !? - //Gtk::Button* preferences = Gtk::manage (new Gtk::Button (M("MAIN_BUTTON_PREFERENCES")+"...")); + Gtk::Button* helpBtn = Gtk::manage (new Gtk::Button ()); + setExpandAlignProperties (helpBtn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + helpBtn->set_relief(Gtk::RELIEF_NONE); + helpBtn->set_image (*Gtk::manage (new RTImage ("info.png"))); + helpBtn->set_tooltip_markup (M ("GENERAL_HELP")); + helpBtn->signal_clicked().connect (sigc::mem_fun (*this, &RTWindow::showRawPedia)); + Gtk::Button* preferences = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (preferences, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); preferences->set_relief(Gtk::RELIEF_NONE); @@ -392,7 +397,6 @@ RTWindow::RTWindow () preferences->set_tooltip_markup (M ("MAIN_BUTTON_PREFERENCES")); preferences->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showPreferences) ); - //btn_fullscreen = Gtk::manage( new Gtk::Button(M("MAIN_BUTTON_FULLSCREEN"))); btn_fullscreen = Gtk::manage ( new Gtk::Button()); setExpandAlignProperties (btn_fullscreen, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); btn_fullscreen->set_relief(Gtk::RELIEF_NONE); @@ -414,6 +418,7 @@ RTWindow::RTWindow () actionGrid->set_orientation (Gtk::ORIENTATION_VERTICAL); actionGrid->attach_next_to (prProgBar, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_BOTTOM, 1, 1); + actionGrid->attach_next_to (*helpBtn, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_BOTTOM, 1, 1); mainNB->set_action_widget (actionGrid, Gtk::PACK_END); @@ -422,6 +427,7 @@ RTWindow::RTWindow () actionGrid->set_orientation (Gtk::ORIENTATION_HORIZONTAL); actionGrid->attach_next_to (prProgBar, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_RIGHT, 1, 1); + actionGrid->attach_next_to (*helpBtn, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_RIGHT, 1, 1); mainNB->set_action_widget (actionGrid, Gtk::PACK_END); @@ -913,6 +919,14 @@ void RTWindow::writeToolExpandedStatus (std::vector &tpOpen) } +void RTWindow::showRawPedia() +{ + const Glib::ustring& uri = "https://rawpedia.rawtherapee.com/"; + guint32 err = 0; + RTWindow *rtWin = this; + rtWin->show_uri(uri, err); +} + void RTWindow::showICCProfileCreator () { ICCProfileCreator *iccpc = new ICCProfileCreator (this); diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 100ddf636..4791ac6c1 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -90,6 +90,7 @@ public: bool on_window_state_event (GdkEventWindowState* event) override; void on_mainNB_switch_page (Gtk::Widget* widget, guint page_num); + void showRawPedia(); void showICCProfileCreator (); void showPreferences (); void on_realize () override; From 9a0cae035753922db32398b42a1b0600b31aba04 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 16 Dec 2019 23:47:54 +0100 Subject: [PATCH 086/100] Clear progress bar when opening in external editor The last step remained visible in the progress bar when invoking the external editor. Fixes #5475 --- rtgui/editorpanel.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 1b5ed3fa7..806af8b2e 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2067,6 +2067,7 @@ bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagef { img->free (); int errore = pc->returnValue(); + setProgressState(false); delete pc; if (!errore) { From abac9856e7c17ce5ff5e4c2477eaa58c1b64a207 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 17 Dec 2019 00:44:01 +0100 Subject: [PATCH 087/100] Apply internal default profile (neutral) instead of user defined default profiles for missing parts of existing profile when loading a raw file which already has a .pp3, fixes #5564 --- rtgui/thumbnail.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index bcf578143..5295b9d61 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -341,34 +341,31 @@ void Thumbnail::notifylisterners_procParamsChanged(int whoChangedIt) * the Preferences). * * The result is a complete ProcParams with default values merged with the values - * from the default Raw or Image ProcParams, then with the values from the loaded - * ProcParams (sidecar or cache file). - */ + * from the loaded ProcParams (sidecar or cache file). +*/ void Thumbnail::loadProcParams () { MyMutex::MyLock lock(mutex); pparamsValid = false; pparams->setDefaults(); - const PartialProfile *defaultPP = ProfileStore::getInstance()->getDefaultPartialProfile(getType() == FT_Raw); - defaultPP->applyTo(pparams.get()); if (options.paramsLoadLocation == PLL_Input) { // try to load it from params file next to the image file - int ppres = pparams->load (fname + paramFileExtension); + const int ppres = pparams->load(fname + paramFileExtension); pparamsValid = !ppres && pparams->ppVersion >= 220; // if no success, try to load the cached version of the procparams if (!pparamsValid) { - pparamsValid = !pparams->load (getCacheFileName ("profiles", paramFileExtension)); + pparamsValid = !pparams->load(getCacheFileName("profiles", paramFileExtension)); } } else { // try to load it from cache - pparamsValid = !pparams->load (getCacheFileName ("profiles", paramFileExtension)); + pparamsValid = !pparams->load(getCacheFileName("profiles", paramFileExtension)); // if no success, try to load it from params file next to the image file if (!pparamsValid) { - int ppres = pparams->load (fname + paramFileExtension); + const int ppres = pparams->load(fname + paramFileExtension); pparamsValid = !ppres && pparams->ppVersion >= 220; } } From 56de2e7a0736642a7a6b695b1efc894fc28e868a Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 17 Dec 2019 10:38:04 +0100 Subject: [PATCH 088/100] Help button - new icon, simplified code #5567 --- rtdata/images/svg/questionmark.svg | 122 +++++++++++++++++++++++++++++ rtgui/rtwindow.cc | 7 +- 2 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 rtdata/images/svg/questionmark.svg diff --git a/rtdata/images/svg/questionmark.svg b/rtdata/images/svg/questionmark.svg new file mode 100644 index 000000000..4c4b59590 --- /dev/null +++ b/rtdata/images/svg/questionmark.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + ? + + + + diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 7f3c409a6..4c6dc753f 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -386,7 +386,7 @@ RTWindow::RTWindow () Gtk::Button* helpBtn = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (helpBtn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); helpBtn->set_relief(Gtk::RELIEF_NONE); - helpBtn->set_image (*Gtk::manage (new RTImage ("info.png"))); + helpBtn->set_image (*Gtk::manage (new RTImage ("questionmark.png"))); helpBtn->set_tooltip_markup (M ("GENERAL_HELP")); helpBtn->signal_clicked().connect (sigc::mem_fun (*this, &RTWindow::showRawPedia)); @@ -921,10 +921,7 @@ void RTWindow::writeToolExpandedStatus (std::vector &tpOpen) void RTWindow::showRawPedia() { - const Glib::ustring& uri = "https://rawpedia.rawtherapee.com/"; - guint32 err = 0; - RTWindow *rtWin = this; - rtWin->show_uri(uri, err); + show_uri("https://rawpedia.rawtherapee.com/", GDK_CURRENT_TIME); } void RTWindow::showICCProfileCreator () From 5e0ad767ad27bd73fbf67fa85f939c2529400be8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 18 Dec 2019 13:16:37 +0100 Subject: [PATCH 089/100] Capture sharpening: fix wrong calculation for radius > 0.84 --- rtengine/capturesharpening.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 281a2ad71..f991400e5 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -181,7 +181,7 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + - c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -250,7 +250,7 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int t const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + - c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + From 3a207dace71f4380185b2b86e758084df299f49a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 18 Dec 2019 17:33:41 +0100 Subject: [PATCH 090/100] Some optimizations for capture sharpening --- rtengine/capturesharpening.cc | 40 +++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index f991400e5..d2bb6b351 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -152,7 +152,7 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 2; j < tileSize - 2; ++j) { - const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + const float val = c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -178,10 +178,10 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 3; j < tileSize - 3; ++j) { - const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + const float val = c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + - c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -221,7 +221,7 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 2; j < tileSize - 2; ++j) { - const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + const float val = c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -247,10 +247,10 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int t for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 3; j < tileSize - 3; ++j) { - const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + const float val = c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + - c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -563,19 +563,25 @@ BENCHFUN // fill tiles if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column + float maxVal = 0.f; if (checkIterStop) { - float maxVal = 0.f; for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj] * 0.5f; maxVal = std::max(maxVal, clipmask[ii][jj]); } } - if (maxVal < minBlend) { - // no pixel of the tile has a blend factor >= minBlend => skip the tile - continue; + } else { + for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { + maxVal = std::max(maxVal, clipmask[ii][jj]); + } } } + if (maxVal < minBlend) { + // no pixel of the tile has a blend factor >= minBlend => skip the tile + continue; + } for (int k = 0, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize; ++l, ++jj) { tmpIThr[k][l] = oldLuminance[ii][jj]; @@ -583,19 +589,25 @@ BENCHFUN } } } else { + float maxVal = 0.f; if (checkIterStop) { - float maxVal = 0.f; for (int ii = 0; ii < tileSize; ++ii) { for (int jj = 0; jj < tileSize; ++jj) { iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj] * 0.5f; maxVal = std::max(maxVal, clipmask[i + ii][j + jj]); } } - if (maxVal < minBlend) { - // no pixel of the tile has a blend factor >= minBlend => skip the tile - continue; + } else { + for (int ii = 0; ii < tileSize; ++ii) { + for (int jj = 0; jj < tileSize; ++jj) { + maxVal = std::max(maxVal, clipmask[i + ii][j + jj]); + } } } + if (maxVal < minBlend) { + // no pixel of the tile has a blend factor >= minBlend => skip the tile + continue; + } for (int ii = i; ii < i + fullTileSize; ++ii) { for (int jj = j; jj < j + fullTileSize; ++jj) { tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; From 765499bf5568d000af567a1aa850a544d3b9bb1e Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Thu, 19 Dec 2019 20:46:35 -0500 Subject: [PATCH 091/100] Fix doxygen typo and other various typos --- rtengine/cJSON.h | 2 +- rtengine/camconst.cc | 2 +- rtengine/color.h | 2 +- rtengine/improcfun.cc | 2 +- rtgui/cropwindow.cc | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rtengine/cJSON.h b/rtengine/cJSON.h index 786dd2e0e..49fd67b72 100644 --- a/rtengine/cJSON.h +++ b/rtengine/cJSON.h @@ -195,7 +195,7 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); /* Create a string where valuestring references a string so * it will not be freed by cJSON_Delete */ CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); -/* Create an object/arrray that only references it's elements so +/* Create an object/array that only references it's elements so * they will not be freed by cJSON_Delete */ CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index e8f7b1cbf..d136d6a21 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -253,7 +253,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) } if (i % 4 != 0) { - fprintf(stderr, "\"masked_areas\" array length must be divisable by 4\n"); + fprintf(stderr, "\"masked_areas\" array length must be divisible by 4\n"); goto parse_error; } } diff --git a/rtengine/color.h b/rtengine/color.h index d9c344c27..ec2f17e6f 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1372,7 +1372,7 @@ public: * @param HH hue before [-PI ; +PI] * @param Chprov1 chroma after [0 ; 180 (can be superior)] * @param CC chroma before [0 ; 180] - * @param corectionHuechroma hue correction depending on chromaticity (saturation), in radians [0 ; 0.45] (return value) + * @param correctionHuechroma hue correction depending on chromaticity (saturation), in radians [0 ; 0.45] (return value) * @param correctlum hue correction depending on luminance (brightness, contrast,...), in radians [0 ; 0.45] (return value) * @param munsDbgInfo (Debug target only) object to collect information */ diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index cb0834570..59fb0f016 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5590,7 +5590,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double whiteclipg = CurveFactory::igamma2 ((float) (whiteclipg / 65535.0)) * 65535.0; //need to inverse gamma transform to get correct exposure compensation parameter - //corection with gamma + //correction with gamma black = (int) ((65535 * black) / whiteclipg); //expcomp = log(65535.0 / (whiteclipg)) / log(2.0); diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index b00032191..0a9b81112 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1492,9 +1492,9 @@ void CropWindow::expose (Cairo::RefPtr cr) const float kernel_size2 = SQR(2.f * blur_radius2 + 1.f); // count of pixels in the small blur kernel const float rkernel_size2 = 1.0f / kernel_size2; // reciprocal of kernel_size to avoid divisions - // aloocate buffer for precalculated Luminance + // allocate buffer for precalculated Luminance float* tmpL = (float*)malloc(bHeight * bWidth * sizeof(float) ); - // aloocate buffers for sums and sums of squares of small kernel + // allocate buffers for sums and sums of squares of small kernel float* tmpLsum = (float*)malloc((bHeight) * (bWidth) * sizeof(float) ); float* tmpLsumSq = (float*)malloc((bHeight) * (bWidth) * sizeof(float) ); float* tmpstdDev2 = (float*)malloc((bHeight) * (bWidth) * sizeof(float) ); @@ -1631,7 +1631,7 @@ void CropWindow::expose (Cairo::RefPtr cr) && stdDev_L2 > stdDev_L //this is the key to select fine detail within lower contrast on larger scale && stdDev_L > focus_threshby10 //options.highlightThreshold ) { - // transpareny depends on sdtDev_L2 and maxstdDev_L2 + // transparency depends on sdtDev_L2 and maxstdDev_L2 float transparency = 1.f - std::min(stdDev_L2 / maxstdDev_L2, 1.0f) ; // first row of circle guint8* currtmp = &curr[0] + (-3 * pixRowStride); From c5d2e00ba32353a4361ac0af1221cce6d4c9dc9b Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Fri, 20 Dec 2019 06:06:52 -0500 Subject: [PATCH 092/100] Fixed previous commit per review feedback --- rtengine/color.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/color.h b/rtengine/color.h index ec2f17e6f..211615de1 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1372,7 +1372,7 @@ public: * @param HH hue before [-PI ; +PI] * @param Chprov1 chroma after [0 ; 180 (can be superior)] * @param CC chroma before [0 ; 180] - * @param correctionHuechroma hue correction depending on chromaticity (saturation), in radians [0 ; 0.45] (return value) + * @param correctionHueChroma hue correction depending on chromaticity (saturation), in radians [0 ; 0.45] (return value) * @param correctlum hue correction depending on luminance (brightness, contrast,...), in radians [0 ; 0.45] (return value) * @param munsDbgInfo (Debug target only) object to collect information */ From 7f425e7fe64e0aa5917cc49594b37cde9fab1c9e Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Fri, 20 Dec 2019 06:07:52 -0500 Subject: [PATCH 093/100] Found a few more typos --- rtgui/editwidgets.h | 2 +- rtgui/options.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index 55b4ca3cc..0fa7a91bf 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -55,7 +55,7 @@ class RTSurface; * - drag1 * - button1Released * - * Actually, only curves does use this class, and everything is handled for curve implementor (as much as possible). + * Actually, only curves does use this class, and everything is handled for curve implementer (as much as possible). * See the curve's class documentation to see how to implement the curve's pipette feature. * * ### Event handling diff --git a/rtgui/options.cc b/rtgui/options.cc index f5b6b5b60..dcb16e1ea 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -225,7 +225,7 @@ Glib::ustring Options::getPreferredProfilePath() * *@param profName path + filename of the procparam to look for. A filename without path can be provided for backward compatibility. * In this case, this parameter will be updated with the new format. - *@return Send back the absolute path of the given filename or "Neutral" if "Neutral" has been set to profName. Implementor will have + *@return Send back the absolute path of the given filename or "Neutral" if "Neutral" has been set to profName. Implementer will have * to test for this particular value. If the absolute path is invalid (e.g. the file doesn't exist), it will return an empty string. */ Glib::ustring Options::findProfilePath(Glib::ustring &profName) From bd6088837c99b95f9a9c53fdd5ff4990f1c550c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 20 Dec 2019 13:34:37 +0100 Subject: [PATCH 094/100] Fix crash on `DCraw::data_error` (fixes #5571) --- rtengine/dcraw.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index d5348286c..812f122b3 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -4433,6 +4433,10 @@ void CLASS foveon_interpolate() void CLASS crop_masked_pixels() { + if (data_error) { + return; + } + int row, col; unsigned r, c, m, mblack[8], zero, val; From 5face2e4499c93422ca907f1966dc7d7d5cd75ec Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 20 Dec 2019 17:44:51 +0100 Subject: [PATCH 095/100] buildBlendMask: remove multiplication by amount as amount always was 1 --- rtengine/capturesharpening.cc | 4 ++-- rtengine/dual_demosaic_RT.cc | 2 +- rtengine/ipsharpen.cc | 2 +- rtengine/rt_algo.cc | 11 +++++------ rtengine/rt_algo.h | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index d2bb6b351..e5bfde555 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -800,7 +800,7 @@ BENCHFUN } array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask); + buildBlendMask(L, blend, W, H, contrast, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } @@ -849,7 +849,7 @@ BENCHFUN } // calculate contrast based blend factors to reduce sharpening in regions with low contrast array2D& blend = clipMask; // we can share blend and clipMask buffer here - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask); + buildBlendMask(L, blend, W, H, contrast, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 69d1a189a..93508808c 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -105,7 +105,7 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams JaggedArray blend(winw, winh); float contrastf = contrast / 100.f; - buildBlendMask(L, blend, winw, winh, contrastf, 1.f, autoContrast); + buildBlendMask(L, blend, winw, winh, contrastf, autoContrast); contrast = contrastf * 100.f; array2D& redTmp = L; // L is not needed anymore => reuse it diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index a35476d3a..7198b76c5 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -256,7 +256,7 @@ void ImProcFunctions::sharpening (LabImage* lab, const procparams::SharpeningPar // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); float contrast = sharpenParam.contrast / 100.f; - buildBlendMask(lab->L, blend, W, H, contrast, 1.f); + buildBlendMask(lab->L, blend, W, H, contrast); if(showMask) { #ifdef _OPENMP diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 79a7c3679..a5b48af95 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -299,7 +299,7 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& maxOut = rtengine::LIM(maxOut, minVal, maxVal); } -void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast, float ** clipMask) { +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, bool autoContrast, float ** clipMask) { if (autoContrast) { constexpr float minLuminance = 2000.f; @@ -403,7 +403,7 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, if(contrastThreshold == 0.f) { for(int j = 0; j < H; ++j) { for(int i = 0; i < W; ++i) { - blend[j][i] = amount; + blend[j][i] = 1.f; } } } else { @@ -415,7 +415,6 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, #ifdef __SSE2__ const vfloat contrastThresholdv = F2V(contrastThreshold); const vfloat scalev = F2V(scale); - const vfloat amountv = F2V(amount); #endif #ifdef _OPENMP #pragma omp for schedule(dynamic,16) @@ -429,14 +428,14 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; - STVFU(blend[j][i], LVFU(clipMask[j][i]) * amountv * calcBlendFactor(contrastv, contrastThresholdv)); + STVFU(blend[j][i], LVFU(clipMask[j][i]) * calcBlendFactor(contrastv, contrastThresholdv)); } } else { for(; i < W - 5; i += 4) { vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; - STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv)); + STVFU(blend[j][i], calcBlendFactor(contrastv, contrastThresholdv)); } } #endif @@ -445,7 +444,7 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) + rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale; - blend[j][i] = (clipMask ? clipMask[j][i] : 1.f) * amount * calcBlendFactor(contrast, contrastThreshold); + blend[j][i] = (clipMask ? clipMask[j][i] : 1.f) * calcBlendFactor(contrast, contrastThreshold); } } diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index 5485346c7..81147fd75 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -24,5 +24,5 @@ namespace rtengine { void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); -void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false, float ** clipmask = nullptr); +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, bool autoContrast = false, float ** clipmask = nullptr); } From c75cc322686341c4c7159895e80caa13aa2f3378 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 23 Dec 2019 12:41:36 +0100 Subject: [PATCH 096/100] Japanese translation updated by Yz2house Closes #5576 --- rtdata/languages/Japanese | 86 +++++++++++++++------------------------ 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 91ef2e931..588a817f2 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -8,30 +8,6 @@ #08 2012-12-22 a3novy #09 2013-04-01 a3novy #10 2013-04-19 a3novy -#11 2013-09-10 firefly -#12 2013-10-28 firefly -#13 2014-01-07 firefly -#14 2014-01-15 firefly -#15 2014-02-25 firefly -#16 2014-04-07 firefly -#17 2014-04-08 firefly -#18 2014-05-16 firefly -#19 2014-07-13 firefly -#20 2014-07-24 firefly -#21 2014-09-11 firefly -#22 2014-10-21 firefly -#23 2014-11-07 firefly -#24 2014-11-18 firefly -#25 2015-01-05 firefly -#26 2015-02-17 firefly -#27 2015-02-21 firefly -#28 2015-03-03 firefly -#29 2015-04-20 firefly -#30 2015-05-01 firefly -#31 2015-05-31 firefly -#32 2015-06-13 firefly -#33 2015-07-20 firefly -#34 2015-08-12 firefly ABOUT_TAB_BUILD;バージョン ABOUT_TAB_CREDITS;クレジット @@ -49,7 +25,7 @@ CURVEEDITOR_CURVE;カーブ CURVEEDITOR_CURVES;カーブ CURVEEDITOR_CUSTOM;カスタム CURVEEDITOR_DARKS;ダーク -CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力を編集出来ます\n\n編集したいカーブ上のポイントを右クリックします\n編集を無効にする場合はポイント以外の部分んで右クリックします +CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力を編集出来ます\n\n編集したいカーブ上のポイントを右クリックします\n編集を無効にする場合はポイント以外の部分で右クリックします CURVEEDITOR_HIGHLIGHTS;ハイライト CURVEEDITOR_LIGHTS;ライト CURVEEDITOR_LINEAR;リニア @@ -489,8 +465,8 @@ HISTORY_MSG_205;CAM02 ホット/バッドピクセル HISTORY_MSG_206;CAT02 - 自動で順応 HISTORY_MSG_207;フリンジ低減 - 色相カーブ HISTORY_MSG_208;ブルー/レッド イコライザ -HISTORY_MSG_210;グラデーションフィルター - 角度 -HISTORY_MSG_211;グラデーションフィルター +HISTORY_MSG_210;減光フィルター - 角度 +HISTORY_MSG_211;減光フィルター HISTORY_MSG_212;ビネットフィルター - 強さ HISTORY_MSG_213;ビネットフィルター HISTORY_MSG_214;白黒 @@ -517,10 +493,10 @@ HISTORY_MSG_234;白黒 ‘後の‘カーブのタイプ HISTORY_MSG_235;白黒 チャンネルミキサー 自動 HISTORY_MSG_236;--未使用-- HISTORY_MSG_237;白黒 チャンネルミキサー -HISTORY_MSG_238;グラデーションフィルター フェザー処理 -HISTORY_MSG_239;グラデーションフィルター 強さ -HISTORY_MSG_240;グラデーションフィルター 中央 -HISTORY_MSG_241;ビネットフィルター フェザー処理 +HISTORY_MSG_238;減光フィルター フェザー +HISTORY_MSG_239;減光フィルター 強さ +HISTORY_MSG_240;減光フィルター 中央 +HISTORY_MSG_241;ビネットフィルター フェザー HISTORY_MSG_242;ビネットフィルター 形状 HISTORY_MSG_243;半径 HISTORY_MSG_244;ビネットフィルター 強さ @@ -757,6 +733,7 @@ HISTORY_MSG_490;DRC - 量 HISTORY_MSG_491;ホワイトバランス HISTORY_MSG_492;RGBカーブ HISTORY_MSG_493;L*a*b*調整 +HISTORY_MSG_494;キャプチャーシャープニング HISTORY_MSG_CLAMPOOG;色域外の色を切り取る HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正 HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正 @@ -774,6 +751,7 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - マスクの表示 HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - スロープ HISTORY_MSG_DEHAZE_DEPTH;霞除去 - 深度 HISTORY_MSG_DEHAZE_ENABLED;霞除去 +HISTORY_MSG_DEHAZE_LUMINANCE;霞除去 - 輝度のみ HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 @@ -794,6 +772,13 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;ローカルコントラスト - 明るい HISTORY_MSG_LOCALCONTRAST_RADIUS;ローカルコントラスト - 半径 HISTORY_MSG_METADATA_MODE;メタデータ コピーモード HISTORY_MSG_MICROCONTRAST_CONTRAST;マイクロコントラスト - コントラストのしきい値 +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - しきい値の自動設定 +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - シグマの自動設定 +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - 繰り返しの自動制限 +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - コントラストのしきい値 +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - 繰り返し +HISTORY_MSG_PDSHARPEN_RADIUS;CS - シグマ +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - 周辺のシグマを増やす HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 振れに対するデモザイクの方式 HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;ラインノイズフィルタの方向 HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ @@ -960,8 +945,8 @@ MAIN_TOOLTIP_BACKCOLOR2;プレビューの背景色を指定します: 中間のグレー\nショートカット: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;固定 / 固定解除 - 補正前 の表示設定\n\n固定: 補正前をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n固定解除: 現在使用のツールの効果が 補正後 に表示され、その1段階前が 補正前 に表示されます MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: l -MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: > -MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: < +MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: < +MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: > MAIN_TOOLTIP_PREVIEWB;ブルー チャンネル表示\nショートカット: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;フォーカス・マスク表示\nショートカット: Shift-f\n\n浅い被写界深度、低ノイズ、高ズームの画像の場合は、より正確に\n\nノイズの多い画像に対しては、検出精度を向上させるため10から30%縮小して評価します\n\nフォーカス・マスクをオンにすると表示に時間が掛かります MAIN_TOOLTIP_PREVIEWG;グリーン チャンネル表示\nショートカット: g @@ -1023,7 +1008,7 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;フラットフィールド ぼかし半径 PARTIALPASTE_FLATFIELDBLURTYPE;フラットフィールド ぼかしタイプ PARTIALPASTE_FLATFIELDCLIPCONTROL;フラットフィールド クリップコントロール PARTIALPASTE_FLATFIELDFILE;フラットフィールド ファイル -PARTIALPASTE_GRADIENT;グラデーションフィルター +PARTIALPASTE_GRADIENT;減光フィルター PARTIALPASTE_HSVEQUALIZER;HSV イコライザ PARTIALPASTE_ICMSETTINGS;ICM 設定 PARTIALPASTE_IMPULSEDENOISE;インパルス・ノイズ低減 @@ -1562,6 +1547,7 @@ TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 TP_DEHAZE_DEPTH;深度 TP_DEHAZE_LABEL;霞除去 +TP_DEHAZE_LUMINANCE;輝度のみ TP_DEHAZE_SHOW_DEPTH_MAP;深度マップの表示 TP_DEHAZE_STRENGTH;強さ TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式) @@ -1672,9 +1658,9 @@ TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント TP_FILMNEGATIVE_BLUE;ブルーの比率 TP_FILMNEGATIVE_GREEN;参考指数(コントラスト) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +TP_FILMNEGATIVE_GUESS_TOOLTIP;原画像の中で色相がニュートラルな部分2か所をピックすることでレッドとブルーの比率を自動で設定します。明るさが異なる2か所をピックします。その後、ホワイトバランスを設定します。 TP_FILMNEGATIVE_LABEL;ネガフィルム -TP_FILMNEGATIVE_PICK;Pick neutral spots +TP_FILMNEGATIVE_PICK;ニュートラルなポイントをピック TP_FILMNEGATIVE_RED;レッドの比率 TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? @@ -1698,9 +1684,9 @@ TP_GRADIENT_CENTER_Y;中央 Y軸 TP_GRADIENT_CENTER_Y_TOOLTIP;アンカーポイントの位置 y軸: -100=上端, 0=中央, +100=下端 TP_GRADIENT_DEGREE;角度 TP_GRADIENT_DEGREE_TOOLTIP;回転角度の度数 -TP_GRADIENT_FEATHER;フェザー処理 -TP_GRADIENT_FEATHER_TOOLTIP;対角線に対するグラデーションの幅の割合 -TP_GRADIENT_LABEL;グラデーションフィルター +TP_GRADIENT_FEATHER;フェザー +TP_GRADIENT_FEATHER_TOOLTIP;対角線に対する減光の幅の割合 +TP_GRADIENT_LABEL;減光フィルター TP_GRADIENT_STRENGTH;強さ TP_GRADIENT_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ TP_HLREC_BLEND;ブレンド @@ -1817,13 +1803,14 @@ TP_METADATA_STRIP;メタデータを全て取り除く TP_METADATA_TUNNEL;変更なしでコピー TP_NEUTRAL;リセット TP_NEUTRAL_TIP;露光量補正のスライダー値をニュートラルにリセットします。\n自動露光補正の調整値ついても同様にリセットされます -TP_PCVIGNETTE_FEATHER;フェザー処理 -TP_PCVIGNETTE_FEATHER_TOOLTIP;フェザー処理: 0=四隅だけ、50=中央までの半分、100=中央まで +TP_PCVIGNETTE_FEATHER;フェザー +TP_PCVIGNETTE_FEATHER_TOOLTIP;フェザー: 0=四隅だけ、50=中央までの半分、100=中央まで TP_PCVIGNETTE_LABEL;ビネットフィルター TP_PCVIGNETTE_ROUNDNESS;フィルター形状 TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;形状: 0=長方形、50=楕円形、100=円形 TP_PCVIGNETTE_STRENGTH;強さ TP_PCVIGNETTE_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ(四隅) +TP_PDSHARPENING_LABEL;キャプチャーシャープニング TP_PERSPECTIVE_HORIZONTAL;水平 TP_PERSPECTIVE_LABEL;パースペクティブ TP_PERSPECTIVE_VERTICAL;垂直 @@ -2054,10 +2041,12 @@ TP_SHARPENING_EDRADIUS;半径 TP_SHARPENING_EDTOLERANCE;エッジ許容 TP_SHARPENING_HALOCONTROL;ハロ抑制 TP_SHARPENING_HCAMOUNT;適用量 +TP_SHARPENING_ITERCHECK;繰り返しの自動制限 TP_SHARPENING_LABEL;シャープニング TP_SHARPENING_METHOD;方式 TP_SHARPENING_ONLYEDGES;エッジのみシャープニング TP_SHARPENING_RADIUS;半径 +TP_SHARPENING_RADIUS_BOOST;周辺のシグマを増やす TP_SHARPENING_RLD;RL デコンボリューション TP_SHARPENING_RLD_AMOUNT;適用量 TP_SHARPENING_RLD_DAMPING;減衰 @@ -2311,6 +2300,7 @@ TP_WBALANCE_TUNGSTEN;タングステン TP_WBALANCE_WATER1;水中 1 TP_WBALANCE_WATER2;水中 2 TP_WBALANCE_WATER_HEADER;水中 +The last update by firefly 2019-12-21 ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;新規ディテール ウィンドウを開く ZOOMPANEL_ZOOM100;100%にズーム\nショートカット: z @@ -2323,16 +2313,4 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_SHARPENING_ITERCHECK;Auto limit iterations -!TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!GENERAL_HELP;Help From 898527732b99107ac7246038cc5ceb0484a33170 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 23 Dec 2019 12:42:19 +0100 Subject: [PATCH 097/100] ./tools/generateTranslationDiffs --- rtdata/languages/Catala | 1 + rtdata/languages/Chinese (Simplified) | 1 + rtdata/languages/Czech | 1 + rtdata/languages/Deutsch | 1 + rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/Espanol | 1 + rtdata/languages/Francais | 1 + rtdata/languages/Italiano | 1 + rtdata/languages/Magyar | 1 + rtdata/languages/Nederlands | 1 + rtdata/languages/Polish | 1 + rtdata/languages/Portugues | 1 + rtdata/languages/Portugues (Brasil) | 1 + rtdata/languages/Russian | 1 + rtdata/languages/Serbian (Cyrilic Characters) | 1 + rtdata/languages/Slovenian | 1 + rtdata/languages/Swedish | 1 + 18 files changed, 18 insertions(+) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 36666a533..31614c7b3 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -977,6 +977,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 89a4dd9b4..5be2958e8 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -973,6 +973,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... !GENERAL_SLIDER;Slider diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 0ce34e3ee..25bcf2820 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2323,6 +2323,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_HELP;Help !HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 9122d5984..592801054 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2390,5 +2390,6 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_HELP;Help !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !TP_SHARPENING_ITERCHECK;Auto limit iterations diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 1fc07391e..e30425b68 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -340,6 +340,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_ENABLE;Enable !GENERAL_ENABLED;Enabled !GENERAL_FILE;File +!GENERAL_HELP;Help !GENERAL_LANDSCAPE;Landscape !GENERAL_NA;n/a !GENERAL_NO;No diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 63dff83da..a1e0050a8 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -226,6 +226,7 @@ !GENERAL_ENABLE;Enable !GENERAL_ENABLED;Enabled !GENERAL_FILE;File +!GENERAL_HELP;Help !GENERAL_LANDSCAPE;Landscape !GENERAL_NA;n/a !GENERAL_NO;No diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 96bce0cdf..ee8b0d17d 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -2321,6 +2321,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_HELP;Help !HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 9d1c6a3f7..9ecf43733 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2266,6 +2266,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_HELP;Help !HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index db09b5d3a..0fd256d7c 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1285,6 +1285,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 43a4ae1e1..4b6f2811b 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -908,6 +908,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 07e40256f..c230323f5 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1982,6 +1982,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... !GENERAL_SLIDER;Slider diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index c923c3bad..4e5d950fc 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1407,6 +1407,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index efe3214f8..789d26cd6 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -2264,6 +2264,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_HELP;Help !HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index e6adf3bc4..d619356a9 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -2269,6 +2269,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!GENERAL_HELP;Help !HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index a4e501a77..4246ecbb6 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1475,6 +1475,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo +!GENERAL_HELP;Help !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_235;B&W - CM - Auto diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 9ec7c998b..7fd0ca378 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1257,6 +1257,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian index b015cb6f1..0afaa83e9 100644 --- a/rtdata/languages/Slovenian +++ b/rtdata/languages/Slovenian @@ -2306,5 +2306,6 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_HELP;Help !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !TP_SHARPENING_ITERCHECK;Auto limit iterations diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 7861f2276..6dbea54d8 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1772,6 +1772,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !GENERAL_CURRENT;Current +!GENERAL_HELP;Help !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... !GENERAL_SLIDER;Slider From c4cf68c6b562253f00e403e4819318d0782a59c3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 24 Dec 2019 19:01:36 +0100 Subject: [PATCH 098/100] Speedup for darkframe subtraction --- rtengine/rawflatfield.cc | 47 +++++++++++++++++++------------------- rtengine/rawimagesource.cc | 27 ++++++++++++++-------- rtengine/rawimagesource.h | 2 +- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index 05b3be408..cbc5e6bd6 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -263,10 +263,9 @@ void cfaboxblur(const float* const * riFlatFile, float* cfablur, int boxH, int b namespace rtengine { -void RawImageSource::processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const unsigned short black[4]) +void RawImageSource::processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const float black[4]) { // BENCHFUN - const float fblack[4] = {static_cast(black[0]), static_cast(black[1]), static_cast(black[2]), static_cast(black[3])}; std::unique_ptr cfablur(new float[H * W]); const int BS = raw.ff_BlurRadius + (raw.ff_BlurRadius & 1); @@ -292,7 +291,7 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const int col = 2 * (W >> 2) + n; const int c = ri->get_colors() != 1 ? FC(row, col) : 0; const int c4 = ri->get_colors() != 1 ? ((c == 1 && !(row & 1)) ? 3 : c) : 0; - refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - fblack[c4]); + refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - black[c4]); } float limitFactor = 1.f; @@ -315,16 +314,16 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra clippedBefore = true; break; } - const float tempval = (rawVal - fblack[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - fblack[c4])); + const float tempval = (rawVal - black[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4])); maxval = std::max(maxval, tempval); } } // now we have the max value for the channel // if it clips, calculate factor to avoid clipping - if (maxval + fblack[c4] >= ri->get_white(c4)) { + if (maxval + black[c4] >= ri->get_white(c4)) { if (!clippedBefore) { - limitFactor = std::min(limitFactor, ri->get_white(c4) / (maxval + fblack[c4])); + limitFactor = std::min(limitFactor, ri->get_white(c4) / (maxval + black[c4])); } else { limitFactor = 1.f; } @@ -361,8 +360,8 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), _mm_set_ps(refcolor[1][1], refcolor[1][0], refcolor[1][1], refcolor[1][0]) }; - const vfloat blackv[2] = {_mm_set_ps(fblack[c4[0][1]], fblack[c4[0][0]], fblack[c4[0][1]], fblack[c4[0][0]]), - _mm_set_ps(fblack[c4[1][1]], fblack[c4[1][0]], fblack[c4[1][1]], fblack[c4[1][0]]) + const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) }; const vfloat onev = F2V(1.f); @@ -389,9 +388,9 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra #endif for (; col < W; ++col) { - const float blur = cfablur[row * W + col] - fblack[c4[row & 1][col & 1]]; + const float blur = cfablur[row * W + col] - black[c4[row & 1][col & 1]]; const float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; - rawData[row][col] = (rawData[row][col] - fblack[c4[row & 1][col & 1]]) * vignettecorr + fblack[c4[row & 1][col & 1]]; + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; } } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { @@ -404,7 +403,7 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const int row = 2 * (H >> 2) + m; const int col = 2 * (W >> 2) + n; const int c = riFlatFile->XTRANSFC(row, col); - refcolor[c] += std::max(0.0f, cfablur[row * W + col] - fblack[c]); + refcolor[c] += std::max(0.0f, cfablur[row * W + col] - black[c]); cCount[c] ++; } @@ -430,14 +429,14 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra clippedBefore = true; break; } - const float tempval = (rawVal - fblack[0]) * (refcolor[ri->XTRANSFC(row, col)] / std::max(1e-5f, cfablur[(row) * W + col] - fblack[0])); + const float tempval = (rawVal - black[0]) * (refcolor[ri->XTRANSFC(row, col)] / std::max(1e-5f, cfablur[(row) * W + col] - black[0])); maxval = std::max(maxval, tempval); } } // there's only one white level for xtrans - if (!clippedBefore && maxval + fblack[0] > ri->get_white(0)) { - limitFactor = ri->get_white(0) / (maxval + fblack[0]); + if (!clippedBefore && maxval + black[0] > ri->get_white(0)) { + limitFactor = ri->get_white(0) / (maxval + black[0]); flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui } } else { @@ -458,9 +457,9 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra for (int row = 0; row < H; ++row) { for (int col = 0; col < W; ++col) { const int c = ri->XTRANSFC(row, col); - const float blur = cfablur[(row) * W + col] - fblack[c]; + const float blur = cfablur[(row) * W + col] - black[c]; const float vignettecorr = blur <= minValue ? 1.f : refcolor[c] / blur; - rawData[row][col] = (rawData[row][col] - fblack[c]) * vignettecorr + fblack[c]; + rawData[row][col] = (rawData[row][col] - black[c]) * vignettecorr + black[c]; } } } @@ -488,8 +487,8 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra } #ifdef __SSE2__ - const vfloat blackv[2] = {_mm_set_ps(fblack[c4[0][1]], fblack[c4[0][0]], fblack[c4[0][1]], fblack[c4[0][0]]), - _mm_set_ps(fblack[c4[1][1]], fblack[c4[1][0]], fblack[c4[1][1]], fblack[c4[1][0]]) + const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) }; const vfloat epsv = F2V(1e-5f); @@ -513,9 +512,9 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra #endif for (; col < W; ++col) { - const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - fblack[c4[row & 1][col & 1]])) / - (std::max(1e-5f, cfablur1[row * W + col] - fblack[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - fblack[c4[row & 1][col & 1]])); - rawData[row][col] = (rawData[row][col] - fblack[c4[row & 1][col & 1]]) * linecorr + fblack[c4[row & 1][col & 1]]; + const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / + (std::max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])); + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; } } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { @@ -526,9 +525,9 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra for (int row = 0; row < H; ++row) { for (int col = 0; col < W; ++col) { const int c = ri->XTRANSFC(row, col); - const float hlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - fblack[c]) / std::max(1e-5f, cfablur1[(row) * W + col] - fblack[c]); - const float vlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - fblack[c]) / std::max(1e-5f, cfablur2[(row) * W + col] - fblack[c]); - rawData[row][col] = (rawData[row][col] - fblack[c]) * hlinecorr * vlinecorr + fblack[c]; + const float hlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur1[(row) * W + col] - black[c]); + const float vlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur2[(row) * W + col] - black[c]); + rawData[row][col] = (rawData[row][col] - black[c]) * hlinecorr * vlinecorr + black[c]; } } } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d00812d88..e7b431141 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -42,7 +42,7 @@ #include "../rtgui/options.h" //#define BENCHMARK -//#include "StopWatch.h" +#include "StopWatch.h" #ifdef _OPENMP #include @@ -2397,11 +2397,10 @@ void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) */ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ) { - // TODO: Change type of black[] to float to avoid conversions - unsigned short black[4] = { - (unsigned short)ri->get_cblack(0), (unsigned short)ri->get_cblack(1), - (unsigned short)ri->get_cblack(2), (unsigned short)ri->get_cblack(3) - }; + const float black[4] = { + static_cast(ri->get_cblack(0)), static_cast(ri->get_cblack(1)), + static_cast(ri->get_cblack(2)), static_cast(ri->get_cblack(3)) + }; if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) { if (!rawData) { @@ -2409,11 +2408,19 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } if (riDark && W == riDark->get_width() && H == riDark->get_height()) { // This works also for xtrans-sensors, because black[0] to black[4] are equal for these + StopWatch Stop1("darkframe subtraction"); for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - int c = FC(row, col); - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; - rawData[row][col] = max(src->data[row][col] + black[c4] - riDark->data[row][col], 0.0f); + const int c0 = FC(row, 0); + const float black0 = black[(c0 == 1 && !(row & 1) ) ? 3 : c0]; + const int c1 = FC(row, 1); + const float black1 = black[(c1 == 1 && !(row & 1) ) ? 3 : c1]; + int col; + for (col = 0; col < W - 1; col += 2) { + rawData[row][col] = max(src->data[row][col] + black0 - riDark->data[row][col], 0.0f); + rawData[row][col + 1] = max(src->data[row][col + 1] + black1 - riDark->data[row][col + 1], 0.0f); + } + if (col < W) { + rawData[row][col] = max(src->data[row][col] + black0 - riDark->data[row][col], 0.0f); } } } else { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 28cf30010..bd460c61b 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -136,7 +136,7 @@ public: return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } - void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const unsigned short black[4]); + void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const float black[4]); void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack From b2cfb457ccff2d3c5887e55fc1bbc57715d374ba Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 24 Dec 2019 19:07:32 +0100 Subject: [PATCH 099/100] multithread darkframe subtraction, #5582 --- rtengine/rawimagesource.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index e7b431141..18fc18f58 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2409,6 +2409,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw if (riDark && W == riDark->get_width() && H == riDark->get_height()) { // This works also for xtrans-sensors, because black[0] to black[4] are equal for these StopWatch Stop1("darkframe subtraction"); +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int row = 0; row < H; row++) { const int c0 = FC(row, 0); const float black0 = black[(c0 == 1 && !(row & 1) ) ? 3 : c0]; From a62b0f8040a1e9cb7fdb49c9ead8ff70176261bb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 28 Dec 2019 13:05:18 +0100 Subject: [PATCH 100/100] Use gtk_show_uri, fixes #5578, thanks to @Floessie for the patch --- rtgui/rtwindow.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 4c6dc753f..514685a16 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -921,7 +921,8 @@ void RTWindow::writeToolExpandedStatus (std::vector &tpOpen) void RTWindow::showRawPedia() { - show_uri("https://rawpedia.rawtherapee.com/", GDK_CURRENT_TIME); + GError* gerror = nullptr; + gtk_show_uri(nullptr, "https://rawpedia.rawtherapee.com/", GDK_CURRENT_TIME, &gerror); } void RTWindow::showICCProfileCreator ()