From f728b87ae8d1102d95a81c5c657042a73a8139eb Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Thu, 20 Jun 2024 15:45:08 +0200 Subject: [PATCH] Full range HDR support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EXR, HDR, JXR and PFM formats support High Dynamic Range images (FP values grater than 1). In summary, here is the list of changes: EXR, HDR, JXR and PFM: When working with FP formats, the clamp between 0 and 1 ​​is no longer done. EXR: Removed old SDR code and conversions. Due to the lack of a QImage Gray FP format, Gray images are output as RGB FP (recently added code for Qt 6.8 has been removed). PFM: Due to the lack of a QImage Gray FP format, Gray images are output as RGB FP. HDR: Added rotation and exposure support. With this patch, EXR, JXR, HDR, PFM behave like Qt's TIFF plugin when working with FP images. --- .gitattributes | 12 + autotests/read/hdr/orientation1.hdr | 47 ++++ autotests/read/hdr/orientation1.hdr.json | 5 + autotests/read/hdr/orientation2.hdr | 47 ++++ autotests/read/hdr/orientation2.hdr.json | 5 + autotests/read/hdr/orientation3.hdr | 47 ++++ autotests/read/hdr/orientation3.hdr.json | 5 + autotests/read/hdr/orientation4.hdr | 47 ++++ autotests/read/hdr/orientation4.hdr.json | 5 + autotests/read/hdr/orientation5.hdr | 47 ++++ autotests/read/hdr/orientation5.hdr.json | 5 + autotests/read/hdr/orientation6.hdr | 47 ++++ autotests/read/hdr/orientation6.hdr.json | 5 + autotests/read/hdr/orientation7.hdr | 47 ++++ autotests/read/hdr/orientation7.hdr.json | 5 + autotests/read/hdr/orientation8.hdr | 47 ++++ autotests/read/hdr/orientation8.hdr.json | 5 + autotests/read/hdr/orientation_all.png | Bin 0 -> 32296 bytes autotests/read/pfm/testcard_gray.png | Bin 7550 -> 17634 bytes autotests/readtest.cpp | 3 +- src/imageformats/exr.cpp | 121 +-------- src/imageformats/hdr.cpp | 315 +++++++++++++++++------ src/imageformats/hdr_p.h | 8 +- src/imageformats/jxr.cpp | 111 +++----- src/imageformats/pfm.cpp | 50 ++-- 25 files changed, 727 insertions(+), 309 deletions(-) create mode 100644 autotests/read/hdr/orientation1.hdr create mode 100644 autotests/read/hdr/orientation1.hdr.json create mode 100644 autotests/read/hdr/orientation2.hdr create mode 100644 autotests/read/hdr/orientation2.hdr.json create mode 100644 autotests/read/hdr/orientation3.hdr create mode 100644 autotests/read/hdr/orientation3.hdr.json create mode 100644 autotests/read/hdr/orientation4.hdr create mode 100644 autotests/read/hdr/orientation4.hdr.json create mode 100644 autotests/read/hdr/orientation5.hdr create mode 100644 autotests/read/hdr/orientation5.hdr.json create mode 100644 autotests/read/hdr/orientation6.hdr create mode 100644 autotests/read/hdr/orientation6.hdr.json create mode 100644 autotests/read/hdr/orientation7.hdr create mode 100644 autotests/read/hdr/orientation7.hdr.json create mode 100644 autotests/read/hdr/orientation8.hdr create mode 100644 autotests/read/hdr/orientation8.hdr.json create mode 100644 autotests/read/hdr/orientation_all.png diff --git a/.gitattributes b/.gitattributes index cd2c2b7..4ddaa1c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,13 @@ autotests/read/raw/RAW_KODAK_C330_FORMAT_NONE_YRGB.raw binary +autotests/read/hdr/orientation1.hdr binary +autotests/read/hdr/orientation2.hdr binary +autotests/read/hdr/orientation3.hdr binary +autotests/read/hdr/orientation4.hdr binary +autotests/read/hdr/orientation5.hdr binary +autotests/read/hdr/orientation6.hdr binary +autotests/read/hdr/orientation7.hdr binary +autotests/read/hdr/orientation8.hdr binary +autotests/read/hdr/fake_earth.hdr binary +autotests/read/hdr/rgb.hdr binary +autotests/read/hdr/rgb-landscape.hdr binary +autotests/read/hdr/rgb-portrait.hdr binary diff --git a/autotests/read/hdr/orientation1.hdr b/autotests/read/hdr/orientation1.hdr new file mode 100644 index 0000000..eac2383 --- /dev/null +++ b/autotests/read/hdr/orientation1.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + +-Y 160 +X 480 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hv}hv}hv}hv}hv}4~ f i jlopqtvwy|}Ew~hv}hv}||2~ eڀڀڀڀڀڀj€tvwz|}pʀဤဤဤ߀̀У p~||߀ߓtppopqᗺ||2~ d倡ڀ܀܀܀j€stvwz|}pʀဦ့ҀЦ€ܹЀ p~||Ҁw]PNKKF?y?zD}GFEIWwڀ||1~+ h ilmoqstvyz|y4 -d p~||ЀsUPG;v1l)e$` [[YXXW["])e0l;tA|Km؀||1}~+ f h jlmoqstwyz|O    -d m~||ԀYQD}0l%`$_#_"]"\ [[YXXWVVUSSRS"]5p>yS܀||1z~* e f h jlmpqsvwyz}n"     -d m~||iRAz-h%a$`$_"]"]"\ [[YXWWVVUSSRQQPOX.i;vf||/w~* e f i jlopqsvwy|}N)       -d m~||ڈUE+f&a%a$`$_"]"]!\ [[YXWWVVUSSRQPPONNLR/j?yƀ||/u~* d e h ijlopqtvwy|}|8         -d m~||߀]O4p'b&a$`$`$_"]"]!\ [Y5mYfqwpm\Fw!\QPPONNLKJJ [6qw||.u~ d e h ijmopstvwz|}T              m~||ڀWC}+f'b&a$`$`#_"]"]"]=tdЀڀ؀ƀK|WNLLKJJIHL)eU||.r~ d f h ilmopstvyz|}g"~               m~||րX:t'b'b&a$`$`#_"]"\'abЀ•4lLKJIIHHGF"]Bz||,p~ e f h ilmoqstwyz|$,--------..E+                 m~||؀W4p'b'b%a$`$`#_"]"\4iƀ〺fOIIHHGFFEV=w||,m~ e f h jlmpqstwyz}܀~                   z~||W0l'b'b%a$`$_#_"]"\HwȒUHHGFFED CO?y||+m~ e f i jlmpqsvwy|}܀܀Y-d                z z z zz~||[1m'b&a%a$`$_#_"]"\GwڣRGFEED C C BQH||+k~ d e f i jlopqtvwy|}܀܀g#| -d           | v!t!p t v x |z~||`:t'b&a%a$`$_#_"]"\5jyIEE D C C B A @[m||+h~ d e h ijmo+++++++倷,,,-@3`-b-b-bO-b-b      ~ v!n j!j!l!n!r t v z |w~||܊D}'b&a%a$`$_"]"]"\&_YE D C B B A @ @ @&aԀ||+h~ d f h ijm++   z n g!c!c!g!i!j!n!p!r t x z |w~||N'b&a%a$`$_"]"]!\ [WƀڀȀЀ܀R C B B A @ @ +? +> B += =Oߓ||(c~ e f h j++Fs -d]Ǝ]9,Ȑ"W![!\!^!a!c!e!g!j!l!n!p t v x | ~u~||D}&a$`$`#_"]"]!\ [Y]ЀʀЀ〬S A @ ? +? +> += < < =5p||(a~ e f h++P ƎEa'ƀ"Y![!\!`!a!c!e!i!j!l!n!r t v z | ~u~||f+f$`$`#_"]"\!\ [YYڀ += < < < <Gߗ||'_~ d e f+1 m/J/J!Y![!^!`!a!c!g!i!j!n!p!r t x z | ~r~||;v$`$`#_"]"\!\[YY*b€w ? +> +> += < < < < < <:t||'_~ d e._m6Ԓ(ڀ!Y!\!^!`!c!e!g!i!l!n!p!r v x z | r~||}+f$_#_"]"\!\[YXXJv΀Ԁ߀ր€΀I +> = < < < < < < <I؀||K} d-`.SEV0A)ܤ![!\!^!a!c!e!g!j!l!n!p t v x | ~ r~||R$_#_"]"\!\[YXXWWȀ瀬W = < < < < < < < < =_||K}/>0>EV0A)ܤ![!\!`!a!c!e!i!j!l!p!r t v z | ~ r~||瀼5p#_"]"\ [[YXXWVi΀Ԁ̀܀߀"] < < < < < < < < < <"]||K}0>0>o}'Ԓ)؀![!^!`!a!c!g!i!j!n!p!r t x z | ~ p}~||ߓ&a"]"\ [[YXWWVVz뀡ဤȀ+e < < < < < < < < < < C̀||K}R~0>0>Ԁ o/J/L!\!^!`!c!e!g!i!l!n!p!r v x z |  rz~||w"[!\ [[YXWWVVUtʀȀڀƀ'b < < < < < < < < < <8||H}K~}}r0>Rd"ؒE`)ƀ!\!^!a!c!e!g!j!l!n!p t v x | ~  pw~||〓 R [YYXWWVVUSb뀟րȀW < < < < < < < < < <l||H}F~}}}}~~EY"/E_v֒_w60Ґ!\!`!a!c!e!i!j!l!p!r t v z | ~  pw~||/]YYXWWVVUSRNw€΀Ȁ߀U < < < < < < < < < <#O}|}|F} j}}}}}}~~ߣ8P$%6Pj؀!^!`!a!c!g!i!j!n!p!r t x z | ~  mw~}|}|aVXWVVVUSRR8i倵ƀؒG < < < < < < < < <7my|y|C}vK~}}}}}}}~~!^!`!c!e!g!i!l!n!p!r v x z |   mu~y|y|々KWVVUUSRRQVƺĀЀƀY < < < < < < < < < <iy|y|C}F~}}}}}}}}}~~~~~}}~~~~in/F/G/H/I/J/K/L/N/O.P.Q!^!a!c!e!g!j!l!n!p t v x | ~   mr~y|y|=bRVUUSRRQPO逡ƀʀ̀Ѐ/j < < < < < < < < <8Bjt|t|C}@~}}}}}}}}}}}}}v}o}h}b}\}V}e}}}}}}}%I&'()*+"Y![!\!`!a!c!e!i!j!l!p!r t v z | ~   mr~t|t|ھЀ5UUSRQQPOO=pƀЀܣN < < < < < < < < <at}|t}|A}^}}}}}}}}}}}}}}y}r}l}e}_}_}v}}}}}y}}}}}m~'()++!Y![!^!`!a!c!g!i!j!n!p!r t x z | ~   mr~t}|t}|7_PSRQQPOONLȗ逤逼7p < < < < < < < < <4Elo}|o}|A}|^}}}}}}}}}}}}}}}r}l}e}b}o}y}y}y}v}v}}}}y}r}o}a~*++!Y!\!^!`!c!e!g!i!l!n!p!r v x z | -d kp~o}|o}|؀/RQQPONNLK2iԀօG < < < < < < < <9"goy|oy|F}@~~}}}}}}}}}}}}}}}}}o}h}l}v}v}v}r}r}r}o}}}}}v}o}e}_}v})O"Y![!\!^!a!c!e!g!j!l!n!p t v x | ~ -d km~oy|oy|Lt,PPONNLKJJfȀڀ%a < < < < < < < < <Vky|ky|P}}~}}}}}}}}}}}}}}y}y}y}v}l}r}r}r}r}o}o}o}l}l}}}v}o}h}b}\}S}P}}"W!\!`!a!c!e!i!j!l!p!r t v z | ~ -d hm~ky|ky|BGONNLKJJIKҐĀ܀瀾=v +? < < < < < < < <cpkt|kt|P}}~}}}}}}}}}}y}y}y}v}v}v}r}r}}r}o}o}l}l}l}h}h}h}}}y}r}l}e}\}V}P}N}H}}k~!^!a!e!g!i!j!n!p!r t x z | ~ -d hm~kt|kt|΀.zILLKJJIHHSȀʀȀS +? < < < < < < < <7/v{{N}}~}}}}}}y}y}y}v}v}v}r}r}r}o}o}o}}}y}l}h}h}e}e}b}b}y}v}l}e}_}Y}S}K}||}}}]~!e!g!i!l!n!p!r v x z ~  -d hk~{{М%pHKJJIHHGFR؎ڀ€؀܀;t B < < < < < < < <7YЀ{{K}}}r}r}o}o}o}l}l}l}h}h}}}}y}h}b}b}_}_}_}r}o}h}b}\}N}||||}}}}}'\!j!l!n!p t vmңңңң€ܷЀ hh~{{Ȇ#iFIIHHGFFEG_ҀĀԀܚ+f +? < < < < < < < <7TΤ{{K}v}o}l}l}l}h}h}h}e}e}e}}}y}r}l}e}\}\}\}Y}o}l}b}V}||||H}H}}}}}}}_h~ e!p!r t vmңңң€ң€ң€ң€ fh~{{icBHHGFFED C CWq΀ĀĀ̀܀ߦ€BzG < < < < < < < < <cT̗{{H}r}r}o}o}o}l}l}l}h}h}h}e}e}e}b}b}b}_}}}}v}o}h}b}\}V}V}V}h}_}H}|||H}K}K}N}}}}}}}}y}_~ p t x z | ~     ff~{{ʒ$g<GFFED C C B A A[IؐҀm8qN < < < < < < < < < <\\Ь{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Աƀ1|eAED C C B A @ @ ? +> +>K$_)d2m.i'bYG < < < < < < < < < < <8N8~؀{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{0[[l C C B A @ @ +? +> +> = < < < < < < < < < < < < < < < < <9\ FBf{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'nWj > @ @ +? +> += = < < < < < < < < < < < < < < < <9\ I/tҭ€{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{`(lQ\ +: +> += = < < < < < < < < < < < < < < <7V I0tv{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{q6HN\g8 < < < < < < < < < <8cV KILعʀIq0~L F FNQQ\[QQN F FQ?]؀ΜjKq:dI58L>fPstұĀ||||||||||||||||||||||||||||||||€QQ'ğ%axĀPi9~\T^(|([\€QQ'瀅r1|^R[p=DvڀfeQQ2zTQQQQQQQQFĀOw€QQ'$\QQQQQQQQQQ5ҺVežQQjN΀΀jjVtƀ؀؀΀`}A`Q +4ЕQYVTƀRV!WQVԀ9aQT/lրҀBB`QSĀE\Q 5ʕQWtiQր̱tQQ|tQQ|b߀€hNjЕQYVTƀRV!WQVzQQQQQQQQQT5|B`QwnQQQQQQTK؀HtQQQQQQQQ =RQQQQQQQġRQQVR 9wsQQQ[VQR+z€£qQ =е(\QQQQQQQC€QQ'%[QQQQQQQQ؀ĀcQQQQQQQQQQQ +4VQQ @niQQYHtQQQQQQQQ =B`QSĀE\Q 5B`QQṞtQQRQQQQQQQQjVQQ @niQQYzj1z^RRa-;qB`Q`ȀF[Vn+aV cRTe4Ez€0vVTe6OO\Wn*fQ\Re;o߀ڦQ =؀bv>[R^,7}ƀ8Ob|p܀t{龀{ƀ!t{Ĉ{〠>7}ƀi{Έok|(p!گvbb|>kg|HB)7}}{(ʀQKZ|ᾈh~}|Vt|l}aA:}+؀aA\N}{zZ~{g|:[zZ~{g|:[Ĉ)~ʒf}{k|?c֞ғm~}|Og|\v}Rt jHyb}{Hl}7Vxyb}{AY}O|؂\A}{{{$~ڎ{JoUp_~|Og|!F{kg|HB)7} 'pbS}{\}Uƀҟp_H~{k|K|孀nWy}{t|ItaCo\}{b}[ƀPphY}{_}R|+ ~-㨀{o؅{;܀phY}{_}R|i{@܀ᜀ{"/Y֠y}{A_}` 0ҡjo}{0؀e{Vៀok|#T~|vnA:}>~5b}嬀<7})k~oV>},嬀<7})k~oV>},Ĉ{)2~vҀhgb|D!#N~}ŧ4; ):}#K~lv:{D؀AKZ|tͣ<7}9܀{jЀƋ {q@"^}F'~+>}؅{|UzԀyN>},̀.{e!F<}; >~}|pT,~1N}dz6~+<}龀{ƀ!̀.{e Ĉ{Ĉ{܀{jЀw{/ЀB$~i{X,~ D~![{$Ѐkg|DB)7} Ob|Tʀı5Og|eF}eҀtI{'ƀ繀Nr~r{mă8{>|޶V\}kg|PFKZ|E{QրVO^|q{؅{;܀FKZ|E{Qր:5}Fw)7}KZ|<7}EҡO{9x͓^b|J >~}|pe?gb|Og|DcЀ9Oo|A:}Ok|@Og|Ԫ?{W@Og|Ԫ?{WĈ{:Ԁ8 >7}K {>7};麀{VңC{O܀{ƀK{֯7{|؅{BΞ7{dڹ8{!F<}; {D΀سD{I؀鼀Zb|\龀{ƀ!ڹ8{ Ĉ{Ĉ{܀{ƀ6$~-og|Gi{V${f!嬀{ikg|{{{{{vB)7} K^|ܺB{d.!~ /#~ ,!~%ڵQ{Pƀ^b|H2$~%؊{(̀ ؅{;܀ƀ^b|H2$~%.#6bb|2Ԁw{F߀ >Ok| {D΀صŜ~eC}{?$A:} !Ā{w!Ā{wĈ{4(~={DjԀ )~.!~ $ں:{j^b|S܀{ƀJ{d{d؅{+؀ƀ{Āڹ8{!F<}; /F}BOg|,!~'龀{ƀ!ڹ8{ Ĉ{Ĉ{܀{ƀw"KZ|Ԩ8{i{@~;Og|!㡀{pkg|`B)7} +~f{B߀#!!ր{o^b|Pܼ?{Y0+:}1#~.嬀{y؅{;܀ܼ?{Y0+:}|K^|ЀZb|4ր" &wOb|܀{`ֳ/{s /F}؈={?ր'~ A:}@'~{{{{{{X'~{{{{{{XĈ{4'~w[Z<~{@p~ .!~ $Ҩ${>7}4܀{ƀ{z~̤}|{{{d؅{9܀{`ڹ8{!F<}; ${{{{{{Ā{Ā!ڹ8{ Ĉ{Ĉ{܀{ƀƀbb|v:2~i{緀A:}!H~!L{,րkg|HB)7} f{Q#ܵҟ~˳|{{{!㨀{Ѐ>7}PҪ${{{{{{K^|_O^|t{؅{;܀Ҫ${{{{{{K^|؃{G߀Ҥ2O^|j-C}.#娀{{{{{{{S gb|H1#~%A:}B2$~)2$~)Ĉ{4'~ƣR+~):} .!~ $ڼ<{h^b|S܀{ƀl{\HK^|Uz[{d؅{#Ѐ孀{Āڹ8{!ok|; =+<}܀ߵ{R2$~'ڹ8{ Ĉ{Ĉ{܀{ƀ?߀gg|oi{ОO{Q!4KZ|kg|HB)7} f{Q#龀ok|F̀!Ѐ{vog|Pں:{`ߗ{-Ѐ"#؅{;܀ں:{`F:}Q$'؅{p瀠>7}eր{e 峀ε{o0)7}A:}B;-C};-C}Ĉ{4'~\{j .!~ $ƀ^b|RҤD{L߀逐{t@'~'7}Ć'{d؅{ )w${iܾ?{m%؅{; ֯?{t$,~z{oܾ?{m Ĉ{Ĉ{逐{tڷI{8KZ|i{:KZ|l!ƐXε{Vkg|HB)7} f{Q#J{IH>}!)~.w{P龀^b|l?{!Ā؅{;܀龀^b|l #'~€%~*{i6$~9 ::^vͱF'~+A}ڐkg|(a~l}z|dA:}B媀A7})c~fwza媀A7})c~fwzaĈ{4'~~`tT"):} .!~ $JKZ||qYC:}5(~;~ʃC:}Ok|`/5)Og|d͞h}{d؅{|joSkg|.ᡀ{`Ѐo"{L}ȳ].~ֵ{; Z,~1S}}Lܷi^b|(]~ŪC:}@~ᡀ{`Ѐ Ĉ{Ĉ{(~;~H>}_N})i{߀6$~1~!+~ӻݩu~{'Z~kg|Vg$Oo| f{Q#ៀŭ{\R(\>}!q,{VpF4~^b|PGK^|jӻ>UhKZ|KZ|؅{;܀GK^|jӻ>Uʒ&'7}{0b|+<}ҡQ{5cy~t R;}{{y|u~گ}wZ~to|{h}vA:}Bʕٙu~|{}|w~ʕٙu~|{}|w~Ĉ{4'~`F߹|{Zt|Kr~vڀ .!~ $[Dl}ν{AY}Ozҡb}_}{)B~֬jRe\}Ž{{Y}2H絀Ҋ_~{Zt|T~kg|d؅{FDža~{^|9WX8ѡ|Ob|#~Vѭ|{Sy}@`; ЀxW|{g|Tu~t֪|h~}|{Kl}R|X8ѡ|Ob|# Ĉ{Ĉ{ҡb}_}{)B~N{+̀i{w^b|:!{{{g|Hc~kg|{{{{{i1!~{{{F߀ f{Q#jEhS}{Hl};]f!Wy5p"]SRSSUVVWXXY[ ["\"]#_$_%`0lD}QYԀ||m~ -d    O|zywtsqoml j h f+1}~||f;v.iXOPQQRSSUVVWWXY[ ["\"]"]$_$`%a-hAzRi||m~ -d     "n}zywvsqpml j h f e*1z~||ƀ?y/jRLNNOPPQRSSUVVWWXY[ [!\"]"]$_$`%a&a+fEUڈ||m~ -d       )N}|ywvsqpol j i f e*/w~||w6q [JJKLNNOPPQ!\Fw\mpwqfY5mY [!\"]"]$_$`$`&a'b4pO]߀||m~ -d         8|}|ywvtqpolj i h e d*/u~||U)eLHIJJKLLNWK|ƀ؀ڀЀd=t"]"]"]#_$`$`&a'b+fC}Wڀ||m~              T}|zwvtspomj i h e d.u~||Bz"]FGHHIIJKL4l•Ѐb'a"\"]#_$`$`&a'b'b:tXր||m~               "~g}|zyvtspoml i h f d.r~||=wVEFFGHHIIOfƀ4i"\"]#_$`$`%a'b'b4pW؀||m~                 +E..--------,$|zywtsqoml i h f e,p~||?yO CDEFFGHHUȒဤHw"\"]#_$_$`%a'b'b0lW||z~                   ~܀}zywtsqpml j h f e,m~||HQ B C CDEEFGRڣ瀬Gw"\"]#_$_$`%a&a'b1m[||z~ z z z z               -dY܀܀}|ywvsqpml j i f e+m~||m[ @ A B C C DEEIy逤5j"\"]#_$_$`%a&a'b:t`||z~ | x v t!p!t v|           -d #|g܀܀}|ywvtqpol j i f e d+k~||Ԁ&a @ @ @ A B B C DEYဦ&_"\"]"]$_$`%a&a'bD}܊||w~ | z v t!r!n!l!j j!n v ~     -b-bO-b-b-b3`@-,,,倷+++++++omj i h e d+h~|| +? @ @ A B B CR܀ЀȀڀƀW [!\"]"]$_$`%a&a'bN||w~ | z x t!r!p!n!j!i!g!c!c g n z  ++mj i h f d+h~||ߓO = += +> +? ? @ A B Be߀'` [!\"]"]$_$`$`&a2mv||w~ | z x v!r!p!n!l!i!g!e!c!`!^!\ ^!gအP9  9j·Ȁ++l i h f d)f~||5p = < < += +> +? ? @ ASЀʀЀ]Y [!\"]"]#_$`$`&aD}||u~ ~ | x v t!p!n!l!j!g!e!c!a!^!\!["WȐ,9]Ǝ]-d Fs++ j h f e(c~||ߗG < < < < += +> +? ? @ +> ?w週€*bYY[!\"\"]#_$`$`;v||r~ ~ | z x t!r!p!n!j!i!g!c!a!`!^![!Y/J/Jm က1+ f e d'_~||؀I < < < < < < < = +>I΀€ր߀Ԁ΀JvXXY[!\"\"]#_$_+f}||r~  | z x v!r!p!n!l!i!g!e!c!`!^!\!Yڀ(Ԓ6m._ e d'_~||_ = < < < < < < < < =W倾Ȁ倦WWXXY[!\"\"]#_$_R||r~  ~ | x v t!p!n!l!j!g!e!c!a!^!\![ܤ)0AEV.S-` dK}||"] < < < < < < < < < <"]߀܀̀Ԁ΀iVWXXY[ ["\"]#_5p||r~  ~ | z v t!r!p!l!j!i!e!c!a!`!\![ܤ)0AEV0>/>K}||̀ C < < < < < < < < < <+eȀ뀣zVVWWXY[ ["\"]&aߓ||p}~  ~ | z x t!r!p!n!j!i!g!c!a!`!^![؀)Ԓ'o}0>0>K}||8 < < < < < < < < < <'bƀڀȀʀtUVVWWXY[ [!\"[w||rz~   | z x v!r!p!n!l!i!g!e!c!`!^!\/L/Jo Ԁ0>0>R~K}||l < < < < < < < < < <WȀր借bSUVVWWXYY [ R||pw~   ~ | x v t!p!n!l!j!g!e!c!a!^!\ƀ)E`ؒ"Rd0>r}}K~H}||#O < < < < < < < < < <U߀Ȁ΀€NwRSUVVWWXYY/]||pw~   ~ | z v t!r!p!l!j!i!e!c!a!`!\Ґ06_w֒_v/E"EY~~}}}}F~H}||m7 < < < < < < < < <Gؒƀ値8iRRSUVVVWXVa}|}|mw~   ~ | z x t!r!p!n!j!i!g!c!a!`!^؀Pj6%$8Pߣ~~}}}}}} jF}}|}|i < < < < < < < < < +> ? @ @ A B C CDEAe1|Աƀ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Bf F\9 < < < < < < < < < < < < < < < < < = +> +> +? @ @ A B C Cl[0[{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ҭ€/t I\9 < < < < < < < < < < < < < < < < = += +> +? @ @ >jW'n{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{v0t IV7 < < < < < < < < < < < < < < < = += +> +:\Q(l`{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{LI KVc8 < < < < < < < < < <8g\NH6q{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{؀]?Q F FNQQ[\QQN F FL0~IqعʀұĀtPs>fL85I:dKqjΜ||||||||||||||||||||||||||||||||x%ağ'QQ€2QQfeڀDv=p[R^1|r'QQ€\([(|^T\9~PiĀeVҺ5QQQQQQQQQQ$\'QQ€OwĀFQQQQQQQQTz^9xJizĀҀ΀h)`VQQ'QQ€6Qj<Vjj΀΀NjQQžRQQ'QQ€6Ql^Q^eWQQy'QQ€6QRμìQR_ȀQ'Ym΀QQjVQddN0aV%jxƷQQ̱tVQYa +3Qni[Ȁ6aR!eahQB`+apY^Djy_ȀQ'Ym΀QQjVQdd^Q6^:q%|\[1vOì'QQ€4i0jTaKpV€5aR^9IQQQQQQR̀Av8 rV[9~Um̀+apY^Djy+anV\KSQB`s΀QQ@QQأeQQlOQQʎ AQQQTQQRQQ̱tKQ)[pQQpdQQQQQQQ'؀QB`?΀TQQRRQQ6eк@QQأeQQlOQQʎրQQȋq^QQRRQQV'QQ€OQQQQQQQ6eƳ_QQQVRQQQR`Xƀ#n#n#njQQ"l#nВVQQQQQQV?΀TQQRRQQ6eкHրTQQQQQQ$ڀQB` 5QNaTQjQVWR̀vЀQV ?QV'lRQvpQQ̱tHQQҾhʀQTրWQQRxր#bQlQB`NRQ|€ìlQ1\ҀTQjQVWR̀vЀQVQQfe[QAjڀLQR־'QQ€5VsȀ܀Ҁ9vVQ,[ʀVQQ̀߀L#6QQ߯1eb|ڀրRjQRеNRQ|€ìlQ1\ҀjTQ,\߀܀0qRlQB`SQQ|m ;Qv؀Qr =Qq 8Qx:QQƤv€QTĀQQ̱t`Qۊ^Qی[ƀQTʀv€QQB` 5Qcj[QYa ;Qv؀Qr =Qq 8QxYQzaĀQVĀ @QVg'QQ€iTQìQV߀6QQ߯aQEa 5Qcj[QYa @QTе%ҀQQB`,fVQQ~րQV ;QvhԀQzTQlGQ.[WQwhQQ̱ttЀQT܀JQQ 9QrVQB`QQpzҀQVրQV ;QvhԀQzTQl +4QQQQQQЀcQn^Q醶RQQΕ'QQ€SQTAQn6QQ߯,߀QQȎQQpzҀQVRQVaYQB`N!QQQTsQQΒTQԘWQT܀DQQ߭ +4Qp :QnQQ̱tRQvPQ5\ 5QB[ 8QB`0QQҒWQQҒsQQΒTQԘWQT܀DQQ߭ +4QQQQQQЀcQlQQvhVQtf'QQ€5QQΎ =Qt6QQ߯RQpf0QQҒWQQҒ=QQȃ :QB``܀gQQQ4pbvԀ^Qle-Q+[[Q̱|l΀Q6\aQQQQQQQQQQQ6\QQ̱t <QtWQje 5QE\FQB`$QQQQQQQQQQQQƦq^Qle-Q+[[Q̱|l΀Q6\ +4Qn΀΀΀΀[QtQQQQQQQQQQQQC\'QQ€QQģq =QQQQR\,tc}6QQ߯\QB[$QQQQQQQQQQQQƦq"߀QQ᳀IQB`KRQQnOQjGQL_QQ㊸ 6QL_rcccccccccVQ"WQQ̱t,߀QR€1QRᵀ 5QE\R€QB`-ccccccccccQQmOQjGQL_QQ㊸ 6QL_ +4QvQQVaccccccccccRQx'QQ€QQm =Q4\7a7a3`HrQQ1c­6QQ߯cQx-ccccccccccQQm؀QQĀQ€QB`^QV0QR܀YQй=QVRQε|DQ0\QQ̱tWQ}i AQp 5QE\SĀQB`QQŸq0QR܀YQй=QVRQε| +4Qv.QQȬw^QA['QQ€QQp =Qpt܀^Q1\6QQ߯\Q@[QQŸq#߀QQ߱EQB`]QQmRQȈKQTWQʐ=QRր 5QlQQ̱tUQegTQv 5QE\SĀQB`9QQ΋RQȈKQTWQʐ=QRր +4Qv :QTԀRQle'QQ€9QQʆ =Q|j9QQй}6QQ߯RQed9QQ΋?QQ 7QB`5QQ֚ 6Qjel̀QzGQlel΀QzjRQofQQ̱tXQQ᷀'߀QV߀ 5QE\SĀQB`PQT 6Qjel̀QzGQlel΀Qzj +4Qv)̀QQ*܀QQȐ'QQ€VQRԀ =QVQQl1QQᵀ0QQPQTRQVQB`VQQҾvЀQp 6Qq1Qn 9Qme CQTQQ̱tcQi AQ 5QE\SĀQB`Q߀RQXavЀQp 6Qq1Qn 9Qme +4Qv0wRQ0\Ԁ\QRe'QQ€qTQÊ =QQqiQQQʭvԀQQҀcQ0\Q߀RQXaBQTʯzȀQQB`[QrxڀVQ!WVRƀTVYQЕjNh€߀뀼b|QQ|tQQ̱tրQtiWQʕ 5QE\SĀQB`BҀ뀓ր/lTQ9aԀVQ!WVRƀTVYQЕ +4QA``}΀؀؀ƀ>tnQQ%Yȭ$؀jyʀ뀪߀G\QT'QQ€Rr̀߀ڀBYQVܹ =Q-pQȀtQTƀq؀[QQcTsƀڀ`rQQBҀ뀓ր/lTQ9aԀsTQ,\߀+lR^QB`-ԀQQ?rsƀ؀؀ʀW%X\zYQQni @QQVjQQQQQQQQRQQ̱tRQQB` 5QE\SĀQB` =QQQQQQQQHtYQQni @QQV +4QQQQQQQQQQQcĀ؀QQQQQQQQ%['QQ€CQQQQQQQ(\е =Q£q+z€RQV[QQQws 9RVQQRġQQQQQQQR =QQQQQQQQHtK؀TQQQQQQnwQB`5|TQQQQQQQQQzDQQsf(߀QQ|mʀ*_"v[RW1z€QQ̱t AQQwh 5QE\SĀQB`Ez4eTR cVDQQsf(߀QQ|t€=p6n\RT^;JfV!SlWR\Abvր'QQ€bv؀ =Qڦo߀;eR\Q*fnW\OO6eTV0v€Ez4eTR cV+anV[F`ȀQB`;q-aRR^1zjzUĀQB`SĀQB`SĀQB`SĀQB`SĀQB`SĀQB`SĀQB`C؀}|؅f{㤀,)~G߀{{{/!~i{{{{{kg|x}}g|{{{!CĀ{l5{i7P}€0{Ĉ-L$!ƀ{龀Tt_}}{{y}ȕtЀ Niby}Vo|tt|rX~ԤtaǨ}㣀{oK^|KOk|c#Vkg| J~^b|rR+~!&Xֵ{ҞY{iƀ#Rc~ОJ{Ĉ6YA$适%~!ƀ{龀适%~+1t\RvK^|<%~局ƀ# ֬}z)f~^b|؃(ʀ{})7}BHkg|>bb|گv!(pok|Έ{iƀ>7}{Ĉ选{t!ƀ{龀选{tp܀Ob|8ƀ>7} KZ|V0؀{o}ҡj0 `A_}{֠y}Y/"{ᜀ@܀{iR|_}{hY}p;܀{؅o{㨀-+ ~R|_}{hY}pP[ƀb}{o\}aCItt|{y}nW孀K|k|{_H~ҟpUƀ\}{bS}p ' )7}BHkg|{F!>YA}緀{iQဉ{֯?'7}8$~{{{\A}؂{Ĉ{Ĉ {{{gb|Ā?!ƀ{龀Hp~So||cFĀ0؀{o}ҡj0 ;F<}! {{{gb|Ā?9Vb|{zZ~{؅jԀ~ J^b|͓9x{ҡOE<7}KZ|)7}wF:5}Qր{EKZ|F;܀{؅{qO^|VQր{EKZ|FPkg|V\}޶>|{ă8m{rNr~繀'ƀ{tIҀeeF}Og|5ıʀTOb| )7}BDkg|$Ѐ{[! D~X,~〉{i$~B/Ѐ{wЀj{܀{Ĉ{Ĉ 逾e{.̀!ƀ{龀+<}z6~d1N}T,~p}| >~ ;F<}!逾e{.̀,N>}yԀUz|{؅+>}F'~}^@"q瀉{Ƌ Ѐj{܀9<7}ͣtKZ|AD؀{v:l#K~):} 4;ŧ}#N~!Dgb|hҀv)2~{Ĉ,V>}o)k~<7}嬀,V>}o)k~<7}嬀5b}>~A:}򀜄n|v#T~ok|ៀV{eD΀{ Ok|> F߀{w2Ԁbb|6#.%2$~H^b|ƀ;܀{؅ (̀{؊%2$~H^b|ƀP{ڵQ%,!~ /#~ .!~d{ܺBK^| )7}Bv瀉{{{{{kg|i{嬀!f{V${iGog|-6$~ƀ{܀{Ĉ{Ĉ 选{ڹ8!ƀ{龀\Zb|鼀I؀{سDD΀{ ;F<}!选{ڹ8d瀉{Ξ7B{؅|选{֯7{Kƀ{܀Oဉ{ңCV{麀;>7}{ K>7} 8:Ԁ{ĈW〉{Ԫ?Og|@W〉{Ԫ?Og|@Ok|A:}Oo|9ЀDcOg|gb|e?/F} s瀉{ֳ/`{܀Ob|w &"4րZb|ЀK^||+:}0Y倉{ܼ?;܀{؅y{嬀.1#~+:}0Y倉{ܼ?P^b|o{ր!!#B߀{f+~ )7}B􀕗`kg|p{㡀!Og|;@~{i逐{Ԩ8KZ|w"ƀ{܀{Ĉ{Ĉ 选{ڹ8!ƀ{龀',!~Og|B/F} ;F<}!选{ڹ8Ā{ƀ+؀{؅d倉{d{Jƀ{܀S^b|j瀉{ں: $.!~)~ ԀDj{=(~4򀉞{Ĉw{Ā!w{Ā! A:}$?{eC}Ŝ~ص S〉{{{{{{{娀#.-C}jO^|Ҥ2G߀{؃K^|{{{{{{Ҫ$;܀{؅򀐵{tO^|_K^|{{{{{{Ҫ$P>7}Ѐ{㨀!{{{˳|ҟ~ܵ#Q〉{f )7}BHkg|,ր{L!!H~A:}緀򀉞{i2~:vbb|ƀƀ{܀{Ĉ{Ĉ 选{ڹ8!Ā{Ā{{{{{{$ ;F<}!选{ڹ8`{9܀{؅d倉{{{|̤}~z选{ƀ{܀4>7}{Ҩ$ $.!~ @p~{Z<~w['~4{ĈX{{{{{{'~X{{{{{{'~@A:} '~?ր{؈= e{րe>7}p瀉{؅'$QF:}`{ں:;܀{؅#"-Ѐ{ߗ`{ں:Pog|v{Ѐ!̀Fok|龀#Q〉{f )7}BHkg|KZ|4!Q{ОO{iogg|߀?ƀ{܀{Ĉ{Ĉ 选{ڹ8'2$~Rߵ{܀+<}= ;ok|!选{ڹ8Ā{孀#Ѐ{؅d倉{[UzK^|H\{lƀ{܀S^b|h瀉{ڼ< $.!~ ):}R+~ƣ'~4{Ĉ)2$~)2$~BA:}%1#~Hgb| 96$~i瀉{*%~€'~# l^b|龀;܀{؅!Ā{?l^b|龀P{w.)~!H>}Iဉ{J#Q〉{f )7}BHkg|Vε{ƐX!lKZ|:{iKZ|8{ڷIt{{Ĉ{Ĉ m瀉{ܾ?o{z,~$t倐{֯? ;{؅%m瀉{ܾ?i瀉{w$ ){؅d倉{Ć''7}@'~t{L߀{ҤDR^b|ƀ $.!~ j瀉{\'~4{Ĉ-C};-C};BA:})7}0oε{峀 ~ty5c{ҡQ+<}b|0{'7}ʒ&>UӻjK^|G;܀{؅KZ|KZ|h>UӻjK^|GP^b|F4~pV{q,!\>}R(\ŭ{ៀ#Q〉{f Oo|g$Vkg|'Z~{ݩu~ӻ+~!1~6$~߀{i)_N}H>};~(~{Ĉ{Ĉ Ѐ`{ᡀ@~C:}Ū(]~^b|ܷiLေ}1S}Z,~ ;ֵ{].~ȳL}{o"Ѐ`{ᡀ.kg|oSj|{؅d倉{h}͞dOg|)/5`Ok|C:}ʃ;~(~5C:}qY|KZ|J $.!~ ):}T"`t~'~4{Ĉzafw)c~A7}媀zafw)c~A7}媀BA:}d瀳|zl}(a~kg|ڐ+A}F'~ͱ^v:: ^Sv}{{fN~Ďe3{طA{ᡀIw€r}Sk|Ž{l}\C;܀{؅({ᡀIw€r}Sk|Ž{l}\CPA:}R\}{eS}W<!f;]Hl}{hS}jE#Q〉{f F߀{{{1!~i{{{{{kg|Hc~g|{{{!:^b|w{i+̀{N)B~{}_}ҡb{Ĉ{Ĉ #Ob|ѡ|X8R|Kl}{}|h~֪|tTu~g|{|xWЀ ;@`Sy}{ѭ|~V#Ob|ѡ|X89W^|{Dža~F{؅dkg|T~Zt|{Ҋ_~絀2HY}{Ž{e\}jR֬)B~{}_}ҡbOzAY}ν{l}[D $.!~ vڀKr~Zt|{߹|`F'~4{Ĉw~}|{|ٙu~ʕw~}|{|ٙu~ʕBA:}vh}{to|wZ~گ}u~y|{{}R;]og|Ok|]=܀{؅+Ҁ{p,'~;܀{؅/H}_C}wdt^w/Og|c+߳;܀{؅a~g|{|kV~֪aUʀKy}ν{=;܀{؅ \ No newline at end of file diff --git a/autotests/read/hdr/orientation2.hdr.json b/autotests/read/hdr/orientation2.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation2.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation3.hdr b/autotests/read/hdr/orientation3.hdr new file mode 100644 index 0000000..3ca8ba6 --- /dev/null +++ b/autotests/read/hdr/orientation3.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + ++Y 160 -X 480 +a~g|{|kV~֪aUʀKy}ν{=;܀{؅/H}_C}wdt^w/Og|c+߳;܀{؅+Ҁ{p,'~;܀{؅]og|Ok|]=܀{؅ ^Sv}{{fN~Ďe3{طA{ᡀIw€r}Sk|Ž{l}\C;܀{؅({ᡀIw€r}Sk|Ž{l}\CPA:}R\}{eS}W<!f;]Hl}{hS}jE#Q〉{f F߀{{{1!~i{{{{{kg|Hc~g|{{{!:^b|w{i+̀{N)B~{}_}ҡb{Ĉ{Ĉ #Ob|ѡ|X8R|Kl}{}|h~֪|tTu~g|{|xWЀ ;@`Sy}{ѭ|~V#Ob|ѡ|X89W^|{Dža~F{؅dkg|T~Zt|{Ҋ_~絀2HY}{Ž{e\}jR֬)B~{}_}ҡbOzAY}ν{l}[D $.!~ vڀKr~Zt|{߹|`F'~4{Ĉw~}|{|ٙu~ʕw~}|{|ٙu~ʕBA:}vh}{to|wZ~گ}u~y|{{}R; ~ty5c{ҡQ+<}b|0{'7}ʒ&>UӻjK^|G;܀{؅KZ|KZ|h>UӻjK^|GP^b|F4~pV{q,!\>}R(\ŭ{ៀ#Q〉{f Oo|g$Vkg|'Z~{ݩu~ӻ+~!1~6$~߀{i)_N}H>};~(~{Ĉ{Ĉ Ѐ`{ᡀ@~C:}Ū(]~^b|ܷiLေ}1S}Z,~ ;ֵ{].~ȳL}{o"Ѐ`{ᡀ.kg|oSj|{؅d倉{h}͞dOg|)/5`Ok|C:}ʃ;~(~5C:}qY|KZ|J $.!~ ):}T"`t~'~4{Ĉzafw)c~A7}媀zafw)c~A7}媀BA:}d瀳|zl}(a~kg|ڐ+A}F'~ͱ^v:: 96$~i瀉{*%~€'~# l^b|龀;܀{؅!Ā{?l^b|龀P{w.)~!H>}Iဉ{J#Q〉{f )7}BHkg|Vε{ƐX!lKZ|:{iKZ|8{ڷIt{{Ĉ{Ĉ m瀉{ܾ?o{z,~$t倐{֯? ;{؅%m瀉{ܾ?i瀉{w$ ){؅d倉{Ć''7}@'~t{L߀{ҤDR^b|ƀ $.!~ j瀉{\'~4{Ĉ-C};-C};BA:})7}0oε{峀 e{րe>7}p瀉{؅'$QF:}`{ں:;܀{؅#"-Ѐ{ߗ`{ں:Pog|v{Ѐ!̀Fok|龀#Q〉{f )7}BHkg|KZ|4!Q{ОO{iogg|߀?ƀ{܀{Ĉ{Ĉ 选{ڹ8'2$~Rߵ{܀+<}= ;ok|!选{ڹ8Ā{孀#Ѐ{؅d倉{[UzK^|H\{lƀ{܀S^b|h瀉{ڼ< $.!~ ):}R+~ƣ'~4{Ĉ)2$~)2$~BA:}%1#~Hgb| S〉{{{{{{{娀#.-C}jO^|Ҥ2G߀{؃K^|{{{{{{Ҫ$;܀{؅򀐵{tO^|_K^|{{{{{{Ҫ$P>7}Ѐ{㨀!{{{˳|ҟ~ܵ#Q〉{f )7}BHkg|,ր{L!!H~A:}緀򀉞{i2~:vbb|ƀƀ{܀{Ĉ{Ĉ 选{ڹ8!Ā{Ā{{{{{{$ ;F<}!选{ڹ8`{9܀{؅d倉{{{|̤}~z选{ƀ{܀4>7}{Ҩ$ $.!~ @p~{Z<~w['~4{ĈX{{{{{{'~X{{{{{{'~@A:} '~?ր{؈=/F} s瀉{ֳ/`{܀Ob|w &"4րZb|ЀK^||+:}0Y倉{ܼ?;܀{؅y{嬀.1#~+:}0Y倉{ܼ?P^b|o{ր!!#B߀{f+~ )7}B􀕗`kg|p{㡀!Og|;@~{i逐{Ԩ8KZ|w"ƀ{܀{Ĉ{Ĉ 选{ڹ8!ƀ{龀',!~Og|B/F} ;F<}!选{ڹ8Ā{ƀ+؀{؅d倉{d{Jƀ{܀S^b|j瀉{ں: $.!~)~ ԀDj{=(~4򀉞{Ĉw{Ā!w{Ā! A:}$?{eC}Ŝ~صD΀{ Ok|> F߀{w2Ԁbb|6#.%2$~H^b|ƀ;܀{؅ (̀{؊%2$~H^b|ƀP{ڵQ%,!~ /#~ .!~d{ܺBK^| )7}Bv瀉{{{{{kg|i{嬀!f{V${iGog|-6$~ƀ{܀{Ĉ{Ĉ 选{ڹ8!ƀ{龀\Zb|鼀I؀{سDD΀{ ;F<}!选{ڹ8d瀉{Ξ7B{؅|选{֯7{Kƀ{܀Oဉ{ңCV{麀;>7}{ K>7} 8:Ԁ{ĈW〉{Ԫ?Og|@W〉{Ԫ?Og|@Ok|A:}Oo|9ЀDcOg|gb|e?p}| >~ J^b|͓9x{ҡOE<7}KZ|)7}wF:5}Qր{EKZ|F;܀{؅{qO^|VQր{EKZ|FPkg|V\}޶>|{ă8m{rNr~繀'ƀ{tIҀeeF}Og|5ıʀTOb| )7}BDkg|$Ѐ{[! D~X,~〉{i$~B/Ѐ{wЀj{܀{Ĉ{Ĉ 逾e{.̀!ƀ{龀+<}z6~d1N}T,~p}| >~ ;F<}!逾e{.̀,N>}yԀUz|{؅+>}F'~}^@"q瀉{Ƌ Ѐj{܀9<7}ͣtKZ|AD؀{v:l#K~):} 4;ŧ}#N~!Dgb|hҀv)2~{Ĉ,V>}o)k~<7}嬀,V>}o)k~<7}嬀5b}>~A:}򀜄n|v#T~ok|ៀV{e0؀{o}ҡj0 `A_}{֠y}Y/"{ᜀ@܀{iR|_}{hY}p;܀{؅o{㨀-+ ~R|_}{hY}pP[ƀb}{o\}aCItt|{y}nW孀K|k|{_H~ҟpUƀ\}{bS}p ' )7}BHkg|{F!>YA}緀{iQဉ{֯?'7}8$~{{{\A}؂{Ĉ{Ĉ {{{gb|Ā?!ƀ{龀Hp~So||cFĀ0؀{o}ҡj0 ;F<}! {{{gb|Ā?9Vb|{zZ~{؅jԀbb|گv!(pok|Έ{iƀ>7}{Ĉ选{t!ƀ{龀选{tp܀Ob|8ƀ>7} KZ|VaǨ}㣀{oK^|KOk|c#Vkg| J~^b|rR+~!&Xֵ{ҞY{iƀ#Rc~ОJ{Ĉ6YA$适%~!ƀ{龀适%~+1t\RvK^|<%~局ƀ# ֬}z)f~^b|؃C؀}|؅f{㤀,)~G߀{{{/!~i{{{{{kg|x}}g|{{{!CĀ{l5{i7P}€0{Ĉ-L$!ƀ{龀Tt_}}{{y}ȕtЀ Niby}Vo|tt|rX~ԤtSĀQB`SĀQB`SĀQB`SĀQB`SĀQB`SĀQB`UĀQB`DQQsf(߀QQ|mʀ*_"v[RW1z€QQ̱t AQQwh 5QE\SĀQB`Ez4eTR cVDQQsf(߀QQ|t€=p6n\RT^;JfV!SlWR\Abvր'QQ€bv؀ =Qڦo߀;eR\Q*fnW\OO6eTV0v€Ez4eTR cV+anV[F`ȀQB`;q-aRR^1zjzYQQni @QQVjQQQQQQQQRQQ̱tRQQB` 5QE\SĀQB` =QQQQQQQQHtYQQni @QQV +4QQQQQQQQQQQcĀ؀QQQQQQQQ%['QQ€CQQQQQQQ(\е =Q£q+z€RQV[QQQws 9RVQQRġQQQQQQQR =QQQQQQQQHtK؀TQQQQQQnwQB`5|TQQQQQQQQQzVQ!WVRƀTVYQЕjNh€߀뀼b|QQ|tQQ̱tրQtiWQʕ 5QE\SĀQB`BҀ뀓ր/lTQ9aԀVQ!WVRƀTVYQЕ +4QA``}΀؀؀ƀ>tnQQ%Yȭ$؀jyʀ뀪߀G\QT'QQ€Rr̀߀ڀBYQVܹ =Q-pQȀtQTƀq؀[QQcTsƀڀ`rQQBҀ뀓ր/lTQ9aԀsTQ,\߀+lR^QB`-ԀQQ?rsƀ؀؀ʀW%X\zvЀQp 6Qq1Qn 9Qme CQTQQ̱tcQi AQ 5QE\SĀQB`Q߀RQXavЀQp 6Qq1Qn 9Qme +4Qv0wRQ0\Ԁ\QRe'QQ€qTQÊ =QQqiQQQʭvԀQQҀcQ0\Q߀RQXaBQTʯzȀQQB`[Qrxڀ 6Qjel̀QzGQlel΀QzjRQofQQ̱tXQQ᷀'߀QV߀ 5QE\SĀQB`PQT 6Qjel̀QzGQlel΀Qzj +4Qv)̀QQ*܀QQȐ'QQ€VQRԀ =QVQQl1QQᵀ0QQPQTRQVQB`VQQҾRQȈKQTWQʐ=QRր 5QlQQ̱tUQegTQv 5QE\SĀQB`9QQ΋RQȈKQTWQʐ=QRր +4Qv :QTԀRQle'QQ€9QQʆ =Q|j9QQй}6QQ߯RQed9QQ΋?QQ 7QB`5QQ֚0QR܀YQй=QVRQε|DQ0\QQ̱tWQ}i AQp 5QE\SĀQB`QQŸq0QR܀YQй=QVRQε| +4Qv.QQȬw^QA['QQ€QQp =Qpt܀^Q1\6QQ߯\Q@[QQŸq#߀QQ߱EQB`]QQmOQjGQL_QQ㊸ 6QL_rcccccccccVQ"WQQ̱t,߀QR€1QRᵀ 5QE\R€QB`-ccccccccccQQmOQjGQL_QQ㊸ 6QL_ +4QvQQVaccccccccccRQx'QQ€QQm =Q4\7a7a3`HrQQ1c­6QQ߯cQx-ccccccccccQQm؀QQĀQ€QB`^QV^Qle-Q+[[Q̱|l΀Q6\aQQQQQQQQQQQ6\QQ̱t <QtWQje 5QE\FQB`$QQQQQQQQQQQQƦq^Qle-Q+[[Q̱|l΀Q6\ +4Qn΀΀΀΀[QtQQQQQQQQQQQQC\'QQ€QQģq =QQQQR\,tc}6QQ߯\QB[$QQQQQQQQQQQQƦq"߀QQ᳀IQB`KRQQnsQQΒTQԘWQT܀DQQ߭ +4Qp :QnQQ̱tRQvPQ5\ 5QB[ 8QB`0QQҒWQQҒsQQΒTQԘWQT܀DQQ߭ +4QQQQQQЀcQlQQvhVQtf'QQ€5QQΎ =Qt6QQ߯RQpf0QQҒWQQҒ=QQȃ :QB``܀gQQQ4pbvԀրQV ;QvhԀQzTQlGQ.[WQwhQQ̱ttЀQT܀JQQ 9QrVQB`QQpzҀQVրQV ;QvhԀQzTQl +4QQQQQQЀcQn^Q醶RQQΕ'QQ€SQTAQn6QQ߯,߀QQȎQQpzҀQVRQVaYQB`N!QQQT ;Qv؀Qr =Qq 8Qx:QQƤv€QTĀQQ̱t`Qۊ^Qی[ƀQTʀv€QQB` 5Qcj[QYa ;Qv؀Qr =Qq 8QxYQzaĀQVĀ @QVg'QQ€iTQìQV߀6QQ߯aQEa 5Qcj[QYa @QTе%ҀQQB`,fVQQ~TQjQVWR̀vЀQV ?QV'lRQvpQQ̱tHQQҾhʀQTրWQQRxր#bQlQB`NRQ|€ìlQ1\ҀTQjQVWR̀vЀQVQQfe[QAjڀLQR־'QQ€5VsȀ܀Ҁ9vVQ,[ʀVQQ̀߀L#6QQ߯1eb|ڀրRjQRеNRQ|€ìlQ1\ҀjTQ,\߀܀0qRlQB`SQQ|m@QQأeQQlOQQʎ AQQQTQQRQQ̱tKQ)[pQQpdQQQQQQQ'؀QB`?΀TQQRRQQ6eк@QQأeQQlOQQʎրQQȋq^QQRRQQV'QQ€OQQQQQQQ6eƳ_QQQVRQQQR`Xƀ#n#n#njQQ"l#nВVQQQQQQV?΀TQQRRQQ6eкHրTQQQQQQ$ڀQB` 5QNa_ȀQ'Ym΀QQjVQddN0aV%jxƷQQ̱tVQYa +3Qni[Ȁ6aR!eahQB`+apY^Djy_ȀQ'Ym΀QQjVQdd^Q6^:q%|\[1vOì'QQ€4i0jTaKpV€5aR^9IQQQQQQR̀Av8 rV[9~Um̀+apY^Djy+anV\KSQB`s΀QQWQQy'QQ€6QRμìQRRQQ'QQ€6Ql^Q^e^9xJizĀҀ΀h)`VQQ'QQ€6Qj<Vjj΀΀NjQQžeVҺ5QQQQQQQQQQ$\'QQ€OwĀFQQQQQQQQTz2QQfeڀDv=p[R^1|r'QQ€\([(|^T\9~PiĀx%ağ'QQ€||||||||||||||||||||||||||||||||ұĀtPs>fL85I:dKqjΜ؀]?Q F FNQQ[\QQN F FL0~IqعʀLI KVc8 < < < < < < < < < <8g\NH6q{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{v0t IV7 < < < < < < < < < < < < < < < = += +> +:\Q(l`{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ҭ€/t I\9 < < < < < < < < < < < < < < < < = += +> +? @ @ >jW'n{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Bf F\9 < < < < < < < < < < < < < < < < < = +> +> +? @ @ A B C Cl[0[{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{؀8~N8 < < < < < < < < < < <GY'b.i2m)d$_K +> +> ? @ @ A B C CDEAe1|Աƀ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Ь\\ < < < < < < < < < <N8qmҀؐI[ A A B C CDEFFG<$gʒ{{ff~      ~ | z x t p_~y}}}}}}}}N}K}K}H}|||H}_}h}V}V}V}\}b}h}o}v}}}}_}b}b}b}e}e}e}h}h}h}l}l}l}o}o}o}r}r}H}{{̗Tc < < < < < < < < <GBzߦ€܀̀ĀĀ΀qW C CDEFFGHHBci{{fh~ ң€ң€ң€ң€ңңm v t!r!p e_h~}}}}}}H}H}||||V}b}l}o}Y}\}\}\}e}l}r}y}}}e}e}e}h}h}h}l}l}l}o}v}K}{{ΤT7 < < < < < < < < +?+fܚԀĀҀ_GEFFGHHIIF#iȆ{{hh~ ܷЀң€ңңңm v t!p!n!l!j'\}}}}}||||N}\}b}h}o}r}_}_}_}b}b}h}y}}}}h}h}l}l}l}o}o}o}r}r}}}K}{{ЀY7 < < < < < < < < B;t܀؀€ڀ؎RFGHHIJJKH%pМ{{hk~ -d   ~ z x v!r!p!n!l!i!g!e]~}}}||K}S}Y}_}e}l}v}y}b}b}e}e}h}h}l}y}}}o}o}o}r}r}r}v}v}v}y}y}y}}}}}}}~}N}{{/v7 < < < < < < < < +?SȀʀȀSHHIJJKLLI.z΀kt|kt|hm~ -d  ~ | z x t!r!p!n!j!i!g!e!a!^k~}H}N}P}V}\}e}l}r}y}}}h}h}h}l}l}l}o}o}r}}r}r}v}v}v}y}y}y}}}}}}}}}}}~}P}kt|kt|pc < < < < < < < < +?=v܀ĀҐKIJJKLNNOGBky|ky|hm~ -d  ~ | z v t!r!p!l!j!i!e!c!a!`!\"W}P}S}\}b}h}o}v}}}l}l}o}o}o}r}r}r}r}l}v}y}y}y}}}}}}}}}}}}}}}~}P}ky|ky|V < < < < < < < < <%aڀ့ȀfJJKLNNOPP,Ltoy|oy|km~ -d  ~ | x v t!p!n!l!j!g!e!c!a!^!\!["Y)Ov}_}e}o}v}}}}}o}r}r}r}v}v}v}l}h}o}}}}}}}}}}}}}}}}}}~@~F}oy|oy|"g9 < < < < < < < <Gօ倷Ԁ瀯2iKLNNOPQQR/؀o}|o}|kp~ -d  | z x v!r!p!n!l!i!g!e!c!`!^!\!Y++*a~o}r}y}}}}v}v}y}y}y}o}b}e}l}r}}}}}}}}}}}}}}}}^|A}o}|o}|El4 < < < < < < < < <7p逹ȗLNOOPQQRSP7_t}|t}|mr~    ~ | z x t!r!p!n!j!i!g!c!a!`!^![!Y++)('m~}}}}y}}}}}v}_}_}e}l}r}y}}}}}}}}}}}}}}}^A}t}|t}|a < < < < < < < < <NܣЀƀ瀭=pOOPQQRSUU5ھЀt|t|mr~    ~ | z v t!r!p!l!j!i!e!c!a!`!\!["Y+*)('&%I}}}}}}e}V}\}b}h}o}v}}}}}}}}}}}}}}@~C}t|t|Bj8 < < < < < < < < r}}K~H}||8 < < < < < < < < < <'bƀڀȀʀtUVVWWXY[ [!\"[w||rz~   | z x v!r!p!n!l!i!g!e!c!`!^!\/L/Jo Ԁ0>0>R~K}||̀ C < < < < < < < < < <+eȀ뀣zVVWWXY[ ["\"]&aߓ||p}~  ~ | z x t!r!p!n!j!i!g!c!a!`!^![؀)Ԓ'o}0>0>K}||"] < < < < < < < < < <"]߀܀̀Ԁ΀iVWXXY[ ["\"]#_5p||r~  ~ | z v t!r!p!l!j!i!e!c!a!`!\![ܤ)0AEV0>/>K}||_ = < < < < < < < < =W倾Ȁ倦WWXXY[!\"\"]#_$_R||r~  ~ | x v t!p!n!l!j!g!e!c!a!^!\![ܤ)0AEV.S-` dK}||؀I < < < < < < < = +>I΀€ր߀Ԁ΀JvXXY[!\"\"]#_$_+f}||r~  | z x v!r!p!n!l!i!g!e!c!`!^!\!Yڀ(Ԓ6m._ e d'_~||:t < < < < < < += +> +> ?w週€*bYY[!\"\"]#_$`$`;v||r~ ~ | z x t!r!p!n!j!i!g!c!a!`!^![!Y/J/Jm က1+ f e d'_~||ߗG < < < < += +> +? ? @ +? ? @ ASЀʀЀ]Y [!\"]"]#_$`$`&aD}||u~ ~ | x v t!p!n!l!j!g!e!c!a!^!\!["WȐ,9]Ǝ]-d Fs++ j h f e(c~||ߓO = += +> +? ? @ A B Be߀'` [!\"]"]$_$`$`&a2mv||w~ | z x v!r!p!n!l!i!g!e!c!`!^!\ ^!gအP9  9j·Ȁ++l i h f d)f~|| +? @ @ A B B CR܀ЀȀڀƀW [!\"]"]$_$`%a&a'bN||w~ | z x t!r!p!n!j!i!g!c!c g n z  ++mj i h f d+h~||Ԁ&a @ @ @ A B B C DEYဦ&_"\"]"]$_$`%a&a'bD}܊||w~ | z v t!r!n!l!j j!n v ~     -b-bO-b-b-b3`@-,,,倷+++++++omj i h e d+h~||m[ @ A B C C DEEIy逤5j"\"]#_$_$`%a&a'b:t`||z~ | x v t!p!t v|           -d #|g܀܀}|ywvtqpol j i f e d+k~||HQ B C CDEEFGRڣ瀬Gw"\"]#_$_$`%a&a'b1m[||z~ z z z z               -dY܀܀}|ywvsqpml j i f e+m~||?yO CDEFFGHHUȒဤHw"\"]#_$_$`%a'b'b0lW||z~                   ~܀}zywtsqpml j h f e,m~||=wVEFFGHHIIOfƀ4i"\"]#_$`$`%a'b'b4pW؀||m~                 +E..--------,$|zywtsqoml i h f e,p~||Bz"]FGHHIIJKL4l•Ѐb'a"\"]#_$`$`&a'b'b:tXր||m~               "~g}|zyvtspoml i h f d.r~||U)eLHIJJKLLNWK|ƀ؀ڀЀd=t"]"]"]#_$`$`&a'b+fC}Wڀ||m~              T}|zwvtspomj i h e d.u~||w6q [JJKLNNOPPQ!\Fw\mpwqfY5mY [!\"]"]$_$`$`&a'b4pO]߀||m~ -d         8|}|ywvtqpolj i h e d*/u~||ƀ?y/jRLNNOPPQRSSUVVWWXY[ [!\"]"]$_$`%a&a+fEUڈ||m~ -d       )N}|ywvsqpol j i f e*/w~||f;v.iXOPQQRSSUVVWWXY[ ["\"]"]$_$`%a-hAzRi||m~ -d     "n}zywvsqpml j h f e*1z~||܀S>y5p"]SRSSUVVWXXY[ ["\"]#_$_%`0lD}QYԀ||m~ -d    O|zywtsqoml j h f+1}~||؀mKA|;t0l)e"][WXXY[ [$`)e1l;vGPUsЀ||p~ -d 4y|zyvtsqoml i h+1~||ڀwWIEFGD}?z?yFKKNP]wҀ||p~ ܹЀЦ€Ҁဦpʀ}|zwvtsj€܀܀܀ڀ倀 d2~||ᗺqpopptߓ߀||p~ У̀߀ဤဤpʀ}|zwvtj€ڀڀڀڀڀڀ e2~||hv}hv}w~E}|ywvtqpol j i f4~hv}hv}hv}hv}hv}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/autotests/read/hdr/orientation3.hdr.json b/autotests/read/hdr/orientation3.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation3.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation4.hdr b/autotests/read/hdr/orientation4.hdr new file mode 100644 index 0000000..dcd960c --- /dev/null +++ b/autotests/read/hdr/orientation4.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + ++Y 160 +X 480 +؅{;܀=ν{Ky}Uʀ֪akV~|{g|a~؅{;܀߳c+Og|w/^twd_C}/H}؅{;܀'~,p{+Ҁ؅{=܀]Ok|og|]R;}{{y|u~گ}wZ~to|{h}vA:}Bʕٙu~|{}|w~ʕٙu~|{}|w~Ĉ{4'~`F߹|{Zt|Kr~vڀ .!~ $[Dl}ν{AY}Ozҡb}_}{)B~֬jRe\}Ž{{Y}2H絀Ҋ_~{Zt|T~kg|d؅{FDža~{^|9WX8ѡ|Ob|#~Vѭ|{Sy}@`; ЀxW|{g|Tu~t֪|h~}|{Kl}R|X8ѡ|Ob|# Ĉ{Ĉ{ҡb}_}{)B~N{+̀i{w^b|:!{{{g|Hc~kg|{{{{{i1!~{{{F߀ f{Q#jEhS}{Hl};]f!W}_N})i{߀6$~1~!+~ӻݩu~{'Z~kg|Vg$Oo| f{Q#ៀŭ{\R(\>}!q,{VpF4~^b|PGK^|jӻ>UhKZ|KZ|؅{;܀GK^|jӻ>Uʒ&'7}{0b|+<}ҡQ{5cy~t 峀ε{o0)7}A:}B;-C};-C}Ĉ{4'~\{j .!~ $ƀ^b|RҤD{L߀逐{t@'~'7}Ć'{d؅{ )w${iܾ?{m%؅{; ֯?{t$,~z{oܾ?{m Ĉ{Ĉ{逐{tڷI{8KZ|i{:KZ|l!ƐXε{Vkg|HB)7} f{Q#J{IH>}!)~.w{P龀^b|l?{!Ā؅{;܀龀^b|l #'~€%~*{i6$~9 gb|H1#~%A:}B2$~)2$~)Ĉ{4'~ƣR+~):} .!~ $ڼ<{h^b|S܀{ƀl{\HK^|Uz[{d؅{#Ѐ孀{Āڹ8{!ok|; =+<}܀ߵ{R2$~'ڹ8{ Ĉ{Ĉ{܀{ƀ?߀gg|oi{ОO{Q!4KZ|kg|HB)7} f{Q#龀ok|F̀!Ѐ{vog|Pں:{`ߗ{-Ѐ"#؅{;܀ں:{`F:}Q$'؅{p瀠>7}eր{e ؈={?ր'~ A:}@'~{{{{{{X'~{{{{{{XĈ{4'~w[Z<~{@p~ .!~ $Ҩ${>7}4܀{ƀ{z~̤}|{{{d؅{9܀{`ڹ8{!F<}; ${{{{{{Ā{Ā!ڹ8{ Ĉ{Ĉ{܀{ƀƀbb|v:2~i{緀A:}!H~!L{,րkg|HB)7} f{Q#ܵҟ~˳|{{{!㨀{Ѐ>7}PҪ${{{{{{K^|_O^|t{؅{;܀Ҫ${{{{{{K^|؃{G߀Ҥ2O^|j-C}.#娀{{{{{{{S صŜ~eC}{?$A:} !Ā{w!Ā{wĈ{4(~={DjԀ )~.!~ $ں:{j^b|S܀{ƀJ{d{d؅{+؀ƀ{Āڹ8{!F<}; /F}BOg|,!~'龀{ƀ!ڹ8{ Ĉ{Ĉ{܀{ƀw"KZ|Ԩ8{i{@~;Og|!㡀{pkg|`B)7} +~f{B߀#!!ր{o^b|Pܼ?{Y0+:}1#~.嬀{y؅{;܀ܼ?{Y0+:}|K^|ЀZb|4ր" &wOb|܀{`ֳ/{s /F}e?gb|Og|DcЀ9Oo|A:}Ok|@Og|Ԫ?{W@Og|Ԫ?{WĈ{:Ԁ8 >7}K {>7};麀{VңC{O܀{ƀK{֯7{|؅{BΞ7{dڹ8{!F<}; {D΀سD{I؀鼀Zb|\龀{ƀ!ڹ8{ Ĉ{Ĉ{܀{ƀ6$~-og|Gi{V${f!嬀{ikg|{{{{{vB)7} K^|ܺB{d.!~ /#~ ,!~%ڵQ{Pƀ^b|H2$~%؊{(̀ ؅{;܀ƀ^b|H2$~%.#6bb|2Ԁw{F߀ >Ok| {D΀e{Vៀok|#T~|vnA:}>~5b}嬀<7})k~oV>},嬀<7})k~oV>},Ĉ{)2~vҀhgb|D!#N~}ŧ4; ):}#K~lv:{D؀AKZ|tͣ<7}9܀{jЀƋ {q@"^}F'~+>}؅{|UzԀyN>},̀.{e!F<}; >~}|pT,~1N}dz6~+<}龀{ƀ!̀.{e Ĉ{Ĉ{܀{jЀw{/ЀB$~i{X,~ D~![{$Ѐkg|DB)7} Ob|Tʀı5Og|eF}eҀtI{'ƀ繀Nr~r{mă8{>|޶V\}kg|PFKZ|E{QրVO^|q{؅{;܀FKZ|E{Qր:5}Fw)7}KZ|<7}EҡO{9x͓^b|J >~}|pQKZ|ᾈh~}|Vt|l}aA:}+؀aA\N}{zZ~{g|:[zZ~{g|:[Ĉ)~ʒf}{k|?c֞ғm~}|Og|\v}Rt jHyb}{Hl}7Vxyb}{AY}O|؂\A}{{{$~ڎ{JoUp_~|Og|!F{kg|HB)7} 'pbS}{\}Uƀҟp_H~{k|K|孀nWy}{t|ItaCo\}{b}[ƀPphY}{_}R|+ ~-㨀{o؅{;܀phY}{_}R|i{@܀ᜀ{"/Y֠y}{A_}` 0ҡjo}{0؀VKZ| 〠>7}ƀ8Ob|p܀t{龀{ƀ!t{Ĉ{〠>7}ƀi{Έok|(p!گvbb|>kg|HB)7}}{(ʀ؃^b|)f~z֬} #ƀ局<%~K^|Rvt\+1%~龀{ƀ!%~A$6YĈ{ОJRc~#ƀi{ҞYֵ{&X!+~rR^b| J~kg|Vc#Ok|KK^|o{㣀Ǩ}aԤtrX~tt|Vo|by}Ni Ѐȕty}{{_}}Tt龀{ƀ!L$-Ĉ{€07P}i{l5{CĀ!{{{g|}}xkg|{{{{{i/!~{{{G߀)~,㤀{f؅}|C؀B`QSĀB`QSĀB`QSĀB`QSĀB`QSĀB`QSĀB`QUĀzj1z^RRa-;qB`Q`ȀF[Vn+aV cRTe4Ez€0vVTe6OO\Wn*fQ\Re;o߀ڦQ =؀bv>[R^,tƀ؀؀΀`}A`Q +4ЕQYVTƀRV!WQVԀ9aQT/lրҀBB`QSĀE\Q 5ʕQWtiQր̱tQQ|tQQ|b߀€hNjЕQYVTƀRV!WQVڀrxQ[B`QQzȀʯTQBXaQRQ߀0\QcҀQQԀʭvQQQqiQQ =ÊQTq€QQ'ReQ\Ԁ0\QR0wvQ +4meQ 9nQ1qQ 6pQvЀXaQRQ߀B`QSĀE\Q 5Q AiQc̱tQQTQ CmeQ 9nQ1qQ 6pQvЀҾQQVB`QVQRTQPQQ0ᵀQQ1lQQVQ =ԀRQV€QQ'ȐQQ*܀QQ)̀vQ +4zjQl΀leQGzQl̀jeQ 6TQPB`QSĀE\Q 5߀VQ'߀᷀QQX̱tQQofQRzjQl΀leQGzQl̀jeQ 6֚QQ5B`Q 7QQ?΋QQ9edQR߯QQ6й}QQ9|jQ =ʆQQ9€QQ'leQRԀTQ :vQ +4րRQ=ʐQWTQKȈQR΋QQ9B`QSĀE\Q 5vQTegQU̱tQQlQ 5րRQ=ʐQWTQKȈQRmQQ]B`QE߱QQ#߀ŸqQQ@[Q\߯QQ61\Q^t܀pQ =pQQ€QQ'A[Q^ȬwQQ.vQ +4ε|QRVQ=йQY܀RQ0ŸqQQB`QSĀE\Q 5pQ A}iQW̱tQQ0\QDε|QRVQ=йQY܀RQ0VQ^B`QQ€ĀQQ؀mQQcccccccccc-xQc߯QQ6­1cQQrH3`7a7a4\Q =mQQ€QQ'xQRccccccccccVaQQvQ +4L_Q 6㊸QQL_QGjQOmQQcccccccccc-B`QR€E\Q 5ᵀRQ1€RQ,߀̱tQQ"WQVcccccccccrL_Q 6㊸QQL_QGjQOnQQRKB`QI᳀QQ"߀ƦqQQQQQQQQQQQQ$B[Q\߯QQ6}c,t\RQQQQ =ģqQQ€QQ'C\QQQQQQQQQQQQtQ[΀΀΀΀nQ +46\Ql΀̱|Q[+[Q-leQ^ƦqQQQQQQQQQQQQ$B`QFE\Q 5jeQWtQ <̱tQQ6\QQQQQQQQQQQa6\Ql΀̱|Q[+[Q-leQ^Ԁbv4pQQQg`܀B`Q :ȃQQ=ҒQQWҒQQ0pfQR߯QQ6tQ =ΎQQ5€QQ'tfQVvhQQlQcЀQQQQQQ +4߭QQD܀TQWԘQTΒQQsҒQQWҒQQ0B`Q 8B[Q 55\QPvQṞtQQnQ :pQ +4߭QQD܀TQWԘQTΒQQsTQQQ!NB`QYVaQRVQzҀpQQȎQQ,߀߯QQ6nQATQS€QQ'ΕQQR醶Q^nQcЀQQQQQQ +4lQTzQԀvhQ ;VQրVQzҀpQQB`QVrQ 9QQJ܀TQtЀ̱tQQwhQW.[QGlQTzQԀvhQ ;VQր~QQV,fB`QQ%ҀеTQ @YaQ[cjQ 5EaQa߯QQ6߀VQìQTi€QQ'VgQ @ĀVQaĀzQYxQ 8qQ =rQ؀vQ ;YaQ[cjQ 5B`QQv€ʀTQ[ƀیQ^ۊQ`̱tQQĀTQv€ƤQQ:xQ 8qQ =rQ؀vQ ;|mQQSB`QlR0q܀߀,\QTjҀ1\Qlì€|QRNеRQjRրڀb|1e߯QQ6#L߀̀QQVʀ,[QV9vҀ܀Ȁs5V€QQ'־RQLڀAjQ[feQQVQvЀ̀RWVQjQTҀ1\Qlì€|QRNB`QlQ#bր瀪RxQQWրTQhʀҾQQH̱tQQvpQR'lဆVQ ?VQvЀ̀RWVQjQTNaQ 5B`Q$ڀQQQQQQTHրк6eQQRRQQT?΀VQQQQQQVВ#n"lQQj#n#n#nXƀR`QQQRVQQQ_Ƴ6eQQQQQQQO€QQ'VQQRRQQ^qȋQQրʎQQOlQQeأQQ@к6eQQRRQQT?΀B`Q'؀QQQQQQQdpQQp)[QḴtQQRQQTQQQ AʎQQOlQQeأQQ@QQs΀B`QSK\Vn+ajyD^Yp+àUm9~[V r8Av̀RQQQQQQI􀣦9^Ra5V€pKaTj04i€QQ'̀Oi1v[\%|:q6^Q^ddQVjQQm΀'YQ_ȀjyD^Yp+aB`Qha!eRa6[ȀniQ +3YaQV̱tQQƷx%jVa0NddQVjQQm΀'YQ_ȀRQìμRQ6€QQ'yQQW^eQ^lQ6€QQ'QQRžQQjN΀΀jjVfPstұĀعʀIq0~L F FNQQ\[QQN F FQ?]؀{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{q6HN\g8 < < < < < < < < < <8cV KIL{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{`(lQ\ +: +> += = < < < < < < < < < < < < < < <7V I0tv{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'nWj > @ @ +? +> += = < < < < < < < < < < < < < < < <9\ I/tҭ€{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{0[[l C C B A @ @ +? +> +> = < < < < < < < < < < < < < < < < <9\ FBf{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Աƀ1|eAED C C B A @ @ ? +> +>K$_)d2m.i'bYG < < < < < < < < < < <8N8~؀{{H}r}r}o}o}o}l}l}l}h}h}h}e}e}e}b}b}b}_}}}}v}o}h}b}\}V}V}V}h}_}H}|||H}K}K}N}}}}}}}}y}_~ p t x z | ~     ff~{{ʒ$g<GFFED C C B A A[IؐҀm8qN < < < < < < < < < <\\Ь{{K}v}o}l}l}l}h}h}h}e}e}e}}}y}r}l}e}\}\}\}Y}o}l}b}V}||||H}H}}}}}}}_h~ e!p!r t vmңңң€ң€ң€ң€ fh~{{icBHHGFFED C CWq΀ĀĀ̀܀ߦ€BzG < < < < < < < < <cT̗{{K}}}r}r}o}o}o}l}l}l}h}h}}}}y}h}b}b}_}_}_}r}o}h}b}\}N}||||}}}}}'\!j!l!n!p t vmңңңң€ܷЀ hh~{{Ȇ#iFIIHHGFFEG_ҀĀԀܚ+f +? < < < < < < < <7TΤ{{N}}~}}}}}}y}y}y}v}v}v}r}r}r}o}o}o}}}y}l}h}h}e}e}b}b}y}v}l}e}_}Y}S}K}||}}}]~!e!g!i!l!n!p!r v x z ~  -d hk~{{М%pHKJJIHHGFR؎ڀ€؀܀;t B < < < < < < < <7YЀkt|kt|P}}~}}}}}}}}}}y}y}y}v}v}v}r}r}}r}o}o}l}l}l}h}h}h}}}y}r}l}e}\}V}P}N}H}}k~!^!a!e!g!i!j!n!p!r t x z | ~ -d hm~kt|kt|΀.zILLKJJIHHSȀʀȀS +? < < < < < < < <7/vky|ky|P}}~}}}}}}}}}}}}}}y}y}y}v}l}r}r}r}r}o}o}o}l}l}}}v}o}h}b}\}S}P}}"W!\!`!a!c!e!i!j!l!p!r t v z | ~ -d hm~ky|ky|BGONNLKJJIKҐĀ܀瀾=v +? < < < < < < < <cpoy|oy|F}@~~}}}}}}}}}}}}}}}}}o}h}l}v}v}v}r}r}r}o}}}}}v}o}e}_}v})O"Y![!\!^!a!c!e!g!j!l!n!p t v x | ~ -d km~oy|oy|Lt,PPONNLKJJfȀڀ%a < < < < < < < < <Vo}|o}|A}|^}}}}}}}}}}}}}}}r}l}e}b}o}y}y}y}v}v}}}}y}r}o}a~*++!Y!\!^!`!c!e!g!i!l!n!p!r v x z | -d kp~o}|o}|؀/RQQPONNLK2iԀօG < < < < < < < <9"gt}|t}|A}^}}}}}}}}}}}}}}y}r}l}e}_}_}v}}}}}y}}}}}m~'()++!Y![!^!`!a!c!g!i!j!n!p!r t x z | ~   mr~t}|t}|7_PSRQQPOONLȗ逤逼7p < < < < < < < < <4Elt|t|C}@~}}}}}}}}}}}}}v}o}h}b}\}V}e}}}}}}}%I&'()*+"Y![!\!`!a!c!e!i!j!l!p!r t v z | ~   mr~t|t|ھЀ5UUSRQQPOO=pƀЀܣN < < < < < < < < <ay|y|C}F~}}}}}}}}}~~~~~}}~~~~in/F/G/H/I/J/K/L/N/O.P.Q!^!a!c!e!g!j!l!n!p t v x | ~   mr~y|y|=bRVUUSRRQPO逡ƀʀ̀Ѐ/j < < < < < < < < <8Bjy|y|C}vK~}}}}}}}~~!^!`!c!e!g!i!l!n!p!r v x z |   mu~y|y|々KWVVUUSRRQVƺĀЀƀY < < < < < < < < < <i}|}|F} j}}}}}}~~ߣ8P$%6Pj؀!^!`!a!c!g!i!j!n!p!r t x z | ~  mw~}|}|aVXWVVVUSRR8i倵ƀؒG < < < < < < < < <7m||H}F~}}}}~~EY"/E_v֒_w60Ґ!\!`!a!c!e!i!j!l!p!r t v z | ~  pw~||/]YYXWWVVUSRNw€΀Ȁ߀U < < < < < < < < < <#O||H}K~}}r0>Rd"ؒE`)ƀ!\!^!a!c!e!g!j!l!n!p t v x | ~  pw~||〓 R [YYXWWVVUSb뀟րȀW < < < < < < < < < <l||K}R~0>0>Ԁ o/J/L!\!^!`!c!e!g!i!l!n!p!r v x z |  rz~||w"[!\ [[YXWWVVUtʀȀڀƀ'b < < < < < < < < < <8||K}0>0>o}'Ԓ)؀![!^!`!a!c!g!i!j!n!p!r t x z | ~ p}~||ߓ&a"]"\ [[YXWWVVz뀡ဤȀ+e < < < < < < < < < < C̀||K}/>0>EV0A)ܤ![!\!`!a!c!e!i!j!l!p!r t v z | ~ r~||瀼5p#_"]"\ [[YXXWVi΀Ԁ̀܀߀"] < < < < < < < < < <"]||K} d-`.SEV0A)ܤ![!\!^!a!c!e!g!j!l!n!p t v x | ~ r~||R$_#_"]"\!\[YXXWWȀ瀬W = < < < < < < < < =_||'_~ d e._m6Ԓ(ڀ!Y!\!^!`!c!e!g!i!l!n!p!r v x z | r~||}+f$_#_"]"\!\[YXXJv΀Ԁ߀ր€΀I +> = < < < < < < <I؀||'_~ d e f+1 m/J/J!Y![!^!`!a!c!g!i!j!n!p!r t x z | ~r~||;v$`$`#_"]"\!\[YY*b€w ? +> +> += < < < < < <:t||(a~ e f h++P ƎEa'ƀ"Y![!\!`!a!c!e!i!j!l!n!r t v z | ~u~||f+f$`$`#_"]"\!\ [YYڀ += < < < <Gߗ||(c~ e f h j++Fs -d]Ǝ]9,Ȑ"W![!\!^!a!c!e!g!j!l!n!p t v x | ~u~||D}&a$`$`#_"]"]!\ [Y]ЀʀЀ〬S A @ ? +? +> += < < =5p||)f~ d f h il++·Ȁ9j  9Pက!g ^!\!^!`!c!e!g!i!l!n!p!r v x z |w~||v2m&a$`$`$_"]"]!\ ['`߀e B B A @ ? +? +> += =Oߓ||+h~ d f h ijm++   z n g!c!c!g!i!j!n!p!r t x z |w~||N'b&a%a$`$_"]"]!\ [WƀڀȀЀ܀R C B B A @ @ +? +> ByS܀||1~+ h ilmoqstvyz|y4 -d p~||ЀsUPG;v1l)e$` [[YXXW["])e0l;tA|Km؀||2~ d倡ڀ܀܀܀j€stvwz|}pʀဦ့ҀЦ€ܹЀ p~||Ҁw]PNKKF?y?zD}GFEIWwڀ||2~ eڀڀڀڀڀڀj€tvwz|}pʀဤဤဤ߀̀У p~||߀ߓtppopqᗺhv}hv}4~ f i jlopqtvwy|}Ew~hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hv}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hy}hv}hv}hv}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}ly}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/autotests/read/hdr/orientation4.hdr.json b/autotests/read/hdr/orientation4.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation4.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation5.hdr b/autotests/read/hdr/orientation5.hdr new file mode 100644 index 0000000..d4b7f70 --- /dev/null +++ b/autotests/read/hdr/orientation5.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + ++X 480 +Y 160 +؃VQe::R;Ԥt^b|KZ|KZ|{e?^v}rX~)f~Vgb|ص{tt|Og|Ŝ~{Vo|DceC}ͱy|by}zЀ{؈=峀F'~u~Ni֬}?{gb|ε{+A}?րHoៀ9'~1#~0ڐᾈok|Oo|$ %)7}kg|گ}h~#T~(a~wZ~}|l}to|Vt||vz{l}n|h}a〼dvA:}A:}A:}A:}A:}A:}A:}A:}A:}+؀>~Ok| @BBBBaA5b}\N}{嬀@'~2$~;媀<7}Og|!{)-C}A7}ʕzZ~)k~{)c~ٙu~{{fw|g|o{{:[V>}Ԫ?Ā{}|,{{{zaw~WwX嬀@'~2$~;媀<7}Og|!{)-C}A7}ʕzZ~)k~{)c~ٙu~{{fw|ڀzzg|o{{ž^eRQNa|m\Qz:[V>}Ԫ?Ā{}|zQQQQQQ~%XQj,{{{zaw~ĀTQ^ìs΀ 5QQWQ1zWwXPiQjSQTԀʀQ^9~QNVQbv؀QRĈĈĈĈĈĈĈĈĈ\Q΀,fQ4p؀QR)~{{{{{{{{TQ΀QQƀQaʒf)2~:Ԁ^Q!QnsQ-}v(|QjNQQ?rQ;q{Ҁ([QjgQVm֚ҾrxQTk|h\QV`܀RQQQQQQ5|?cgb|8444444F7}=~`Fғm~#N~K{w[`t߹|B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`}|}DjZ<~{QQQQQQQQQQQQQQQQQQQQQQOg|Ԁ{ƣZt|S$ڀlQY :IQ€E 7VQ^w`ȀUĀSĀSĀSĀSĀSĀSĀ\v}ŧ@p~R+~\T"Kr~R%ҀzȀRnRt4;):}{):}vڀQ0q+lQjKQ܀߀QF\QQ[            VQ߀QV):}{)~nQQnjH#K~+aQ,\еʯ,\Q+ayb}lTQTVaȃ᳀Ā߱TQT{HրTQQQQQQQQQTK؀Hl}v:~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{j @RQQQQQRBs7V{>7}.!~.!~.!~.!~.!~.!~~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{="߀؀#߀?뀺D؀; $ $ $ $ $ $~ly}hv}4~2~2~1~1}~1z~/w~/u~.u~.r~,p~,m~+m~+k~+h~+h~)f~(c~(a~'_~'_~K}K}K}K}H}H}F}C}C}C}A}A}F}P}P}N}K}K}H}{{{{{~ly}hv} f e d|@~}}}}}v}r}{{{{{麀ں:Ҩ$ڼ<ƀ~ly}hv} iڀr}{{{{{ҒƦqmŸq΋A{{{{^b|J~ly}hv} jڀ++***^~~~~o}{{{{{ҀYaVQQQQQTXaԀxKZ|Vj瀜hRKZ|[D~ly}hv}lڀڀ h f e^}}}}}}o}{{{{{к1\QQQQQQQQQ9ayb}t|l}~ly}hv}oڀ܀ i h f e d}}}}}}}o}{{{{{6eQ[zҀWQc9PRQHt{ν{~ly}hv}pڀ܀l j h f e d@~}}}}}}}l}{{{{{jyQlQcQ߀TQAY}ͣqYAY}~ly}hv}qڀ܀ml j i h e d}}}}}}y}l}{{{{{DQìQc/lQVO|<7}ңCҤDC:}Oz~ly}hv}tj€j€oml j i h f eF~}}}}}}}y}l}{{{{{^RQcրQ c9{^b|>7}^b|{5~ly}hv}vtsqomlj i h f ev}}}}}}}}y}r}o}h}{{{{{YRQcQROS4SL߀~ly}hv}wvtsqpolj i h f e dK~}}}}}}}}v}r}l}h}{{{{{pQ€QcQT؂܀~ly}hv}ywvtsqpoml i h f e d j}}}}}}}y}v}o}l}h}{{{{{+aQ|QcҀQe〔\A}܀܀܀܀~ly}hv}|zwvtsqpoml j i f e d}}}}}}}}}y}v}o}l}e}{{{{{TQcjpҒQcQ4#>7}{{{{{{{(~ҡb~ly}hv}}|zywvsqpoml j i h f dF~}}}}}}}}}y}r}o}h}e}{{{{{?΀RQQQQcQEzƀƀ{jƀƀƀƀt;~}_}~ly}hv}}|zywvtspoml j i h f e}}}}}}}}}}v}r}l}h}e}{{{{{N 5QQQcB ={{~ly}hv}}|zywvtsqpmlj i h f e dK~}}}}}}}}y}v}r}l}h}b}{{{{{||0$-$~Ѐ)B~~ly}hv}|zywvtsqpomj i h f e d}}}}}}}}}y}v}o}l}e}b}{{{{{|~ly}hv}}|ywvtsqpoml j h f e dR~}}}}}}}}}}y}r}o}h}e}b}{{{{{|~ly}hv}}|zywtsq+~}}}}}v}r}o}h}e}_}{{{{{|ȎpfB[x@[ed~ly}hv}}|zywvt+~}y}r}o}l}}}}}}{{{{{|еEaQQQQQQQ0\~ly}hy}}|zywv+~v}r}l}h}r}r}}}}}}{{{{{|RQQR\c\RQQQ~ly}hy}}|zyw+~o}l}e}l}r}o}y}}y}v}{{{{{|̀VQa,߀0cQR€ڎƋ KJl~ly}hy}}|y+~h}e}b}v}r}o}l}y}r}o}{{{{{|UmQjrQ局8{{{{{{@'~ʃ~ly}hy}}|+++++-`/>0>0>r~~~}b}_}o}v}r}l}h}h}l}h}{{{{{|9~QR`Q0vЀ<%~Ob|Jqz\'7}C:}֬~ly}hy}}++++1._.S0>0>0>0>~~~}\}_}y}v}o}l}h}b}e}b}{{{{{|[QրQVȕtK^|p܀Ok|jR~ly}hy}+~V}v}y}r}o}l}e}b}\}\}{{{{{|VQڀڀQTy}Rv`e\}~ly}hy}+~e}}}y}r}o}h}e}_}\}V}{{{{{| rQƀQe{Ž{~ly}hy}$܀܀܀倀္mEVEVo}Ԁ~}}}}v}r}l}h}b}_}\}V}{{{{{|8Qb|sQ6{{~ly}hy},܀܀倀P 60A0A' Rd~}y}v}o}l}h}b}_}Y}V}{{{{{|AvV1eTQO_}}t\Y}~ly}hy}-,Fs mo"EYi}}}}}}}y}r}o}h}{{{{{|Tt+1/52H~ly}hy}-,·Ȁ Ǝؒ"ߣn}}}}}y}v}o}l}_}{{{{{|̀В~ly}hy}-,9j-d/E8P/F}}}}}v}r}l}h}b}H}{{{{{|#nH)絀~ly}hy}-- ]_v$/G%I}y}v}o}l}e}b}V}|{{{{{|μR"l߯߯߯߯߯߯߯߯ᵀҀoU@"~K^|Og|Ҋ_~~ly}hy}-@ Ǝ֒%/H&m~r}o}h}e}_}\}||{{{{{|ĀjlRQQQQQQQQQQQQQcġp_~^̤}Uzd{~ly}hy}-3`9]_w6/I''o}e}b}\}Y}N}||{{{{{|OwQQQQQQQQQQQQQQQQR|}|Zt|~ly}hy}-g-bP96Pj/J((a~_}\}V}S}||H}{{{{{|666Qj666666661Ԁ[QOOg|{͞T~~ly}hy}-#|-b,EaE`0؀/K))*v}S}P}K}||K}{{{{{|Q#nq؀Q\}{{{{{{kg|~ly}hy}.ƀ/J()))/Lƀ/N+++"Y}H}||H}N}{{{{{|Q#nRn|dddddd~ly}hy}~-d-dOڀܤܤ؀/O"Y!Y!Y!["W}}}}}{{{{{|IXƀ 9*f~ly}hy}E   -b.P![![!\!\!\k~}}}}{{{{{|؅؅؅؅؅؅؅؅؅؅؅؅؅~ly}hy}+   -b.Q!\!^!^!^!`!^}}}}{{{{{|й}lʭvƀ{{{{{{{{{{{{{~ly}hy}g      !g"W"Y!Y!Y![![![!\!\!\!^!^!^!`!`!`!a!a!a]~}}}{{{{{|­1\QQQTws|B+؀9܀#Ѐ )|F=܀;܀;܀;܀~ly}hy}"~       ^![![![!\!\!\!^!^!^!`!`!`!a!a!a!c!c!c!e!e}}}{{{{{|R`1cQQQQQQzZ~UzjDža~~ly}hy}T       z!\!\!\!^!^!^!`!`!`!a!a!a!c!c!c!c!e!e!e!g!g'\}}{{{{{||Q#}Q^9〗QtQQ{Ԁ{~ly}hy}|        n!^!^!`!`!`!a!a!a!c!c!c!c!e!e!e!g!g!g!i!i!i!j_h~}{{{{{QLcQt܀Q\b|yoS^|~ly}hy}8        g!`!a!a!a!c!c!c!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l ey}{{{{{9Q߀,tr[R9VN>}Ξ7ƀ孀w$kg|9W~ly}hy}N        ~!c!c!c!c!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p_~{{{{{^R\HVe,{{{{{.~ly}hy})        v!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r p{{{{{RVR3`ȀQ;dĀ`Āi~ly}hy}n        !n!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t{{{{{aQ̀Q7aRo߀Ā?̀~ly}hy}"         j!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t v v v x{{{{{5Q߀Q7a倊qiQ+z€tgb|.ڹ8ڹ8ڹ8ڹ8ܾ?ᡀ~ly}hy}pʀpʀO        |!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t v v v x xmm z{{{{{V€QQVntQ4\p|jVQ-p£qڦ%~{{{{{{{{{X8~ly}hy}ဦy          v!l!n!n!n!n!p!p!p!r!r!r t t t v v v x x x z z zңң |{{{{{_QQQQQQQQQQQQQ适选{e适适适m`ѡ|~ly}hy}ဦေ4         !t!n!p!p!p!r!r!r t t t v v v x x x z z z | | | ~ңң ~{{{{{VìA = = = = = = = = = ={Ob|~ly}hy}့Ҁ         !p!r!r!r t t t v v v x x x z z z | | | | ~ ~ ~ ңң€ {{{{{ Ѐ#~ly}hy}߀Ц€          z t t t v v v x x x z z z | | | | ~ ~ ~     ң€ң€ {{{{{~ly}hy}ܹ̀Ѐ-d-d-d-d-d     z v v x x x z z z | | | | ~ ~ ~    -d-d-d-d-dܷЀң€ {{{{{%o"~ly}hy}У     z x z z z | | | | ~ ~ ~        ң€ {{{{{ΎģqmpʆԀ!!!!!!{~V~ly}hy}E            z | | | | ~ ~ ~                    {{{{{ʀTQQQQQRÊܹL}ѭ|~ly}hv}w~p~p~p~m~m~m~m~m~m~m~z~z~z~w~w~w~u~u~r~r~r~r~p}~rz~pw~pw~mw~mu~mr~mr~mr~kp~km~hm~hm~hk~hh~fh~ff~{{{{{Ƴ,[QQQQQQQQQVе倞{~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{6eQTS5瀀9VTQ(\؀ȳSy}~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{pQViqYQbv؅].~@`KQ9vBQ>F<}F<}F<}F<}F<}ok|{ֵ{aQҀڀQ[;;;;;;;;;TQ܀߀QRjQȀ̀Q^0QsQ,         4iQ5VrQ~{/F}ORC뀼ҡj}|D΀o}p{€€€€€€€€€€€€€€€€€€€€€0؀QQQQQQQQQQQQQQQQQQQQQسDB$=֯?QQQQQQQQQQQQQQQQQQQQQĀT,~{Og|{+<}{Z,~Ѐ'''''''''''''''''''''cF1N}I؀{t1S}xW|d{|So|{{Hp~z6~鼀{}g|ΕtfC\xA[leȐ+<}Zb|,!~{Tu~־VgQQQQQQQRe\'܀LtRQQVQR^RQQT̀VQ @RQc*܀\Q%[րOiQLQc\Qbv1vQڀQcGQA[RQc߀Q\\RQcQR龀龀龀龀龀龀龀Ā%|QQcQW{{{{{{{{ߵ{$ܷi:qQAjĀQcʀQlƀƀƀƀƀƀƀĀR,~^b|֪|^QV醶vhQcyQ!S(]~h~q[QQQQcjQV}|aĀ^QQc$؀؀{ŪKl}zC:}R|!!!!!!!!2$~{@~'oĀ?̀tgb|.ڹ8ڹ8ڹ8ڹ8ܾ?ᡀ%~{{{{{{{{{X8适选{e适适适m`ѡ|{Ob| Ѐ#L$A$         -6YĈĈĈĈĈĈĈĈĈĈĈĈ{{{{{{{{{{{{€0ОJĈĈĈĈĈĈĈĈĈ7P}Rc~{{{{{{{{{؂܀〔\A}܀܀܀܀#>7}{{{{{{{(~ҡbƀƀ{jƀƀƀƀt;~}_}{{$~Ѐ)B~8w߳='7}{6$~w"ƀν{/Ѐ-KZ|bb|?ڷIc+Ky}v{H>}N]'~Og|Uʀ߀8_N}{Ok|,Ԩ8:gg|KZ|)+̀֯?Bog|{2~o{$~GQiiiiiiiiiiii{{{{{{{{{{{{ȋfeznltVaȬwԀ〸V$@~y6^QQQQQQQQTԀ緀X,~{;緀ပQQQQYcc[QQQQ0\ȭΈYA} D~fOg|A:}ОO򀀗QQ^ր. :QQ%YĀҞYok|>!H~{:߀QQW)̀RQcl5ֵ{(pQKZ|6$~w$\QR0wQQ{&Xl1~^b|QVnQJfCĀ:rQ)`>tQ;1|QhƀQ^!!!!!!!!!!!!^Q΀ЀЀ؀QT{+~+~{RQҀQQ΀؀QR{{[QĀQQ΀΀Q\{{pQzQQ΀Qng|ӻg|=QJiQQ΀`}Q6}}rRݩu~Hc~DvQ9xQQnvvvvvA`Q=px^b|گvƐX{ڀQ^QQQQQQQQQQt€ J~bb|F[嬀㡀L4ε{'Z~5 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4>{{{{{KZ|V$Ѐip,րddʎQQVxl߭kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|VQQQQQ6\L_ε|ր{VHHD{`HHHV{OvЀ 8TQQQQRzjmeЕ{〉{{Dl΀ 6RQQQQV|{〉{{=l΀ 9YQQ{〉{{ʐlenVQQ{〉{{܀̱|㊸VQQQT @(߀ivìqzTQQQWG1jlRQQQ[Q=QQW =ԀWQQVrvhԘm΀eQQQQ+[L_й؀ ;TQQQTzqƀ/!~1!~-GYQQQRnisf{c#BBBBBBBBg${Kl̀ 6VQQ{Ok|)7})7})7})7})7})7})7})7}Oo|{܀Ȉjep!WQQ{{ΒlejRQQQQYDG߀F߀ߓwأjvVQQQQR 6vЀV}R5p&a"[ R/]a'YQQQQQ^O0〹         f;v+f$_#_"]!\ [YVK=bھЀQQT ;րs 'Ob|K^|+~vD}+f$`$_#_"]"\ [YYXWR57_؀_Ȁ@pT܊N2m&a$`$`#_"]"\ [[YXWVVUP/LtbS}ʀ`D}'b&a$`$`#_"]"\ [[YXWVVUUSR,B΀ҒƦqmŸq΋{ı[:t'b&a$`$`#_"]"\!\[YXWWVUUSRQPG.zМҀYaVQQQQQTXaԀ\}5ܺBffffff؀W1m'b&a%a$`#_"]"\!\[YXWWVVUSRQQPOI%pȆк1\QQQQQQQQQ9aUƀOg|{{{{{{{րW0l'b&a%a$`$_"]"\!\[YXWWVVUSRQQPONLH#ii6eQ[zҀWQc9PRQHtҟpeF}dB߀QQQQQڀX4p'b&a%a$`$_"]"]!\[YXXWVVUSRRQPONNLKFcʒjyQlQcQ߀TQ_H~e߀W:t'b'b%a$`$_"]"]!\ [YXXWVVUSRRQPONNLKJIB$gԱƀDQìQc/lQV{Ҁ]C}'b'b%a$`$_"]"]!\ [YYXWVVUSRRQPOONLKJJIH<1|^RQcրQ ck|tIڈO+f'b%a$`$_#_"]!\ [YY*bJvWiztbNw8iVOONLKJJIHHGe0[YRQcQRK|{.!~U4p'b&a$`$_#_"]"\ ['`]΀ƺĀ=pLKJJIHHGFA[pQ€QcQT'ƀ ######iE'b&a$`$`#_"]"\&_WЀ뀾€Ѐȗ2iJIHHGFFEl'n+aQ|QcҀQeԀR+f&a$`$`#_"]"\5jƀʀƀfKHGFFED CW`TQcjpҒQcQ4龀JៀYAz&a$`$`#_"]"\Gw΀ԀҐSFFED C Cj(l?΀RQQQQcQEz孀繀ܵok|{ŭ{jEЀQ-h%a$`#_"]"\HwԀȀȀRED C C B >QqN 5QQQcB =nWNr~ҟ~FI\hS}sD}%a$`$_"]"\4iڀĀ؎G C C B A @\60$-y}˳|̀{U0l$`$_"]"]'a倱ʀ_ C B A @ @ +:Hعʀ{{Hl}ҀP%`$_"]"]"]bƀʀڀ〭W A @ @ +? +>NIqt|r{R(;]wG$_"]"]!\=t逷q A @ +? +> +=\0~It{/#~!{H>}\>}f];v#_"]!\ [dЀ߀Ҁ瀯[ ? +> += =gLB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`m !!!!!!P1l"]"\ [YԀI +> +> = <8 FΜQQQQQQQQQQQQQQQ߀N)e"\ [[5mȀؐ +> = < < < Fjh'؀lQV 8FR€SĀSĀSĀSĀSĀSĀSĀր㨀ЀߓK$` [[YYЀ倵΀逦K < < < <NKqQv€ă8,!~{{{)~q,w/֪atK [[YXfڀ΀Ā$_ < < < <Q:dQ#baC{%oЀv.{W<^kV~pF[YXWqր)d < < < <QIaQրo\}>|VeS}t|p?yYXWWwڀ2m < < < <\5!eQ{{{o?zXXWVpဤ.i < < < <[8RQb}޶p\}wdg|pD}XWVVm〤Ā'b < < < <QLaQ[ƀV\}ڵQwF4~Rp_C}a~qGWVVU\̀̀Y < < < <Q>f6QRxʀkg|{^b|>7}og|{^b|A:}og|{/H}ᗺF[VUSFw؀Ȁ܀ҀG < < < <NPs[ȀQQTrB[E\E\E\E\E\E\E\E\E\PPPPPPPPP]+ҀE"]USS!\ƀƀĀm < < < < < FtdQQQQQQQQQQQQQI)eSSRQЀ€րȀԀ8q < < < <8 FұĀW[ƀ 9 5 5 5 5 5 5 5 5 5 5ƀܼ?Ҫ$ں:龀W0lSRQPK|ȀȀ€ߦ€N < < < <cQF^b|{{{^b|Gw;tRQPPW•ڀƀ؀Bz < < < < <V?pKZ|HY倦{`lK^|\CڀA|SQPON4lȀ܀ƀȀܚG < < < < < K]nipրhY}{jl}K"]PONLLfЀ߀܀+f < < < < <7I؀QQTی{{Ž{m5pONNLKOȒ逨ƀ܀;t +? < < < < <VL +3QQQQ5\jeᵀ_}E{Sk|؀>yXNLKJIUڣ߀€ʀS B < < < < <9 Iphʀ^QQQRpv߀R|{2$~0{ӻr}S.iLKJIIHRỳڀ=v +? < < < < < <\0tJPWQQQVʕQր%+:}K^|>UIw€܀;vRJJIHHGIY܀ЀЀօ%a +? < < < < < <9 Iv1 ATQQQB`whf/jJIHHGFEEReܣ7pG < < < < < < < <\/t'߀ AWQQ?y [HHGFEE D C BS +> = < < < < < < < < < < < < < < < < <\8~܀vtRQQQcրU"]ED C C B A @ ? +? +> = < < < < < < < < < < < < < < < < <c\؀ҾۊTQQQWUX)~K}BzV C C B A @ ? +? +> += < < < < < < < < < < < < < < < < <7TЬYa)[QQQR <,߀,K^|{+ ~V؊=wO B A @ @ +? +> += < < < < < < < < < < < < < < < < <7T̗QQQ`tЀ(ʀ-O^|{1#~_ߗ?yQ @ @ +? +> += < < < < < < < < < < < < < < < < <7YΤVKH(̀.O^|{hᡀH[ @ +> += < < < < < < < < < < < < < < < < <c/vЀ-Ѐ?KZ|{m&a B = < < < < < < < < < < < < < < <9Vp嬀t"{KZ|(ԀUIw€NQVƤQc€Q"vi AQQ.[pQchQ*_{:5}.|؃ ?QQQQcNQmʀ@܀FK^|{F:} ʒ&ᡀ:G +4arjjG߀Q#'7}{ЀҤ2$'~{ddʎᜀw#Zb|O^|'€QQVxl߭{)7}64րVQQQQQ6\L_ε|ր"KZ|bb|"j؅OvЀ 8TQQQQRzjmeЕ2Ԁ &-C}{%~0طADl΀ 6RQQQQV|p*b|{=l΀ 9YQQww.>7}{+<}3ʐlenVQQ/<7}{Ob|#ei܀̱|㊸VQQQT @(߀EF߀̀qzTQQQWG1܀娀րjlRQQQ[Q=ҡO{{{6$~ҡQQQW =ԀWY{ `{e9{ĎeQQVrvhԘ֠y}9x{5cfN~m΀eQQQQ+[L_й{{y{؀ ;TQQQTzqƀA_}͓{{-GYQQQRnisf`^b|>ֳ/{Sv}Kl̀ 6VQQJOk|{{~t^܀Ȉjep!WQQsSΒlejRQQQQYDأjvVQQQQR 6vЀV         'YQQQQQ^O0〹0 >~{/F}QQT ;րsҡj}|D΀_Ȁ@o}p{0؀ \ No newline at end of file diff --git a/autotests/read/hdr/orientation5.hdr.json b/autotests/read/hdr/orientation5.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation5.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation6.hdr b/autotests/read/hdr/orientation6.hdr new file mode 100644 index 0000000..dddf313 --- /dev/null +++ b/autotests/read/hdr/orientation6.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + +-X 480 +Y 160 +0؀{_Ȁ@o}pQQT ;րsҡj}|D΀'YQQQQQ^O0〹0 >~{/F}أjvVQQQQR 6vЀV         ΒlejRQQQQYD܀Ȉjep!WQQsSKl̀ 6VQQJOk|{{~t^-GYQQQRnisf`^b|>ֳ/{Sv}؀ ;TQQQTzqƀA_}͓{{m΀eQQQQ+[L_й{{y{QQVrvhԘ֠y}9x{5cfN~QQW =ԀWY{ `{e9{ĎejlRQQQ[Q=ҡO{{{6$~ҡQ̀qzTQQQWG1܀娀ր܀̱|㊸VQQQT @(߀EF߀ʐlenVQQ/<7}{Ob|#ei=l΀ 9YQQww.>7}{+<}3Dl΀ 6RQQQQV|p*b|{OvЀ 8TQQQQRzjmeЕ2Ԁ &-C}{%~0طAVQQQQQ6\L_ε|ր"KZ|bb|"j؅QQVxl߭{)7}64րddʎᜀw#Zb|O^|'€ЀҤ2$'~{:G +4arjjG߀Q#'7}{ ?QQQQcNQmʀ@܀FK^|{F:} ʒ&ᡀ AQQ.[pQchQ*_{:5}.|؃NQVƤQc€Q"vi0QQc߀Q[Qր%+:}K^|>UIw€aQQcQRR|{2$~0{ӻr}VTQcQW_}E{Sk|%jQQcbQ1z{{Ž{xQ'lQc|QhY}{jl}ƷRRv€Qc CQR€pKZ|HY倦{`lK^|\CQQW :QVD 5RQQF^b|{{{^b|GvpTQQQQQQQT|tƀܼ?Ҫ$ں:龀Āwhn6\"W0\lofC؀a;܀;܀;܀;܀;܀;܀;܀;܀;܀}|Ǩ}{{{{{{{{{̀؅㣀؅؅؅؅؅؅؅؅؅؀_"] C8l#Om2逤fߗ:tI = < < < < <7iBjxQeQQQQQQQQQQQQQQQ{{oߓ5pG < < < < < < < < < <8aEl%aQVQQQQQQQQQQQQQQQ㤀o{{ yԀ += < < < < < < < < < < < < < < < < <c/vЀ-Ѐ?KZ|{?yQ @ @ +? +> += < < < < < < < < < < < < < < < < <7YΤVKH(̀.O^|{hᡀ=wO B A @ @ +? +> += < < < < < < < < < < < < < < < < <7T̗QQQ`tЀ(ʀ-O^|{1#~_ߗBzV C C B A @ ? +? +> += < < < < < < < < < < < < < < < < <7TЬYa)[QQQR <,߀,K^|{+ ~V؊U"]ED C C B A @ ? +? +> = < < < < < < < < < < < < < < < < <c\؀ҾۊTQQQWUX)~K}w)eFFED C B B A @ ? +> +> = < < < < < < < < < < < < < < < < <\8~܀vtRQQQcրƀ6qLGFFE D C B B A @ ?IW"]+e'bWUG < < < < < < < < < < < <NBf€}iegQQQR A?y [HHGFEE D C BSUIw€؀>yXNLKJIUڣ߀€ʀS B < < < < <9 Iphʀ^QQQRpv߀R|{2$~0{ӻr}m5pONNLKOȒ逨ƀ܀;t +? < < < < <VL +3QQQQ5\jeᵀ_}E{Sk|K"]PONLLfЀ߀܀+f < < < < <7I؀QQTی{{Ž{ڀA|SQPON4lȀ܀ƀȀܚG < < < < < K]nipրhY}{jl}w;tRQPPW•ڀƀ؀Bz < < < < <V?pKZ|HY倦{`lK^|\CW0lSRQPK|ȀȀ€ߦ€N < < < <cQF^b|{{{^b|GI)eSSRQЀ€րȀԀ8q < < < <8 FұĀW[ƀ 9 5 5 5 5 5 5 5 5 5 5ƀܼ?Ҫ$ں:龀E"]USS!\ƀƀĀm < < < < < FtdQQQQQQQQQQQQQᗺF[VUSFw؀Ȁ܀ҀG < < < <NPs[ȀQQTrB[E\E\E\E\E\E\E\E\E\PPPPPPPPP]+ҀqGWVVU\̀̀Y < < < <Q>f6QRxʀkg|{^b|>7}og|{^b|A:}og|{/H}pD}XWVVm〤Ā'b < < < <QLaQ[ƀV\}ڵQwF4~Rp_C}a~o?zXXWVpဤ.i < < < <[8RQb}޶p\}wdg|p?yYXWWwڀ2m < < < <\5!eQ{{{pF[YXWqր)d < < < <QIaQրo\}>|VeS}t|tK [[YXfڀ΀Ā$_ < < < <Q:dQ#baC{%oЀv.{W<^kV~ߓK$` [[YYЀ倵΀逦K < < < <NKqQv€ă8,!~{{{)~q,w/֪a߀N)e"\ [[5mȀؐ +> = < < < Fjh'؀lQV 8FR€SĀSĀSĀSĀSĀSĀSĀր㨀ЀP1l"]"\ [YԀI +> +> = <8 FΜQQQQQQQQQQQQQQQ];v#_"]!\ [dЀ߀Ҁ瀯[ ? +> += =gLB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`m !!!!!!wG$_"]"]!\=t逷q A @ +? +> +=\0~It{/#~!{H>}\>}fҀP%`$_"]"]"]bƀʀڀ〭W A @ @ +? +>NIqt|r{R(;]U0l$`$_"]"]'a倱ʀ_ C B A @ @ +:Hعʀ{{Hl}sD}%a$`$_"]"\4iڀĀ؎G C C B A @\60$-y}˳|̀{ЀQ-h%a$`#_"]"\HwԀȀȀRED C C B >QqN 5QQQcB =nWNr~ҟ~FI\hS}YAz&a$`$`#_"]"\Gw΀ԀҐSFFED C Cj(l?΀RQQQQcQEz孀繀ܵok|{ŭ{jEԀR+f&a$`$`#_"]"\5jƀʀƀfKHGFFED CW`TQcjpҒQcQ4龀JៀiE'b&a$`$`#_"]"\&_WЀ뀾€Ѐȗ2iJIHHGFFEl'n+aQ|QcҀQeU4p'b&a$`$_#_"]"\ ['`]΀ƺĀ=pLKJJIHHGFA[pQ€QcQT'ƀ ######ڈO+f'b%a$`$_#_"]!\ [YY*bJvWiztbNw8iVOONLKJJIHHGe0[YRQcQRK|{.!~]C}'b'b%a$`$_"]"]!\ [YYXWVVUSRRQPOONLKJJIH<1|^RQcրQ ck|tI߀W:t'b'b%a$`$_"]"]!\ [YXXWVVUSRRQPONNLKJIB$gԱƀDQìQc/lQV{ҀڀX4p'b&a%a$`$_"]"]!\[YXXWVVUSRRQPONNLKFcʒjyQlQcQ߀TQ_H~eրW0l'b&a%a$`$_"]"\!\[YXWWVVUSRQQPONLH#ii6eQ[zҀWQc9PRQHtҟpeF}dB߀QQQQQ؀W1m'b&a%a$`#_"]"\!\[YXWWVVUSRQQPOI%pȆк1\QQQQQQQQQ9aUƀOg|{{{{{{{[:t'b&a$`$`#_"]"\!\[YXWWVUUSRQPG.zМҀYaVQQQQQTXaԀ\}5ܺBffffff`D}'b&a$`$`#_"]"\ [[YXWVVUUSR,B΀ҒƦqmŸq΋{ı܊N2m&a$`$`#_"]"\ [[YXWVVUP/LtbS}ʀvD}+f$`$_#_"]"\ [YYXWR57_؀_Ȁ@pTf;v+f$_#_"]!\ [YVK=bھЀQQT ;րs 'Ob|K^|+~}R5p&a"[ R/]a'YQQQQQ^O0〹         ߓwأjvVQQQQR 6vЀVΒlejRQQQQYDG߀F߀܀Ȉjep!WQQ{{Kl̀ 6VQQ{Ok|)7})7})7})7})7})7})7})7}Oo|{-GYQQQRnisf{c#BBBBBBBBg${؀ ;TQQQTzqƀ/!~1!~m΀eQQQQ+[L_йQQVrvhԘQQW =ԀWjlRQQQ[Q=̀qzTQQQWG1܀̱|㊸VQQQT @(߀iviʐlenVQQ{〉{{=l΀ 9YQQ{〉{{Dl΀ 6RQQQQV|{〉{{OvЀ 8TQQQQRzjmeЕ{〉{{VQQQQQ6\L_ε|ր{VHHD{`HHHV{QQVxl߭kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|ddʎ$Ѐip,ր5 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4>{{{{{KZ|VڀQ^QQQQQQQQQQt€ J~bb|F[嬀㡀L4ε{'Z~DvQ9xQQnvvvvvA`Q=px^b|گvƐX{=QJiQQ΀`}Q6}}rRݩu~Hc~pQzQQ΀Qng|ӻg|[QĀQQ΀΀Q\{{RQҀQQ΀؀QR{{^Q΀ЀЀ؀QT{+~+~{1|QhƀQ^!!!!!!!!!!!!rQ)`>tQ;QVnQJfCĀ:$\QR0wQQ{&Xl1~^b|QQW)̀RQcl5ֵ{(pQKZ|6$~w򀀗QQ^ր. :QQ%YĀҞYok|>!H~{:߀ပQQQQYcc[QQQQ0\ȭΈYA} D~fOg|A:}ОOy6^QQQQQQQQTԀ緀X,~{;緀ȋfeznltVaȬwԀ〸V$@~{{{{{{{{{{{{iiiiiiiiiiiiQ{$~G֯?Bog|{2~oԨ8:gg|KZ|)+̀߀8_N}{Ok|,v{H>}N]'~Og|Uʀ/Ѐ-KZ|bb|?ڷIc+Ky}'7}{6$~w"ƀν{8w߳=$~Ѐ)B~{{ƀƀ{jƀƀƀƀt;~}_}#>7}{{{{{{{(~ҡb〔\A}܀܀܀܀؂܀7P}Rc~{{{{{{{{{€0ОJĈĈĈĈĈĈĈĈĈ{{{{{{{{{{{{ĈĈĈĈĈĈĈĈĈĈĈĈ-6YL$A$         Ѐ#{Ob|适选{e适适适m`ѡ|%~{{{{{{{{{X8tgb|.ڹ8ڹ8ڹ8ڹ8ܾ?ᡀĀ?̀'o!!!!!!!!2$~{@~zC:}R|ŪKl}aĀ^QQc$؀؀{q[QQQQcjQV}|^QV醶vhQcyQ!S(]~h~:qQAjĀQcʀQlƀƀƀƀƀƀƀĀR,~^b|֪|%|QQcQW{{{{{{{{ߵ{$ܷi\RQcQR龀龀龀龀龀龀龀Ā[RQc߀Q\1vQڀQcGQAOiQLQc\Qbv̀VQ @RQc*܀\Q%[րRQQVQR^RQQT־VgQQQQQQQRe\'܀LtΕtfC\xA[leȐ+<}Zb|,!~{Tu~Hp~z6~鼀{}g|So|{{|d{|'''''''''''''''''''''cF1N}I؀{t1S}xWQQQQQQQQQQQQQQQQQQQQQĀT,~{Og|{+<}{Z,~ЀQQQQQQQQQQQQQQQQQQQQQسDB$=֯?€€€€€€€€€€€€€€€€€€€€€0؀{o}pORC뀼ҡj}|D΀4iQ5VrQ~{/F}0QsQ,         jQȀ̀Q^TQ܀߀QRaQҀڀQ[;;;;;;;;;KQ9vBQ>F<}F<}F<}F<}F<}ok|{ֵ{~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{pQViqYQbv؅].~@`~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{6eQTS5瀀9VTQ(\؀ȳSy}~ly}hv}w~p~p~p~m~m~m~m~m~m~m~z~z~z~w~w~w~u~u~r~r~r~r~p}~rz~pw~pw~mw~mu~mr~mr~mr~kp~km~hm~hm~hk~hh~fh~ff~{{{{{Ƴ,[QQQQQQQQQVе倞{~ly}hy}E            z | | | | ~ ~ ~                    {{{{{ʀTQQQQQRÊܹL}ѭ|~ly}hy}У     z x z z z | | | | ~ ~ ~        ң€ {{{{{ΎģqmpʆԀ!!!!!!{~V~ly}hy}ܹ̀Ѐ-d-d-d-d-d     z v v x x x z z z | | | | ~ ~ ~    -d-d-d-d-dܷЀң€ {{{{{%o"~ly}hy}߀Ц€          z t t t v v v x x x z z z | | | | ~ ~ ~     ң€ң€ {{{{{~ly}hy}့Ҁ         !p!r!r!r t t t v v v x x x z z z | | | | ~ ~ ~ ңң€ {{{{{ Ѐ#~ly}hy}ဦေ4         !t!n!p!p!p!r!r!r t t t v v v x x x z z z | | | ~ңң ~{{{{{VìA = = = = = = = = = ={Ob|~ly}hy}ဦy          v!l!n!n!n!n!p!p!p!r!r!r t t t v v v x x x z z zңң |{{{{{_QQQQQQQQQQQQQ适选{e适适适m`ѡ|~ly}hy}pʀpʀO        |!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t v v v x xmm z{{{{{V€QQVntQ4\p|jVQ-p£qڦ%~{{{{{{{{{X8~ly}hy}"         j!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t v v v x{{{{{5Q߀Q7a倊qiQ+z€tgb|.ڹ8ڹ8ڹ8ڹ8ܾ?ᡀ~ly}hy}n        !n!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r!r!r t t t{{{{{aQ̀Q7aRo߀Ā?̀~ly}hy})        v!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p!p!p!p!r p{{{{{RVR3`ȀQ;dĀ`Āi~ly}hy}N        ~!c!c!c!c!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l!l!n!n!n!p_~{{{{{^R\HVe,{{{{{.~ly}hy}8        g!`!a!a!a!c!c!c!c!e!e!e!g!g!g!i!i!i!j!j!j!l!l ey}{{{{{9Q߀,tr[R9VN>}Ξ7ƀ孀w$kg|9W~ly}hy}|        n!^!^!`!`!`!a!a!a!c!c!c!c!e!e!e!g!g!g!i!i!i!j_h~}{{{{{QLcQt܀Q\b|yoS^|~ly}hy}T       z!\!\!\!^!^!^!`!`!`!a!a!a!c!c!c!c!e!e!e!g!g'\}}{{{{{||Q#}Q^9〗QtQQ{Ԁ{~ly}hy}"~       ^![![![!\!\!\!^!^!^!`!`!`!a!a!a!c!c!c!e!e}}}{{{{{|R`1cQQQQQQzZ~UzjDža~~ly}hy}g      !g"W"Y!Y!Y![![![!\!\!\!^!^!^!`!`!`!a!a!a]~}}}{{{{{|­1\QQQTws|B+؀9܀#Ѐ )|F=܀;܀;܀;܀~ly}hy}+   -b.Q!\!^!^!^!`!^}}}}{{{{{|й}lʭvƀ{{{{{{{{{{{{{~ly}hy}E   -b.P![![!\!\!\k~}}}}{{{{{|؅؅؅؅؅؅؅؅؅؅؅؅؅~ly}hy}~-d-dOڀܤܤ؀/O"Y!Y!Y!["W}}}}}{{{{{|IXƀ 9*f~ly}hy}.ƀ/J()))/Lƀ/N+++"Y}H}||H}N}{{{{{|Q#nRn|dddddd~ly}hy}.Y -bȐ'/JԒԒ/J)Ґ/L*++)OP}N}||H}K}{{{{{|Q#nVWjԀ+>}{{{{{{kg|~ly}hy}-#|-b,EaE`0؀/K))*v}S}P}K}||K}{{{{{|Q#nq؀Q\0>0>0>~~~}\}_}y}v}o}l}h}b}e}b}{{{{{|[QրQVȕtK^|p܀Ok|jR~ly}hy}}|+++++-`/>0>0>r~~~}b}_}o}v}r}l}h}h}l}h}{{{{{|9~QR`Q0vЀ<%~Ob|Jqz\'7}C:}֬~ly}hy}}|y+~h}e}b}v}r}o}l}y}r}o}{{{{{|UmQjrQ局8{{{{{{@'~ʃ~ly}hy}}|zyw+~o}l}e}l}r}o}y}}y}v}{{{{{|̀VQa,߀0cQR€ڎƋ KJl~ly}hy}}|zywv+~v}r}l}h}r}r}}}}}}{{{{{|RQQR\c\RQQQ~ly}hv}}|zywvt+~}y}r}o}l}}}}}}{{{{{|еEaQQQQQQQ0\~ly}hv}}|zywtsq+~}}}}}v}r}o}h}e}_}{{{{{|ȎpfB[x@[ed~ly}hv}}|ywvtsqpoml j h f e dR~}}}}}}}}}}y}r}o}h}e}b}{{{{{|~ly}hv}|zywvtsqpomj i h f e d}}}}}}}}}y}v}o}l}e}b}{{{{{|~ly}hv}}|zywvtsqpmlj i h f e dK~}}}}}}}}y}v}r}l}h}b}{{{{{||0$-$~Ѐ)B~~ly}hv}}|zywvtspoml j i h f e}}}}}}}}}}v}r}l}h}e}{{{{{N 5QQQcB ={{~ly}hv}}|zywvsqpoml j i h f dF~}}}}}}}}}y}r}o}h}e}{{{{{?΀RQQQQcQEzƀƀ{jƀƀƀƀt;~}_}~ly}hv}|zwvtsqpoml j i f e d}}}}}}}}}y}v}o}l}e}{{{{{TQcjpҒQcQ4#>7}{{{{{{{(~ҡb~ly}hv}ywvtsqpoml i h f e d j}}}}}}}y}v}o}l}h}{{{{{+aQ|QcҀQe〔\A}܀܀܀܀~ly}hv}wvtsqpolj i h f e dK~}}}}}}}}v}r}l}h}{{{{{pQ€QcQT؂܀~ly}hv}vtsqomlj i h f ev}}}}}}}}y}r}o}h}{{{{{YRQcQROS4SL߀~ly}hv}tj€j€oml j i h f eF~}}}}}}}y}l}{{{{{^RQcրQ c9{^b|>7}^b|{5~ly}hv}qڀ܀ml j i h e d}}}}}}y}l}{{{{{DQìQc/lQVO|<7}ңCҤDC:}Oz~ly}hv}pڀ܀l j h f e d@~}}}}}}}l}{{{{{jyQlQcQ߀TQAY}ͣqYAY}~ly}hv}oڀ܀ i h f e d}}}}}}}o}{{{{{6eQ[zҀWQc9PRQHt{ν{~ly}hv}lڀڀ h f e^}}}}}}o}{{{{{к1\QQQQQQQQQ9ayb}t|l}~ly}hv} jڀ++***^~~~~o}{{{{{ҀYaVQQQQQTXaԀxKZ|Vj瀜hRKZ|[D~ly}hv} iڀr}{{{{{ҒƦqmŸq΋A{{{{^b|J~ly}hv} f e d|@~}}}}}v}r}{{{{{麀ں:Ҩ$ڼ<ƀ~ly}hv}4~2~2~1~1}~1z~/w~/u~.u~.r~,p~,m~+m~+k~+h~+h~)f~(c~(a~'_~'_~K}K}K}K}H}H}F}C}C}C}A}A}F}P}P}N}K}K}H}{{{{{~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{="߀؀#߀?뀺D؀; $ $ $ $ $ $~ly}hv}hv}||||||||||||||||||||||||||}|y|y|t|t}|o}|oy|ky|kt|{{{{{{{{{j @RQQQQQRBs7V{>7}.!~.!~.!~.!~.!~.!~HրTQQQQQQQQQTK؀Hl}v:TQTVaȃ᳀Ā߱TQT{+aQ,\еʯ,\Q+ayb}lnQQnjH#K~VQ߀QV):}{)~\QQ[            KQ܀߀QFQ0q+lQjR%ҀzȀRnRt4;):}{):}vڀS$ڀlQY :IQ€E 7VQ^w`ȀUĀSĀSĀSĀSĀSĀSĀ\v}ŧ@p~R+~\T"Kr~QQQQQQQQQQQQQQQQQQQQQQOg|Ԁ{ƣZt|B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`}|}DjZ<~{ғm~#N~K{w[`t߹|֞!>7}=~`F]5VF}Ԫ?Ā{}|ڀzzg|o{{{{fw|zZ~)k~{)c~ٙu~<7}Og|!{)-C}A7}ʕ嬀@'~2$~;媀WwX,{{{zaw~:[V>}Ԫ?Ā{}|g|o{{{{fw|zZ~)k~{)c~ٙu~<7}Og|!{)-C}A7}ʕ嬀@'~2$~;媀{\N}aA5b}+؀>~Ok| @BBBBA:}A:}A:}A:}A:}A:}A:}A:}A:}a〼dvl}n|h}Vt||vz{}|l}to|h~#T~(a~wZ~ᾈok|Oo|$ %)7}kg|گ}ៀ9'~1#~0ڐ?րHoNi֬}?{gb|ε{+A}by}zЀ{؈=峀F'~u~Vo|DceC}ͱy|tt|Og|Ŝ~{rX~)f~Vgb|ص{Ԥt^b|KZ|KZ|{e?^v}؃VQe::R; \ No newline at end of file diff --git a/autotests/read/hdr/orientation6.hdr.json b/autotests/read/hdr/orientation6.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation6.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation7.hdr b/autotests/read/hdr/orientation7.hdr new file mode 100644 index 0000000..204c345 --- /dev/null +++ b/autotests/read/hdr/orientation7.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + +-X 480 -Y 160 +0؀{po}@_ȀD΀}|ҡjsր ;TQQ/F}{ >~00O^QQQQQ'Y         VvЀ 6RQQQQVvjأDYQQQQRjleΒSsQQ!WpjeȈ܀^~t{{Ok|JQQV 6l̀KSv}{ֳ/>^b|`sfniRQQQYG-ှ{{͓A_}ƀqzTQQQT ;؀{y{{йL_+[QQQQem΀fN~5c{9x֠y}ԘvhrVQQĎe{9e{` {YWԀ =WQQҡQ6$~{{{ҡO=Q[QQQRljր娀܀1GWQQQTzq̀F߀E(߀ @TQQQV㊸̱|܀ie#Ob|{<7}/QQVnleʐ3+<}{>7}.wwQQY 9l΀={b|*p|VQQQQR 6l΀DطA0%~{-C} &2ԀЕmezjRQQQQT 8vЀO؅j"bb|KZ|"րε|L_6\QQQQQV4ր6)7}{߭lxVQQ€'O^|Zb|#wᜀʎdd{'~$Ҥ2Ѐ{'7}#QG߀jjra +4G:ᡀʒ& F:}{K^|F@܀mʀQNcQQQQ ?؃|.:5}{*_QhcQp.[QQ Ai"vQ€cQƤVQNIw€>UK^|+:}%Qր[Q߀cQQ0r}ӻ{02$~{R|RQcQQaSk|{E_}WQcQTVŽ{{{1zQbcQQ%jl}j{hY}Q|cQ'lQx\CK^|l`{YHKZ|p€RQ CcQv€RRƷG^b|{{{^b|FQQR 5DVQ :WQQ龀ں:Ҫ$ܼ?ƀ|tTQQQQQQQTvpofl0\"W6\nwhĀ;܀;܀;܀;܀;܀;܀;܀;܀;܀aC؀{{{{{{{{{Ǩ}}|؅؅؅؅؅؅؅؅؅㣀؅̀f2週m#Ol8 C"]_؀o{{QQQQQQQQQQQQQQQeQx〓Bji7 < < < < < =I:tߗy {{o㤀QQQQQQQQQQQQQQQVQ%a뀒Ela8 < < < < < < < < < <G5pߓ!Ā#{{q㨀̱ṯṯṯṯṯṯṯṯṯṯṯṯṯṯtҺfeğ"g4 < < < < < < < < < < < < < =O @[Hᡀh{O^|.(̀HKVΤY7 < < < < < < < < < < < < < < < < < += +> +? @ @Q?yߗ_1#~{O^|-(ʀtЀ`QQQ̗T7 < < < < < < < < < < < < < < < < < += +> +? @ @ A BO=w؊V+ ~{K^|,,߀ <RQQQ)[YaЬT7 < < < < < < < < < < < < < < < < < += +> +? ? @ A B C CVBz}K)~XUWQQQTۊҾ؀\c < < < < < < < < < < < < < < < < < = +> +? ? @ A B C CDE"]UրcQQQRtv܀8~\ < < < < < < < < < < < < < < < < < = +> +> ? @ A B B CDEFF)ew ARQQQeg}i€BfN < < < < < < < < < < < <GUW'b+e"]WI ? @ A B B C DEFFGL6qƀQQtii᷀ҭ€ F8 < < < < < < < < <N/jYؒ߀΀wUK^|+:}%QրʕVQQQWPJ0t\ < < < < < < +?=vڀ倹̀yRHIIJKL.iSr}ӻ{02$~{R|߀vpRQQQ^hʀp I9 < < < < < BS့ʀ€߀ڣUIJKLNX>y؀Sk|{E_}ᵀje5\QQQQ +3LV < < < < < +?;t܀ƀȒOKLNNO5pmŽ{{{یTQQ؀I7 < < < < <+f܀瀹߀ЀfLLNOP"]Kl}j{hY}րpni] K < < < < <GܚȀƀ܀Ȁ〱4lNOPQSA|ڀ\CK^|l`{YHKZ|p?V < < < < 7}^b|{kg|ʀRxQ6>fQ < < < <Ỳ̀倦\UVVWGqa~_C}pRF4~wڵQV\}[ƀQaLQ < < < <'bĀmVVWXD}pg|wd\}p޶b}QR8[ < < < <.ipVWXX?zo{{{Q!e5\ < < < <2mڀwWWXY?yp|teS}V>|o\}րQaIQ < < < <)dրqWXY[FpkV~^W<{.vЀo%{aC#bQ:dQ < < < <$_Ā΀ڀfXY[ [Kt֪aw/q,)~{{{,!~ă8v€QKqN < < < <K΀ЀYY[ [$`KߓЀ㨀րSĀSĀSĀSĀSĀSĀSĀR€F 8VQl'؀hj F < < < = +>ؐာȀ5m[ ["\)eN߀QQQQQQQQQQQQQQQΜ F8 < = +> +>IԀY ["\"]1lP!!!!!! mB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`Lg = += +> ?[Ҁ߀Ѐd [!\"]#_;v]f\>}H>}{!/#~{It0~\ += +> +? @ Aq逭逤=t!\"]"]$_Gw;]R({rt|IqN +> +? @ @ AWڀʀƀb"]"]"]$_%`PҀHl}{{عʀH +: @ @ A B C_ʀဦ'a"]"]$_$`0lU{̀˳|y}-$0瀆6\ @ A B C CG؎Āڀ瀤4i"\"]$_$`%aD}shS}\IFҟ~Nr~nW =BcQQQ 5NqQ > B C CDERȀȀԀ逬Hw"\"]#_$`%a-hQЀjEŭ{{ok|ܵ繀孀EzQcQQQQR?΀(lj C CDEFFSҐԀ΀ဤGw"\"]#_$`$`&aAzYៀJ龀4QcQҒpcjQT`W CDEFFGHKfƀʀƀ5j"\"]#_$`$`&a+fRԀeQҀcQ|Q+a'nlEFFGHHIJ2iȗЀ€ЀW&_"\"]#_$`$`&a'bEi###### 'ƀTQcQ€Qp[AFGHHIJJKL=pƺĀ΀]'` ["\"]#_$_$`&a'b4pU.!~{K|RQcQRY0[eGHHIJJKLNOOV8iNwbtziWJv*bYY [!\"]#_$_$`%a'b+fOڈtIk| cQրcQR^1|<HIJJKLNOOPQRRSUVVWXYY [!\"]"]$_$`%a'b'bC}]Ҁ{VQ/lcQìQDԱƀ$gBIJKLNNOPQRRSUVVWXXY [!\"]"]$_$`%a'b'b:tW߀e_H~QTQ߀cQlQjyʒcFKLNNOPQRRSUVVWXXY[!\"]"]$_$`%a&a'b4pXڀQQQQQB߀deF}ҟpHtQRP9瀆cQWzҀ[Q6ei#iHLNOPQQRSUVVWWXY[!\"\"]$_$`%a&a'b0lWր{{{{{{{Og|Uƀ9aQQQQQQQQQ1\кȆ%pIOPQQRSUVVWWXY[!\"\"]#_$`%a&a'b1mW؀ffffffܺB5\}ԀXaTQQQQQVYaҀМ.zGPQRSUUVWWXY[!\"\"]#_$`$`&a'b:t[ı{΋ŸqmƦqҒ΀B,RSUUVVWXY[ ["\"]#_$`$`&a'bD}`ʀbS}Lt/PUVVWXY[ ["\"]#_$`$`&a2mN܊Tp@_Ȁ؀7_5RWXYY ["\"]#_$_$`+fD}v+~K^|Ob| 'sր ;TQQھЀ=bKVY [!\"]#_$_+f;vf         0O^QQQQQ'Y〪a/] R"[&a5pR}VvЀ 6RQQQQVvjأ〵wߓF߀G߀DYQQQQRjleΒ{{QQ!WpjeȈ܀{Oo|)7})7})7})7})7})7})7})7}Ok|{QQV 6l̀K{g$BBBBBBBBc#{sfniRQQQYG-ှ1!~뀜/!~ƀqzTQQQT ;؀йL_+[QQQQem΀ԘvhrVQQWԀ =WQQ=Q[QQQRlj1GWQQQTzq̀ivi(߀ @TQQQV㊸̱|܀{{{QQVnleʐ{{{QQY 9l΀={{{|VQQQQR 6l΀D{{{ЕmezjRQQQQT 8vЀO{VHHH`{DHHV{րε|L_6\QQQQQVkg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|߭lxVQQʎdd,րpi$ЀVKZ|{{{{{> +4 +4 +4 +4 +4 +4 +4 +4 +4 +45'Z~ε{4L㡀嬀[Fbb| J~t€QQQQQQQQQQ^Qڀ{ƐXگv^b|x=pQA`vvvvvnQQ9xQDvHc~ݩu~rR}}6Q`}΀QQJiQ=g|ӻg|nQ΀QQzQp{{\Q΀΀QQĀQ[{{RQ؀΀QQҀQR{+~+~{TQ؀ЀЀ΀Q^!!!!!!!!!!!!^QƀhQ1|;Q>t)`Qr:CĀJfQnVQ^b|1~l&X{QQ0wRQ$\w6$~KZ|Q(pֵ{l5cQR)̀WQQ߀:{!H~>ok|ҞYĀ%YQQ :.ဵր^QQОOA:}Og|f D~YA}Έȭ0\QQQQ[ccYQQQQ緀;{X,~緀ԀTQQQQQQQQ6^y@~V$ԀȬwVatlnzfeȋ{{{{{{{{{{{{iiiiiiiiiiiiQG$~{o2~{og|B֯?+̀)KZ|gg|:Ԩ8,Ok|{_N}8߀UʀOg|'~]NH>}{vKy}c+ڷI?bb|KZ|-/Ѐν{ƀw"6$~{'7}=߳w8)B~Ѐ$~{{}_};~tƀƀƀƀj{ƀƀҡb(~{{{{{{{>7}#܀܀܀܀\A}܀؂{{{{{{{{{Rc~7P}ĈĈĈĈĈĈĈĈĈОJ€0{{{{{{{{{{{{ĈĈĈĈĈĈĈĈĈĈĈĈ6Y-         A$L$#Ѐ Ob|{ѡ|`m瀂适适适e{适X8{{{{{{{{{%~ᡀܾ?ڹ8ڹ8ڹ8ڹ8.gb|t̀Ā?o'@~{2$~!!!!!!!!R|C:}zKl}Ū{؀$؀cQQ^aĀ}|VQjcQQQQ[qh~(]~!SQycQvh醶VQ^֪|^b|,~RĀƀƀƀƀƀƀƀlQʀcQĀAjQ:qܷi$ߵ{{{{{{{{{WQcQQ%|Ā龀龀龀龀龀龀龀RQcQR\\Q߀cQR[AQGcQڀQ1vbvQ\cQLQOiր%[Q\*܀cQR @QV̀TQQR^RQVQQRtL܀'\ReQQQQQQQVg־Tu~{,!~Zb|+<}ȐleA[xC\tfΕg|}{鼀z6~Hp~{{So||{d|xW1S}t倱{I؀1N}cF'''''''''''''''''''''ЀZ,~{+<}{Og|{T,~ĀQQQQQQQQQQQQQQQQQQQQQ֯?=$BسDQQQQQQQQQQQQQQQQQQQQQ0؀€€€€€€€€€€€€€€€€€€€€€{po}D΀}|ҡjCRO뀐/F}{ >~0QB9vQK@`].~؅bvQYqiVQp{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~Sy}ȳ؀(\QTV9逃5STQ6e{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~{еVQQQQQQQQQ,[Ƴ{{{{{ff~fh~hh~hk~hm~hm~km~kp~mr~mr~mr~mu~mw~pw~pw~rz~p}~r~r~r~r~u~u~w~w~w~z~z~z~m~m~m~m~m~m~m~p~p~p~w~hv}ly}~ѭ|L}ܹÊRQQQQQTʀ{{{{{                     ~ ~ ~ | | | | z           Ehy}ly}~~V{!!!!!!ԀʆpmģqΎ{{{{{ ң€         ~ ~ ~ | | | | z z z x z    Уhy}ly}~o"%{{{{{ ң€ܷЀ-d-d-d-d-d     ~ ~ ~ | | | | z z z x x x v v z    -d-d-d-d-dܹЀ̀hy}ly}~{{{{{ ң€ң€      ~ ~ ~ | | | | z z z x x x v v v t t t z         Ц€߀hy}ly}~#Ѐ {{{{{ ң€ң  ~ ~ ~ | | | | z z z x x x v v v t t t!r!r!r!p         Ҁhy}ly}~Ob|{ = = = = = = = = = =AìV{{{{{ ~ңң ~ | | | z z z x x x v v v t t t!r!r!r!p!p!p!n!t         4ဤhy}ly}~ѡ|`m瀂适适适e{适QQQQQQQQQQQQQ_{{{{{ |ңң z z z x x x v v v t t t!r!r!r!p!p!p!n!n!n!n!l v         yဤhy}ly}~X8{{{{{{{{{%~ڦ£q-pQV|jp4\QtnVQQV€{{{{{ zmm x x v v v t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j|        Opʀpʀhy}ly}~ᡀܾ?ڹ8ڹ8ڹ8ڹ8.gb|t+z€Qqi7aQ߀Q5{{{{{ x v v v t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i j        "hy}ly}~̀Ā?o߀R7aQ̀Qa{{{{{ t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!n        nhy}ly}~iĀ`Ād;QȀ3`RVR{{{{{ p!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c v       )hy}ly}~.{{{{{,eVH\R^{{{{{_~!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c!c!c!c!c ~       Nhy}ly}~9Wkg|w$孀ƀΞ7N>}9VR[r,t߀Q9{{{{{y} e!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c!c!c!c!a!a!a!` g       8hy}ly}~^|oSyb|\Qt܀QcLQ{{{{{}_h~!j!i!i!i!g!g!g!e!e!e!c!c!c!c!a!a!a!`!`!`!^!^ n       |hy}ly}~{Ԁ{QQtQ뀗9^Q}#Q||{{{{{}}'\!g!g!e!e!e!c!c!c!c!a!a!a!`!`!`!^!^!^!\!\!\ z      Thy}ly}~Dža~jUzzZ~QQQQQQ1cR`|{{{{{}}}!e!e!c!c!c!a!a!a!`!`!`!^!^!^!\!\!\![![![ ^      "~hy}ly}~;܀;܀;܀=܀F| )#Ѐ9܀+؀B|wsTQQQ1\­|{{{{{}}}]~!a!a!a!`!`!`!^!^!^!\!\!\![![![!Y!Y"Y"W!g      ghy}ly}~{{{{{{{{{{{{{ƀʭvlй}|{{{{{}}}}!^!`!^!^!^!\.Q-b   +hy}ly}~؅؅؅؅؅؅؅؅؅؅؅؅؅|{{{{{}}}}k~!\!\!\![![.P-b   Ehy}ly}~*f 9XƀI|{{{{{}}}}}"W![!Y!Y"Y/O؀ܤܤڀO-d-d~hy}ly}~dddddd|nR#nQ|{{{{{N}H}||H}}"Y+++/Nƀ/L)))(/Jƀ.hy}ly}~kg|{{{{{{+>}jԀWV#nQ|{{{{{K}H}||N}P})O++*/LҐ)/JԒԒ/J'Ȑ-b Y.hy}ly}~瀐h}Ć'[{d֯7F'~0>0>0>.S._1++++}hy}ly}~֬C:}'7}\zqJOb|<%~Ѐ0vQ`RQ9~|{{{{{h}l}h}h}l}r}v}o}_}b}}~~~r0>0>/>-`+++++|}hy}ly}~ʃ@'~{{{{{{8局QrjQUm|{{{{{o}r}y}l}o}r}v}b}e}h}~+y|}hy}ly}~lJKƋ ڎ€RQc0,߀aQV̀|{{{{{v}y}}y}o}r}l}e}l}o}~+wyz|}hy}ly}~QQQR\c\RQQR|{{{{{}}}}}r}r}h}l}r}v}~+vwyz|}hy}ly}~0\QQQQQQQEaе|{{{{{}}}}}l}o}r}y}}~+tvwyz|}hv}ly}~ed@[xB[pfȎ|{{{{{_}e}h}o}r}v}}}}}}~+qstwyz|}hv}ly}~|{{{{{b}e}h}o}r}y}}}}}}}}}}}R~ d e f h jlmopqstvwy|}hv}ly}~|{{{{{b}e}l}o}v}y}}}}}}}}}} d e f h ijmopqstvwyz|hv}ly}~)B~Ѐ$~-$0瀆||{{{{{b}h}l}r}v}y}}}}}}}}}K~ d e f h ijlmpqstvwyz|}hv}ly}~{{ =BcQQQ 5N{{{{{e}h}l}r}v}}}}}}}}}}} e f h i jlmopstvwyz|}hv}ly}~}_};~tƀƀƀƀj{ƀƀEzQcQQQQR?΀{{{{{e}h}o}r}y}}}}}}}}}}F~ d f h i jlmopqsvwyz|}hv}ly}~ҡb(~{{{{{{{>7}#4QcQҒpcjQT{{{{{e}l}o}v}y}}}}}}}}}} d e f i jlmopqstvwz|hv}ly}~܀܀܀܀\A}eQҀcQ|Q+a{{{{{h}l}o}v}y}}}}}}}} j d e f h ilmopqstvwyhv}ly}~܀؂TQcQ€Qp{{{{{h}l}r}v}}}}}}}}}K~ d e f h ijlopqstvwhv}ly}~L߀S4SORQcQRY{{{{{h}o}r}y}}}}}}}}}v e f h ijlmoqstvhv}ly}~5{^b|>7}^b|{9 cQրcQR^{{{{{l}y}}}}}}}}F~ e f h i jlmoj€j€thv}ly}~OzC:}ҤDңC<7}O|VQ/lcQìQD{{{{{l}y}}}}}}} d e h i jlm܀ڀqhv}ly}~AY}qYͣAY}QTQ߀cQlQjy{{{{{l}}}}}}}}@~ d e f h jl܀ڀphv}ly}~ν{{HtQRP9瀆cQWzҀ[Q6e{{{{{o}}}}}}}} d e f h i܀ڀohv}ly}~l}|tyb}9aQQQQQQQQQ1\к{{{{{o}}}}}}}^ e f hڀڀlhv}ly}~[DKZ|Rh瀜jVKZ|xԀXaTQQQQQVYaҀ{{{{{o}~~~~^***++倡ڀ jhv}ly}~J^b|{{{{A΋ŸqmƦqҒ{{{{{r}ڀ ihv}ly}~ƀڼ<Ҩ$ں:麀{{{{{r}v}}}}}}@~| d e fhv}ly}~{{{{{H}K}K}N}P}P}F}A}A}C}C}C}F}H}H}K}K}K}K}'_~'_~(a~(c~)f~+h~+h~+k~+m~,m~,p~.r~.u~/u~/w~1z~1}~1~2~2~4~hv}ly}~ $ $ $ $ $ $;D؀?#߀؀"߀=뀵{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~.!~.!~.!~.!~.!~.!~>7}{7VsBRQQQQQR @j{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~v:Hl}K؀TQQQQQQQQQTHր{TQT߱Ā᳀ȃVaTQTlyb}+aQ,\ʯе,\Q+a#K~jHnQQn)~{):}VQ߀QV            [QQ\FQ߀܀QKjQ+l0qQvڀ):}{):}4;RtnRzȀ%ҀRKr~T"\R+~@p~ŧ\v}SĀSĀSĀSĀSĀSĀUĀ`Ȁw^QV 7EQ€I :YQl$ڀSZt|ƣ{ԀOg|QQQQQQQQQQQQQQQQQQQQQQ{Z<~Dj}}|B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`߹|`tw[{K#N~ғm~`F~=>7}!֞V5]'~'~'~'~'~(~ D-Ԁ[QQQ^K<F4444448gb|?c5|QQQQQQR`܀VQ\hk|TQrxҾ֚mVQgjQ([Ҁ{;qQ?rQQNjQ(|v}-QsnQ!Q^:Ԁ)2~ʒfaQƀQQ΀QT{{{{{{{{)~RQ؀4pQ,f΀Q\ĈĈĈĈĈĈĈĈĈRQ؀bvQVNQ9~^QʀԀTQSjQPiXwW1zQWQQ 5s΀ì^QTĀw~za{{{,jQ%X~QQQQQQz}|{ĀԪ?V>}:[zQ\|mNaQR^ež{{og|zzڀ|fw{{ٙu~)c~{)k~zZ~ʕA7}-C}){!Og|<7}媀;2$~'~@嬀XwWw~za{{{,}|{ĀԪ?V>}:[{{og||fw{{ٙu~)c~{)k~zZ~ʕA7}-C}){!Og|<7}媀;2$~'~@嬀{\N}5b}aABBBB@ Ok|>~+؀A:}A:}A:}A:}A:}A:}A:}A:}A:}vdah}|nl}{z|vVt|to|l}}|wZ~(a~#T~h~گ}kg|)7}% $Oo|ok|ᾈڐ01#~'~9ៀoH?ր+A}ε{gb|{?֬}Niu~F'~峀؈={Ѐzby}y|ͱ瀜eC}DcVo|{Ŝ~Og|tt|{صgb|V)f~rX~}^ve?{KZ|KZ|^b|ԤtR;::eQV؃ \ No newline at end of file diff --git a/autotests/read/hdr/orientation7.hdr.json b/autotests/read/hdr/orientation7.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation7.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation8.hdr b/autotests/read/hdr/orientation8.hdr new file mode 100644 index 0000000..fa1e5f6 --- /dev/null +++ b/autotests/read/hdr/orientation8.hdr @@ -0,0 +1,47 @@ +#?RADIANCE +SOFTWARE=GEGL +FORMAT=32-bit_rle_rgbe + ++X 480 -Y 160 +R;::eQV؃}^ve?{KZ|KZ|^b|Ԥt{صgb|V)f~rX~{Ŝ~Og|tt|y|ͱ瀜eC}DcVo|u~F'~峀؈={Ѐzby}+A}ε{gb|{?֬}NioH?րڐ01#~'~9ៀگ}kg|)7}% $Oo|ok|ᾈwZ~(a~#T~h~to|l}}|{z|vVt|h}|nl}vdaA:}A:}A:}A:}A:}A:}A:}A:}A:}BBBB@ Ok|>~+؀5b}aA\N}{媀;2$~'~@嬀ʕA7}-C}){!Og|<7}ٙu~)c~{)k~zZ~|fw{{{{og|}|{ĀԪ?V>}:[w~za{{{,XwW媀;2$~'~@嬀ʕA7}-C}){!Og|<7}ٙu~)c~{)k~zZ~|fw{{{{og|zzڀ}|{ĀԪ?V>}:[zQ\|mNaQR^ežw~za{{{,jQ%X~QQQQQQzXwW1zQWQQ 5s΀ì^QTĀ^QʀԀTQSjQPiĈĈĈĈĈĈĈĈĈRQ؀bvQVNQ9~{{{{{{{{)~RQ؀4pQ,f΀Q\:Ԁ)2~ʒfaQƀQQ΀QTv}-QsnQ!Q^Ҁ{;qQ?rQQNjQ(|hk|TQrxҾ֚mVQgjQ([4444448gb|?c5|QQQQQQR`܀VQ\'~'~'~'~'~(~ D-Ԁ[QQQ^K<FV5]`F~=>7}!֞߹|`tw[{K#N~ғm~{Z<~Dj}}|B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`Zt|ƣ{ԀOg|QQQQQQQQQQQQQQQQQQQQQQKr~T"\R+~@p~ŧ\v}SĀSĀSĀSĀSĀSĀUĀ`Ȁw^QV 7EQ€I :YQl$ڀSvڀ):}{):}4;RtnRzȀ%ҀRjQ+l0qQFQ߀܀QK            [QQ\)~{):}VQ߀QV#K~jHnQQnlyb}+aQ,\ʯе,\Q+a{TQT߱Ā᳀ȃVaTQTv:Hl}K؀TQQQQQQQQQTHր.!~.!~.!~.!~.!~.!~>7}{7VsBRQQQQQR @j{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~ $ $ $ $ $ $;D؀?#߀؀"߀=뀵{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~{{{{{H}K}K}N}P}P}F}A}A}C}C}C}F}H}H}K}K}K}K}'_~'_~(a~(c~)f~+h~+h~+k~+m~,m~,p~.r~.u~/u~/w~1z~1}~1~2~2~4~hv}ly}~ƀڼ<Ҩ$ں:麀{{{{{r}v}}}}}}@~| d e fhv}ly}~J^b|{{{{A΋ŸqmƦqҒ{{{{{r}ڀ ihv}ly}~[DKZ|Rh瀜jVKZ|xԀXaTQQQQQVYaҀ{{{{{o}~~~~^***++倡ڀ jhv}ly}~l}|tyb}9aQQQQQQQQQ1\к{{{{{o}}}}}}}^ e f hڀڀlhv}ly}~ν{{HtQRP9瀆cQWzҀ[Q6e{{{{{o}}}}}}}} d e f h i܀ڀohv}ly}~AY}qYͣAY}QTQ߀cQlQjy{{{{{l}}}}}}}}@~ d e f h jl܀ڀphv}ly}~OzC:}ҤDңC<7}O|VQ/lcQìQD{{{{{l}y}}}}}}} d e h i jlm܀ڀqhv}ly}~5{^b|>7}^b|{9 cQրcQR^{{{{{l}y}}}}}}}}F~ e f h i jlmoj€j€thv}ly}~L߀S4SORQcQRY{{{{{h}o}r}y}}}}}}}}}v e f h ijlmoqstvhv}ly}~܀؂TQcQ€Qp{{{{{h}l}r}v}}}}}}}}}K~ d e f h ijlopqstvwhv}ly}~܀܀܀܀\A}eQҀcQ|Q+a{{{{{h}l}o}v}y}}}}}}}} j d e f h ilmopqstvwyhv}ly}~ҡb(~{{{{{{{>7}#4QcQҒpcjQT{{{{{e}l}o}v}y}}}}}}}}}} d e f i jlmopqstvwz|hv}ly}~}_};~tƀƀƀƀj{ƀƀEzQcQQQQR?΀{{{{{e}h}o}r}y}}}}}}}}}}F~ d f h i jlmopqsvwyz|}hv}ly}~{{ =BcQQQ 5N{{{{{e}h}l}r}v}}}}}}}}}}} e f h i jlmopstvwyz|}hv}ly}~)B~Ѐ$~-$0瀆||{{{{{b}h}l}r}v}y}}}}}}}}}K~ d e f h ijlmpqstvwyz|}hv}ly}~|{{{{{b}e}l}o}v}y}}}}}}}}}} d e f h ijmopqstvwyz|hv}ly}~|{{{{{b}e}h}o}r}y}}}}}}}}}}}R~ d e f h jlmopqstvwy|}hv}ly}~ed@[xB[pfȎ|{{{{{_}e}h}o}r}v}}}}}}~+qstwyz|}hv}ly}~0\QQQQQQQEaе|{{{{{}}}}}l}o}r}y}}~+tvwyz|}hv}ly}~QQQR\c\RQQR|{{{{{}}}}}r}r}h}l}r}v}~+vwyz|}hy}ly}~lJKƋ ڎ€RQc0,߀aQV̀|{{{{{v}y}}y}o}r}l}e}l}o}~+wyz|}hy}ly}~ʃ@'~{{{{{{8局QrjQUm|{{{{{o}r}y}l}o}r}v}b}e}h}~+y|}hy}ly}~֬C:}'7}\zqJOb|<%~Ѐ0vQ`RQ9~|{{{{{h}l}h}h}l}r}v}o}_}b}}~~~r0>0>/>-`+++++|}hy}ly}~jROk|p܀K^|ȕtVQրQ[|{{{{{b}e}b}h}l}o}v}y}_}\}}~~~0>0>0>0>.S._1++++}hy}ly}~e\}`Rvy}TQڀڀQV|{{{{{\}\}b}e}l}o}r}y}v}V}~+hy}ly}~Ž{{eQƀQ r|{{{{{V}\}_}e}h}o}r}y}}}e}~+hy}ly}~{{6Qsb|Q8|{{{{{V}\}_}b}h}l}r}v}}}}}~Ԁo}EVEVmက倣܀܀܀$hy}ly}~Y}t\_}}OQT1eVAv|{{{{{V}Y}_}b}h}l}o}v}y}}~Rd '0A0A6 P倣܀܀,hy}ly}~2H/5+1Tt|{{{{{h}o}r}y}}}}}}}}iEY"om Fs,-hy}ly}~В̀|{{{{{_}l}o}v}y}}}}}}nߣ"ؒƎ ·Ȁ,-hy}ly}~絀)H#n|{{{{{H}b}h}l}r}v}}}}}}/F8P/E-d9j,-hy}ly}~Ҋ_~Og|K^|~@"oUҀᵀ߯߯߯߯߯߯߯߯"lRμ|{{{{{|V}b}e}l}o}v}y}}%I/G$_v] --hy}ly}~{dUz̤}^p_~ġQcQQQQQQQQQQQQRljĀ|{{{{{||\}_}e}h}o}r}m~&/H%֒Ǝ @-hy}ly}~Zt|뀌|}|RQQQQQQQQQQQQQQQQOw|{{{{{||N}Y}\}b}e}o}''/I6_w]93`-hy}ly}~T~͞{Og|OQ[Ԁ166666666jQ666逃|{{{{{H}||S}V}\}_}a~((/JPj69P-bg-hy}ly}~瀐h}Ć'[{d֯7F'~}jԀWV#nQ|{{{{{K}H}||N}P})O++*/LҐ)/JԒԒ/J'Ȑ-b Y.hy}ly}~dddddd|nR#nQ|{{{{{N}H}||H}}"Y+++/Nƀ/L)))(/Jƀ.hy}ly}~*f 9XƀI|{{{{{}}}}}"W![!Y!Y"Y/O؀ܤܤڀO-d-d~hy}ly}~؅؅؅؅؅؅؅؅؅؅؅؅؅|{{{{{}}}}k~!\!\!\![![.P-b   Ehy}ly}~{{{{{{{{{{{{{ƀʭvlй}|{{{{{}}}}!^!`!^!^!^!\.Q-b   +hy}ly}~;܀;܀;܀=܀F| )#Ѐ9܀+؀B|wsTQQQ1\­|{{{{{}}}]~!a!a!a!`!`!`!^!^!^!\!\!\![![![!Y!Y"Y"W!g      ghy}ly}~Dža~jUzzZ~QQQQQQ1cR`|{{{{{}}}!e!e!c!c!c!a!a!a!`!`!`!^!^!^!\!\!\![![![ ^      "~hy}ly}~{Ԁ{QQtQ뀗9^Q}#Q||{{{{{}}'\!g!g!e!e!e!c!c!c!c!a!a!a!`!`!`!^!^!^!\!\!\ z      Thy}ly}~^|oSyb|\Qt܀QcLQ{{{{{}_h~!j!i!i!i!g!g!g!e!e!e!c!c!c!c!a!a!a!`!`!`!^!^ n       |hy}ly}~9Wkg|w$孀ƀΞ7N>}9VR[r,t߀Q9{{{{{y} e!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c!c!c!c!a!a!a!` g       8hy}ly}~.{{{{{,eVH\R^{{{{{_~!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c!c!c!c!c ~       Nhy}ly}~iĀ`Ād;QȀ3`RVR{{{{{ p!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!e!e!e!c v       )hy}ly}~̀Ā?o߀R7aQ̀Qa{{{{{ t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i!i!g!g!g!n        nhy}ly}~ᡀܾ?ڹ8ڹ8ڹ8ڹ8.gb|t+z€Qqi7aQ߀Q5{{{{{ x v v v t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j!j!i!i j        "hy}ly}~X8{{{{{{{{{%~ڦ£q-pQV|jp4\QtnVQQV€{{{{{ zmm x x v v v t t t!r!r!r!p!p!p!p!n!n!n!l!l!l!j!j|        Opʀpʀhy}ly}~ѡ|`m瀂适适适e{适QQQQQQQQQQQQQ_{{{{{ |ңң z z z x x x v v v t t t!r!r!r!p!p!p!n!n!n!n!l v         yဤhy}ly}~Ob|{ = = = = = = = = = =AìV{{{{{ ~ңң ~ | | | z z z x x x v v v t t t!r!r!r!p!p!p!n!t         4ဤhy}ly}~#Ѐ {{{{{ ң€ң  ~ ~ ~ | | | | z z z x x x v v v t t t!r!r!r!p         Ҁhy}ly}~{{{{{ ң€ң€      ~ ~ ~ | | | | z z z x x x v v v t t t z         Ц€߀hy}ly}~o"%{{{{{ ң€ܷЀ-d-d-d-d-d     ~ ~ ~ | | | | z z z x x x v v z    -d-d-d-d-dܹЀ̀hy}ly}~~V{!!!!!!ԀʆpmģqΎ{{{{{ ң€         ~ ~ ~ | | | | z z z x z    Уhy}ly}~ѭ|L}ܹÊRQQQQQTʀ{{{{{                     ~ ~ ~ | | | | z           Ehy}ly}~{еVQQQQQQQQQ,[Ƴ{{{{{ff~fh~hh~hk~hm~hm~km~kp~mr~mr~mr~mu~mw~pw~pw~rz~p}~r~r~r~r~u~u~w~w~w~z~z~z~m~m~m~m~m~m~m~p~p~p~w~hv}ly}~Sy}ȳ؀(\QTV9逃5STQ6e{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~@`].~؅bvQYqiVQp{{{{{{{{{kt|ky|oy|o}|t}|t|y|y|}|||||||||||||||||||||||||||hv}hv}ly}~ֵ{{ok|F<}F<}F<}F<}F<}>QB9vQK;;;;;;;;;[QڀҀQaRQ߀܀QT^Q̀ȀQj         ,QsQ0/F}{ >~07}#}_};~tƀƀƀƀj{ƀƀ{{)B~Ѐ$~=߳w8ν{ƀw"6$~{'7}Ky}c+ڷI?bb|KZ|-/ЀUʀOg|'~]NH>}{v,Ok|{_N}8߀+̀)KZ|gg|:Ԩ8o2~{og|B֯?G$~{Qiiiiiiiiiiii{{{{{{{{{{{{@~V$ԀȬwVatlnzfeȋ緀;{X,~緀ԀTQQQQQQQQ6^yОOA:}Og|f D~YA}Έȭ0\QQQQ[ccYQQQQ߀:{!H~>ok|ҞYĀ%YQQ :.ဵր^QQw6$~KZ|Q(pֵ{l5cQR)̀WQQ^b|1~l&X{QQ0wRQ$\:CĀJfQnVQ;Q>t)`Qr!!!!!!!!!!!!^QƀhQ1|{+~+~{TQ؀ЀЀ΀Q^{{RQ؀΀QQҀQR{{\Q΀΀QQĀQ[g|ӻg|nQ΀QQzQpHc~ݩu~rR}}6Q`}΀QQJiQ={ƐXگv^b|x=pQA`vvvvvnQQ9xQDv'Z~ε{4L㡀嬀[Fbb| J~t€QQQQQQQQQQ^QڀVKZ|{{{{{> +4 +4 +4 +4 +4 +4 +4 +4 +4 +45,րpi$Ѐʎddkg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|kg|߭lxVQQ{VHHH`{DHHV{րε|L_6\QQQQQV{{{ЕmezjRQQQQT 8vЀO{{{|VQQQQR 6l΀D{{{QQY 9l΀={{{QQVnleʐivi(߀ @TQQQV㊸̱|܀1GWQQQTzq̀=Q[QQQRljWԀ =WQQԘvhrVQQйL_+[QQQQem΀1!~뀜/!~ƀqzTQQQT ;؀{g$BBBBBBBBc#{sfniRQQQYG-ှ{Oo|)7})7})7})7})7})7})7})7}Ok|{QQV 6l̀K{{QQ!WpjeȈ܀F߀G߀DYQQQQRjleΒVvЀ 6RQQQQVvjأ〵wߓ         0O^QQQQQ'Y〪a/] R"[&a5pR}+~K^|Ob| 'sր ;TQQھЀ=bKVY [!\"]#_$_+f;vfTp@_Ȁ؀7_5RWXYY ["\"]#_$_$`+fD}vʀbS}Lt/PUVVWXY[ ["\"]#_$`$`&a2mN܊ı{΋ŸqmƦqҒ΀B,RSUUVVWXY[ ["\"]#_$`$`&a'bD}`ffffffܺB5\}ԀXaTQQQQQVYaҀМ.zGPQRSUUVWWXY[!\"\"]#_$`$`&a'b:t[{{{{{{{Og|Uƀ9aQQQQQQQQQ1\кȆ%pIOPQQRSUVVWWXY[!\"\"]#_$`%a&a'b1mW؀QQQQQB߀deF}ҟpHtQRP9瀆cQWzҀ[Q6ei#iHLNOPQQRSUVVWWXY[!\"\"]$_$`%a&a'b0lWրe_H~QTQ߀cQlQjyʒcFKLNNOPQRRSUVVWXXY[!\"]"]$_$`%a&a'b4pXڀҀ{VQ/lcQìQDԱƀ$gBIJKLNNOPQRRSUVVWXXY [!\"]"]$_$`%a'b'b:tW߀tIk| cQրcQR^1|<HIJJKLNOOPQRRSUVVWXYY [!\"]"]$_$`%a'b'bC}].!~{K|RQcQRY0[eGHHIJJKLNOOV8iNwbtziWJv*bYY [!\"]#_$_$`%a'b+fOڈ###### 'ƀTQcQ€Qp[AFGHHIJJKL=pƺĀ΀]'` ["\"]#_$_$`&a'b4pUeQҀcQ|Q+a'nlEFFGHHIJ2iȗЀ€ЀW&_"\"]#_$`$`&a'bEiៀJ龀4QcQҒpcjQT`W CDEFFGHKfƀʀƀ5j"\"]#_$`$`&a+fRԀjEŭ{{ok|ܵ繀孀EzQcQQQQR?΀(lj C CDEFFSҐԀ΀ဤGw"\"]#_$`$`&aAzYhS}\IFҟ~Nr~nW =BcQQQ 5NqQ > B C CDERȀȀԀ逬Hw"\"]#_$`%a-hQЀ{̀˳|y}-$0瀆6\ @ A B C CG؎Āڀ瀤4i"\"]$_$`%aD}sHl}{{عʀH +: @ @ A B C_ʀဦ'a"]"]$_$`0lU;]R({rt|IqN +> +? @ @ AWڀʀƀb"]"]"]$_%`PҀf\>}H>}{!/#~{It0~\ += +> +? @ Aq逭逤=t!\"]"]$_Gw!!!!!! mB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`Lg = += +> ?[Ҁ߀Ѐd [!\"]#_;v]QQQQQQQQQQQQQQQΜ F8 < = +> +>IԀY ["\"]1lPЀ㨀րSĀSĀSĀSĀSĀSĀSĀR€F 8VQl'؀hj F < < < = +>ؐာȀ5m[ ["\)eN߀֪aw/q,)~{{{,!~ă8v€QKqN < < < <K΀ЀYY[ [$`KߓkV~^W<{.vЀo%{aC#bQ:dQ < < < <$_Ā΀ڀfXY[ [Kt|teS}V>|o\}րQaIQ < < < <)dրqWXY[Fp{{{Q!e5\ < < < <2mڀwWWXY?ypg|wd\}p޶b}QR8[ < < < <.ipVWXX?zoa~_C}pRF4~wڵQV\}[ƀQaLQ < < < <'bĀmVVWXD}p/H}{og|A:}^b|{og|>7}^b|{kg|ʀRxQ6>fQ < < < <Ỳ̀倦\UVVWGq+Ҁ]PPPPPPPPPE\E\E\E\E\E\E\E\E\B[rTQQ[ȀPsN < < < <GҀ܀Ȁ؀FwSUV[FᗺQQQQQQQQQQQQQdt F < < < < y؀Iw€>UK^|+:}%QրʕVQQQWPJ0t\ < < < < < < +?=vڀ倹̀yRHIIJKL.iSwhB`QQQT A1v I9 < < < < < < +?%aօЀЀ܀YIGHHIJJR;v܀QQW A'߀/t\ < < < < < < < <G7pܣeREEFGHHIJ/jfQQtii᷀ҭ€ F8 < < < < < < < < <N/jYؒ߀΀w +> ? @ A B B CDEFF)ew}K)~XUWQQQTۊҾ؀\c < < < < < < < < < < < < < < < < < = +> +? ? @ A B C CDE"]U؊V+ ~{K^|,,߀ <RQQQ)[YaЬT7 < < < < < < < < < < < < < < < < < += +> +? ? @ A B C CVBzߗ_1#~{O^|-(ʀtЀ`QQQ̗T7 < < < < < < < < < < < < < < < < < += +> +? @ @ A BO=wᡀh{O^|.(̀HKVΤY7 < < < < < < < < < < < < < < < < < += +> +? @ @Q?y{KZ|?-ЀЀ/vc < < < < < < < < < < < < < < < < < += +> @[H(KZ|{"t嬀pV9 < < < < < < < < < < < < < < < = B&am!Ā#{{q㨀̱ṯṯṯṯṯṯṯṯṯṯṯṯṯṯtҺfeğ"g4 < < < < < < < < < < < < < =OUK^|+:}%Qր[Q߀cQQ0i"vQ€cQƤVQN؃|.:5}{*_QhcQp.[QQ Aᡀʒ& F:}{K^|F@܀mʀQNcQQQQ ?{'7}#QG߀jjra +4G:{'~$Ҥ2Ѐ€'O^|Zb|#wᜀʎdd4ր6)7}{߭lxVQQ؅j"bb|KZ|"րε|L_6\QQQQQVطA0%~{-C} &2ԀЕmezjRQQQQT 8vЀO{b|*p|VQQQQR 6l΀D3+<}{>7}.wwQQY 9l΀=ie#Ob|{<7}/QQVnleʐF߀E(߀ @TQQQV㊸̱|܀ր娀܀1GWQQQTzq̀ҡQ6$~{{{ҡO=Q[QQQRljĎe{9e{` {YWԀ =WQQfN~5c{9x֠y}ԘvhrVQQ{y{{йL_+[QQQQem΀{{͓A_}ƀqzTQQQT ;؀Sv}{ֳ/>^b|`sfniRQQQYG-ှ^~t{{Ok|JQQV 6l̀KSsQQ!WpjeȈ܀DYQQQQRjleΒ         VvЀ 6RQQQQVvjأ/F}{ >~00O^QQQQQ'YD΀}|ҡjsր ;TQQpo}@_Ȁ{0؀ \ No newline at end of file diff --git a/autotests/read/hdr/orientation8.hdr.json b/autotests/read/hdr/orientation8.hdr.json new file mode 100644 index 0000000..c052e86 --- /dev/null +++ b/autotests/read/hdr/orientation8.hdr.json @@ -0,0 +1,5 @@ +[ + { + "fileName" : "orientation_all.png" + } +] diff --git a/autotests/read/hdr/orientation_all.png b/autotests/read/hdr/orientation_all.png new file mode 100644 index 0000000000000000000000000000000000000000..de135feb8a915d9a4f10eac2a831aac66da726ac GIT binary patch literal 32296 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 literal 0 HcmV?d00001 diff --git a/autotests/read/pfm/testcard_gray.png b/autotests/read/pfm/testcard_gray.png index 3da44c632f997133016892b5fb513d7f8d8b3424..8997b93f6c4d7741065bd1ae6c314736bf0954e5 100644 GIT binary patch literal 17634 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 diff --git a/autotests/readtest.cpp b/autotests/readtest.cpp index de62219..a92dca2 100644 --- a/autotests/readtest.cpp +++ b/autotests/readtest.cpp @@ -177,7 +177,8 @@ public: { bool ok = true; if (!m_size.isEmpty()) { - ok = ok && (m_size == image.size()); + // Size option return the size without transformation (tested with Qt TIFF plugin). + ok = ok && (m_size == image.size() || m_size == image.size().transposed()); } if (m_format != QImage::Format_Invalid) { ok = ok && (m_format == image.format()); diff --git a/src/imageformats/exr.cpp b/src/imageformats/exr.cpp index f1ff045..6afe0ee 100644 --- a/src/imageformats/exr.cpp +++ b/src/imageformats/exr.cpp @@ -7,20 +7,11 @@ SPDX-License-Identifier: LGPL-2.0-or-later */ -/* *** EXR_USE_LEGACY_CONVERSIONS *** - * If defined, the result image is an 8-bit RGB(A) converted - * without icc profiles. Otherwise, a 16-bit images is generated. - * NOTE: The use of legacy conversions are discouraged due to - * imprecise image result. - */ -//#define EXR_USE_LEGACY_CONVERSIONS // default commented -> you should define it in your cmake file - /* *** EXR_CONVERT_TO_SRGB *** * If defined, the linear data is converted to sRGB on read to accommodate * programs that do not support color profiles. * Otherwise the data are kept as is and it is the display program that * must convert to the monitor profile. - * NOTE: If EXR_USE_LEGACY_CONVERSIONS is active, this is ignored. */ //#define EXR_CONVERT_TO_SRGB // default: commented -> you should define it in your cmake file @@ -92,18 +83,6 @@ #include #include -// Allow the code to works on all QT versions supported by KDE -// project (Qt 5.15 and Qt 6.x) to easy backports fixes. -#if !defined(EXR_USE_LEGACY_CONVERSIONS) -// If uncommented, the image is rendered in a float16 format, the result is very precise -#define EXR_USE_QT6_FLOAT_IMAGE // default uncommented -#endif - -// Qt 6.8 allow to create and use Gray profile, so we can load a Gray image as Grayscale format instead RGB one. -#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) -#define EXR_GRAY_SUPPORT_ENABLED -#endif - class K_IStream : public Imf::IStream { public: @@ -214,22 +193,6 @@ void K_OStream::seekg(Imf::Int64 pos) m_dev->seek(pos); } -#ifdef EXR_USE_LEGACY_CONVERSIONS -// source: https://openexr.com/en/latest/ReadingAndWritingImageFiles.html -inline unsigned char gamma(float x) -{ - x = std::pow(5.5555f * std::max(0.f, x), 0.4545f) * 84.66f; - return (unsigned char)qBound(0.f, x, 255.f); -} -inline QRgb RgbaToQrgba(struct Imf::Rgba &imagePixel) -{ - return qRgba(gamma(float(imagePixel.r)), - gamma(float(imagePixel.g)), - gamma(float(imagePixel.b)), - (unsigned char)(qBound(0.f, imagePixel.a * 255.f, 255.f) + 0.5f)); -} -#endif - EXRHandler::EXRHandler() : m_compressionRatio(-1) , m_quality(-1) @@ -253,18 +216,7 @@ bool EXRHandler::canRead() const static QImage::Format imageFormat(const Imf::RgbaInputFile &file) { auto isRgba = file.channels() & Imf::RgbaChannels::WRITE_A; -#ifdef EXR_GRAY_SUPPORT_ENABLED - auto isGray = file.channels() & Imf::RgbaChannels::WRITE_Y; -#else - auto isGray = false; -#endif -#if defined(EXR_USE_LEGACY_CONVERSIONS) - return (isRgba ? QImage::Format_ARGB32 : QImage::Format_RGB32); -#elif defined(EXR_USE_QT6_FLOAT_IMAGE) - return (isRgba ? QImage::Format_RGBA16FPx4 : isGray ? QImage::Format_Grayscale16 : QImage::Format_RGBX16FPx4); -#else - return (isRgba ? QImage::Format_RGBA64 : QImage::Format_RGBX64); -#endif + return (isRgba ? QImage::Format_RGBA16FPx4 : QImage::Format_RGBX16FPx4); } /*! @@ -371,8 +323,6 @@ static void readMetadata(const Imf::Header &header, QImage &image) static void readColorSpace(const Imf::Header &header, QImage &image) { // final color operations -#ifndef EXR_USE_LEGACY_CONVERSIONS - QColorSpace cs; if (auto chroma = header.findTypedAttribute("chromaticities")) { auto &&v = chroma->value(); @@ -383,24 +333,13 @@ static void readColorSpace(const Imf::Header &header, QImage &image) QColorSpace::TransferFunction::Linear); } if (!cs.isValid()) { -#ifdef EXR_GRAY_SUPPORT_ENABLED - if (image.format() == QImage::Format_Grayscale16 || image.format() == QImage::Format_Grayscale8) { - cs = QColorSpace(QPointF(0.31271, 0.32902), QColorSpace::TransferFunction::Linear); - cs.setDescription(QStringLiteral("Gray Linear build-in")); - } else { - cs = QColorSpace(QColorSpace::SRgbLinear); - } -#else cs = QColorSpace(QColorSpace::SRgbLinear); -#endif } image.setColorSpace(cs); #ifdef EXR_CONVERT_TO_SRGB image.convertToColorSpace(QColorSpace(QColorSpace::SRgb)); #endif - -#endif // !EXR_USE_LEGACY_CONVERSIONS } bool EXRHandler::read(QImage *outImage) @@ -451,7 +390,6 @@ bool EXRHandler::read(QImage *outImage) pixels.resizeErase(EXR_LINES_PER_BLOCK, width); bool isRgba = image.hasAlphaChannel(); - // somehow copy pixels into image for (int y = 0, n = 0; y < height; y += n) { auto my = dw.min.y + y; if (my > dw.max.y) { // paranoia check @@ -462,37 +400,14 @@ bool EXRHandler::read(QImage *outImage) file.readPixels(my, std::min(my + EXR_LINES_PER_BLOCK - 1, dw.max.y)); for (n = 0; n < std::min(EXR_LINES_PER_BLOCK, height - y); ++n) { - if (image.format() == QImage::Format_Grayscale16) { // grayscale image - auto scanLine = reinterpret_cast(image.scanLine(y + n)); - for (int x = 0; x < width; ++x) { - *(scanLine + x) = quint16(qBound(0.f, float(pixels[n][x].r) * 65535.f + 0.5f, 65535.f)); - } - continue; - } -#if defined(EXR_USE_LEGACY_CONVERSIONS) - Q_UNUSED(isRgba) - auto scanLine = reinterpret_cast(image.scanLine(y + n)); - for (int x = 0; x < width; ++x) { - *(scanLine + x) = RgbaToQrgba(pixels[n][x]); - } -#elif defined(EXR_USE_QT6_FLOAT_IMAGE) auto scanLine = reinterpret_cast(image.scanLine(y + n)); for (int x = 0; x < width; ++x) { auto xcs = x * 4; - *(scanLine + xcs) = qfloat16(qBound(0.f, float(pixels[n][x].r), 1.f)); - *(scanLine + xcs + 1) = qfloat16(qBound(0.f, float(pixels[n][x].g), 1.f)); - *(scanLine + xcs + 2) = qfloat16(qBound(0.f, float(pixels[n][x].b), 1.f)); - *(scanLine + xcs + 3) = qfloat16(isRgba ? qBound(0.f, float(pixels[n][x].a), 1.f) : 1.f); + *(scanLine + xcs) = qfloat16(float(pixels[n][x].r)); + *(scanLine + xcs + 1) = qfloat16(float(pixels[n][x].g)); + *(scanLine + xcs + 2) = qfloat16(float(pixels[n][x].b)); + *(scanLine + xcs + 3) = qfloat16(isRgba ? std::clamp(float(pixels[n][x].a), 0.f, 1.f) : 1.f); } -#else - auto scanLine = reinterpret_cast(image.scanLine(y + n)); - for (int x = 0; x < width; ++x) { - *(scanLine + x) = QRgba64::fromRgba64(quint16(qBound(0.f, float(pixels[n][x].r) * 65535.f + 0.5f, 65535.f)), - quint16(qBound(0.f, float(pixels[n][x].g) * 65535.f + 0.5f, 65535.f)), - quint16(qBound(0.f, float(pixels[n][x].b) * 65535.f + 0.5f, 65535.f)), - isRgba ? quint16(qBound(0.f, float(pixels[n][x].a) * 65535.f + 0.5f, 65535.f)) : quint16(65535)); - } -#endif } } @@ -659,26 +574,12 @@ bool EXRHandler::write(const QImage &image) pixels.resizeErase(EXR_LINES_PER_BLOCK, width); // convert the image and write into the stream -#if defined(EXR_USE_QT6_FLOAT_IMAGE) auto convFormat = image.hasAlphaChannel() ? QImage::Format_RGBA16FPx4 : QImage::Format_RGBX16FPx4; -#else - auto convFormat = image.hasAlphaChannel() ? QImage::Format_RGBA64 : QImage::Format_RGBX64; -#endif ScanLineConverter slc(convFormat); -#ifdef EXR_GRAY_SUPPORT_ENABLED - if (channelsType == Imf::RgbaChannels::WRITE_Y) { - slc.setDefaultSourceColorSpace(QColorSpace(QColorSpace(QColorSpace::SRgb).whitePoint(), QColorSpace::TransferFunction::SRgb)); // Creates a custom grayscale color space - } else { - slc.setDefaultSourceColorSpace(QColorSpace(QColorSpace::SRgb)); - } -#else slc.setDefaultSourceColorSpace(QColorSpace(QColorSpace::SRgb)); -#endif - slc.setTargetColorSpace(QColorSpace(QColorSpace::SRgbLinear)); for (int y = 0, n = 0; y < height; y += n) { for (n = 0; n < std::min(EXR_LINES_PER_BLOCK, height - y); ++n) { -#if defined(EXR_USE_QT6_FLOAT_IMAGE) auto scanLine = reinterpret_cast(slc.convertedScanLine(image, y + n)); if (scanLine == nullptr) { return false; @@ -690,18 +591,6 @@ bool EXRHandler::write(const QImage &image) pixels[n][x].b = float(*(scanLine + xcs + 2)); pixels[n][x].a = float(*(scanLine + xcs + 3)); } -#else - auto scanLine = reinterpret_cast(slc.convertedScanLine(image, y + n)); - if (scanLine == nullptr) { - return false; - } - for (int x = 0; x < width; ++x) { - pixels[n][x].r = float((scanLine + x)->red() / 65535.f); - pixels[n][x].g = float((scanLine + x)->green() / 65535.f); - pixels[n][x].b = float((scanLine + x)->blue() / 65535.f); - pixels[n][x].a = float((scanLine + x)->alpha() / 65535.f); - } -#endif } file.setFrameBuffer(&pixels[0][0] - qint64(y) * width, 1, width); file.writePixels(n); diff --git a/src/imageformats/hdr.cpp b/src/imageformats/hdr.cpp index 0db702a..bee4fdc 100644 --- a/src/imageformats/hdr.cpp +++ b/src/imageformats/hdr.cpp @@ -27,12 +27,194 @@ typedef unsigned char uchar; Q_LOGGING_CATEGORY(HDRPLUGIN, "kf.imageformats.plugins.hdr", QtWarningMsg) -namespace // Private. -{ #define MAXLINE 1024 #define MINELEN 8 // minimum scanline length for encoding #define MAXELEN 0x7fff // maximum scanline length for encoding +class Header +{ +public: + Header() + { + m_colorSpace = QColorSpace(QColorSpace::SRgbLinear); + m_transformation = QImageIOHandler::TransformationNone; + } + Header(const Header&) = default; + Header& operator=(const Header&) = default; + + bool isValid() const { return width() > 0 && height() > 0; } + qint32 width() const { return(m_size.width()); } + qint32 height() const { return(m_size.height()); } + QString software() const { return(m_software); } + QImageIOHandler::Transformations transformation() const { return(m_transformation); } + + /*! + * \brief colorSpace + * + * The color space for the image. + * + * The CIE (x,y) chromaticity coordinates of the three (RGB) + * primaries and the white point used to standardize the picture's + * color system. This is used mainly by the ra_xyze program to + * convert between color systems. If no PRIMARIES line + * appears, we assume the standard primaries defined in + * src/common/color.h, namely "0.640 0.330 0.290 + * 0.600 0.150 0.060 0.333 0.333" for red, green, blue + * and white, respectively. + */ + QColorSpace colorSpace() const { return(m_colorSpace); } + + /*! + * \brief exposure + * + * A single floating point number indicating a multiplier that has + * been applied to all the pixels in the file. EXPOSURE values are + * cumulative, so the original pixel values (i.e., radiances in + * watts/steradian/m^2) must be derived by taking the values in the + * file and dividing by all the EXPOSURE settings multiplied + * together. No EXPOSURE setting implies that no exposure + * changes have taken place. + */ + float exposure() const { + float mul = 1; + for (auto&& v : m_exposure) + mul *= v; + return mul; + } + + QImageIOHandler::Transformations m_transformation; + QColorSpace m_colorSpace; + QString m_software; + QSize m_size; + QList m_exposure; +}; + +class HDRHandlerPrivate +{ +public: + HDRHandlerPrivate() + { + } + ~HDRHandlerPrivate() + { + } + + const Header& header(QIODevice *device) + { + auto&& h = m_header; + if (h.isValid()) { + return h; + } + h = readHeader(device); + return h; + } + + static Header readHeader(QIODevice *device) + { + Header h; + + int len; + QByteArray line(MAXLINE + 1, Qt::Uninitialized); + QByteArray format; + + // Parse header + do { + len = device->readLine(line.data(), MAXLINE); + + if (line.startsWith("FORMAT=")) { + format = line.mid(7, len - 7).trimmed(); + } + if (line.startsWith("SOFTWARE=")) { + h.m_software = QString::fromUtf8(line.mid(9, len - 9)).trimmed(); + } + if (line.startsWith("EXPOSURE=")) { + auto ok = false; + auto ex = QLocale::c().toFloat(QString::fromLatin1(line.mid(9, len - 9)).trimmed(), &ok); + if (ok) + h.m_exposure << ex; + } + if (line.startsWith("PRIMARIES=")) { + auto list = line.mid(10, len - 10).trimmed().split(' '); + QList primaries; + for (auto&& v : list) { + auto ok = false; + auto d = QLocale::c().toDouble(QString::fromLatin1(v), &ok); + if (ok) + primaries << d; + } + if (primaries.size() == 8) { + auto cs = QColorSpace(QPointF(primaries.at(6), primaries.at(7)), + QPointF(primaries.at(0), primaries.at(1)), + QPointF(primaries.at(2), primaries.at(3)), + QPointF(primaries.at(4), primaries.at(5)), + QColorSpace::TransferFunction::Linear); + cs.setDescription(QStringLiteral("Embedded RGB")); + if (cs.isValid()) + h.m_colorSpace = cs; + } + } + + } while ((len > 0) && (line[0] != '\n')); + + if (format != "32-bit_rle_rgbe") { + qCDebug(HDRPLUGIN) << "Unknown HDR format:" << format; + return h; + } + + len = device->readLine(line.data(), MAXLINE); + line.resize(len); + + /* + * Handle flipping and rotation, as per the spec below. + * The single resolution line consists of 4 values, a X and Y label each followed by a numerical + * integer value. The X and Y are immediately preceded by a sign which can be used to indicate + * flipping, the order of the X and Y indicate rotation. The standard coordinate system for + * Radiance images would have the following resolution string -Y N +X N. This indicates that the + * vertical axis runs down the file and the X axis is to the right (imagining the image as a + * rectangular block of data). A -X would indicate a horizontal flip of the image. A +Y would + * indicate a vertical flip. If the X value appears before the Y value then that indicates that + * the image is stored in column order rather than row order, that is, it is rotated by 90 degrees. + * The reader can convince themselves that the 8 combinations cover all the possible image orientations + * and rotations. + */ + QRegularExpression resolutionRegExp(QStringLiteral("([+\\-][XY])\\s+([0-9]+)\\s+([+\\-][XY])\\s+([0-9]+)\n")); + QRegularExpressionMatch match = resolutionRegExp.match(QString::fromLatin1(line)); + if (!match.hasMatch()) { + qCDebug(HDRPLUGIN) << "Invalid HDR file, the first line after the header didn't have the expected format:" << line; + return h; + } + + auto c0 = match.captured(1); + auto c1 = match.captured(3); + if (c0.at(1) == u'Y') { + if (c0.at(0) == u'-' && c1.at(0) == u'+') + h.m_transformation = QImageIOHandler::TransformationNone; + if (c0.at(0) == u'-' && c1.at(0) == u'-') + h.m_transformation = QImageIOHandler::TransformationMirror; + if (c0.at(0) == u'+' && c1.at(0) == u'+') + h.m_transformation = QImageIOHandler::TransformationFlip; + if (c0.at(0) == u'+' && c1.at(0) == u'-') + h.m_transformation = QImageIOHandler::TransformationRotate180; + } + else { + if (c0.at(0) == u'-' && c1.at(0) == u'+') + h.m_transformation = QImageIOHandler::TransformationRotate90; + if (c0.at(0) == u'-' && c1.at(0) == u'-') + h.m_transformation = QImageIOHandler::TransformationMirrorAndRotate90; + if (c0.at(0) == u'+' && c1.at(0) == u'+') + h.m_transformation = QImageIOHandler::TransformationFlipAndRotate90; + if (c0.at(0) == u'+' && c1.at(0) == u'-') + h.m_transformation = QImageIOHandler::TransformationRotate270; + } + + h.m_size = QSize(match.captured(4).toInt(), match.captured(2).toInt()); + return h; + } + +private: + Header m_header; +}; + // read an old style line from the hdr image file // if 'first' is true the first byte is already read static bool Read_Old_Line(uchar *image, int width, QDataStream &s) @@ -76,9 +258,10 @@ static bool Read_Old_Line(uchar *image, int width, QDataStream &s) } template -void RGBE_To_QRgbLine(uchar *image, float_T *scanline, int width) +void RGBE_To_QRgbLine(uchar *image, float_T *scanline, const Header& h) { - for (int j = 0; j < width; j++) { + auto exposure = h.exposure(); + for (int j = 0, width = h.width(); j < width; j++) { // v = ldexp(1.0, int(image[3]) - 128); float v; int e = qBound(-31, int(image[3]) - 128, 31); @@ -90,9 +273,13 @@ void RGBE_To_QRgbLine(uchar *image, float_T *scanline, int width) auto j4 = j * 4; auto vn = v / 255.0f; - scanline[j4] = float_T(std::min(float(image[0]) * vn, 1.0f)); - scanline[j4 + 1] = float_T(std::min(float(image[1]) * vn, 1.0f)); - scanline[j4 + 2] = float_T(std::min(float(image[2]) * vn, 1.0f)); + if (exposure > 0) { + vn /= exposure; + } + + scanline[j4] = float_T(float(image[0]) * vn); + scanline[j4 + 1] = float_T(float(image[1]) * vn); + scanline[j4 + 2] = float_T(float(image[2]) * vn); scanline[j4 + 3] = float_T(1.0f); image += 4; } @@ -108,11 +295,14 @@ QImage::Format imageFormat() } // Load the HDR image. -static bool LoadHDR(QDataStream &s, const int width, const int height, QImage &img) +static bool LoadHDR(QDataStream &s, const Header& h, QImage &img) { uchar val; uchar code; + const int width = h.width(); + const int height = h.height(); + // Create dst image. img = imageAlloc(width, height, imageFormat()); if (img.isNull()) { @@ -134,7 +324,7 @@ static bool LoadHDR(QDataStream &s, const int width, const int height, QImage &i // determine scanline type if ((width < MINELEN) || (MAXELEN < width)) { Read_Old_Line(image, width, s); - RGBE_To_QRgbLine(image, scanline, width); + RGBE_To_QRgbLine(image, scanline, h); continue; } @@ -147,7 +337,7 @@ static bool LoadHDR(QDataStream &s, const int width, const int height, QImage &i if (val != 2) { s.device()->ungetChar(val); Read_Old_Line(image, width, s); - RGBE_To_QRgbLine(image, scanline, width); + RGBE_To_QRgbLine(image, scanline, h); continue; } @@ -162,7 +352,7 @@ static bool LoadHDR(QDataStream &s, const int width, const int height, QImage &i if ((image[1] != 2) || (image[2] & 128)) { image[0] = 2; Read_Old_Line(image + 4, width - 1, s); - RGBE_To_QRgbLine(image, scanline, width); + RGBE_To_QRgbLine(image, scanline, h); continue; } @@ -204,84 +394,34 @@ static bool LoadHDR(QDataStream &s, const int width, const int height, QImage &i } } } - - RGBE_To_QRgbLine(image, scanline, width); + RGBE_To_QRgbLine(image, scanline, h); } return true; } -static QSize readHeaderSize(QIODevice *device) -{ - int len; - QByteArray line(MAXLINE + 1, Qt::Uninitialized); - QByteArray format; - - // Parse header - do { - len = device->readLine(line.data(), MAXLINE); - - if (line.startsWith("FORMAT=")) { - format = line.mid(7, len - 7 - 1 /*\n*/); - } - - } while ((len > 0) && (line[0] != '\n')); - - if (format != "32-bit_rle_rgbe") { - qCDebug(HDRPLUGIN) << "Unknown HDR format:" << format; - return QSize(); - } - - len = device->readLine(line.data(), MAXLINE); - line.resize(len); - - /* - TODO: handle flipping and rotation, as per the spec below - The single resolution line consists of 4 values, a X and Y label each followed by a numerical - integer value. The X and Y are immediately preceded by a sign which can be used to indicate - flipping, the order of the X and Y indicate rotation. The standard coordinate system for - Radiance images would have the following resolution string -Y N +X N. This indicates that the - vertical axis runs down the file and the X axis is to the right (imagining the image as a - rectangular block of data). A -X would indicate a horizontal flip of the image. A +Y would - indicate a vertical flip. If the X value appears before the Y value then that indicates that - the image is stored in column order rather than row order, that is, it is rotated by 90 degrees. - The reader can convince themselves that the 8 combinations cover all the possible image orientations - and rotations. - */ - QRegularExpression resolutionRegExp(QStringLiteral("([+\\-][XY]) ([0-9]+) ([+\\-][XY]) ([0-9]+)\n")); - QRegularExpressionMatch match = resolutionRegExp.match(QString::fromLatin1(line)); - if (!match.hasMatch()) { - qCDebug(HDRPLUGIN) << "Invalid HDR file, the first line after the header didn't have the expected format:" << line; - return QSize(); - } - - if ((match.captured(1).at(1) != u'Y') || (match.captured(3).at(1) != u'X')) { - qCDebug(HDRPLUGIN) << "Unsupported image orientation in HDR file."; - return QSize(); - } - - return QSize(match.captured(4).toInt(), match.captured(2).toInt()); -} - -} // namespace - bool HDRHandler::read(QImage *outImage) { QDataStream s(device()); - m_imageSize = readHeaderSize(s.device()); - if (!m_imageSize.isValid()) { + const Header& h = d->header(s.device()); + if (!h.isValid()) { return false; } QImage img; - if (!LoadHDR(s, m_imageSize.width(), m_imageSize.height(), img)) { + if (!LoadHDR(s, h, img)) { // qDebug() << "Error loading HDR file."; return false; } - // The images read by Gimp and Photoshop (including those of the tests) are interpreted with linear color space. + // By setting the linear color space, programs that support profiles display HDR files as in GIMP and Photoshop. - img.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); + img.setColorSpace(h.colorSpace()); + + // Metadata + if (!h.software().isEmpty()) { + img.setText(QStringLiteral(META_KEY_SOFTWARE), h.software()); + } *outImage = img; return true; @@ -295,6 +435,9 @@ bool HDRHandler::supportsOption(ImageOption option) const if (option == QImageIOHandler::ImageFormat) { return true; } + if (option == QImageIOHandler::ImageTransformation) { + return true; + } return false; } @@ -303,15 +446,10 @@ QVariant HDRHandler::option(ImageOption option) const QVariant v; if (option == QImageIOHandler::Size) { - if (!m_imageSize.isEmpty()) { - v = QVariant::fromValue(m_imageSize); - } else if (auto d = device()) { - // transactions works on both random and sequential devices - d->startTransaction(); - auto size = readHeaderSize(d); - d->rollbackTransaction(); - if (size.isValid()) { - v = QVariant::fromValue(size); + if (auto dev = device()) { + auto&& h = d->header(dev); + if (h.isValid()) { + v = QVariant::fromValue(h.m_size); } } } @@ -320,10 +458,21 @@ QVariant HDRHandler::option(ImageOption option) const v = QVariant::fromValue(imageFormat()); } + if (option == QImageIOHandler::ImageTransformation) { + if (auto dev = device()) { + auto&& h = d->header(dev); + if (h.isValid()) { + v = QVariant::fromValue(h.transformation()); + } + } + } + return v; } HDRHandler::HDRHandler() + : QImageIOHandler() + , d(new HDRHandlerPrivate) { } @@ -350,9 +499,9 @@ bool HDRHandler::canRead(QIODevice *device) // allow to load offical test cases: https://radsite.lbl.gov/radiance/framed.html device->startTransaction(); - QSize size = readHeaderSize(device); + auto h = HDRHandlerPrivate::readHeader(device); device->rollbackTransaction(); - if (size.isValid()) { + if (h.isValid()) { return true; } diff --git a/src/imageformats/hdr_p.h b/src/imageformats/hdr_p.h index f0ac600..6f93d64 100644 --- a/src/imageformats/hdr_p.h +++ b/src/imageformats/hdr_p.h @@ -9,7 +9,9 @@ #define KIMG_HDR_P_H #include +#include +class HDRHandlerPrivate; class HDRHandler : public QImageIOHandler { public: @@ -24,11 +26,7 @@ public: static bool canRead(QIODevice *device); private: - /*! - * \brief m_imageSize - * Image size cache used by option() - */ - QSize m_imageSize; + const QScopedPointer d; }; class HDRPlugin : public QImageIOPlugin diff --git a/src/imageformats/jxr.cpp b/src/imageformats/jxr.cpp index 906d8a7..bb6c626 100644 --- a/src/imageformats/jxr.cpp +++ b/src/imageformats/jxr.cpp @@ -436,6 +436,13 @@ public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) << QImage::Format_CMYK8888 #endif +#ifndef JXR_DENY_FLOAT_IMAGE + << QImage::Format_RGBA16FPx4 + << QImage::Format_RGBX16FPx4 + << QImage::Format_RGBA32FPx4 + << QImage::Format_RGBA32FPx4_Premultiplied + << QImage::Format_RGBX32FPx4 +#endif // JXR_DENY_FLOAT_IMAGE << QImage::Format_RGBA64 << QImage::Format_RGBA64_Premultiplied << QImage::Format_RGBA8888 @@ -476,7 +483,18 @@ public: } else { qi = qi.convertToFormat(alpha ? QImage::Format_RGBA8888 : QImage::Format_RGB888); } +#ifndef JXR_DENY_FLOAT_IMAGE + } else if(qi.format() == QImage::Format_RGBA16FPx4 || + qi.format() == QImage::Format_RGBX16FPx4 || + qi.format() == QImage::Format_RGBA32FPx4 || + qi.format() == QImage::Format_RGBA32FPx4_Premultiplied || + qi.format() == QImage::Format_RGBX32FPx4) { + auto cs = qi.colorSpace(); + if (cs.isValid() && cs.transferFunction() != QColorSpace::TransferFunction::Linear) { + qi = qi.convertedToColorSpace(QColorSpace(QColorSpace::SRgbLinear)); + } } +#endif // JXR_DENY_FLOAT_IMAGE return qi; } @@ -759,35 +777,6 @@ private: } }; -template -inline T scRGBTosRGB(T f) -{ - // convert from linear scRGB to non-linear sRGB - if (f <= T(0)) { - return T(0); - } - if (f <= T(0.0031308f)) { - return qBound(T(0), f * T(12.92f), T(1)); - } - if (f < T(1)) { - return qBound(T(0), T(1.055f) * T(pow(f, T(1.0) / T(2.4))) - T(0.055), T(1)); - } - return T(1); -} - -template -inline T alpha_scRGBTosRGB(T f) -{ - // alpha is converted differently than RGB in scRGB - if (f <= T(0)) { - return T(0); - } - if (f < T(1.0)) { - return T(f); - } - return T(1); -} - bool JXRHandler::read(QImage *outImage) { if (!d->initForReading(device())) { @@ -841,13 +830,11 @@ bool JXRHandler::read(QImage *outImage) } else { // additional buffer needed qint64 convStrideSize = (img.width() * d->pDecoder->WMP.wmiI.cBitsPerUnit + 7) / 8; qint64 buffSize = convStrideSize * img.height(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) qint64 limit = QImageReader::allocationLimit(); if (limit && (buffSize + img.sizeInBytes()) > limit * 1024 * 1024) { qCWarning(LOG_JXRPLUGIN) << "JXRHandler::read() unable to covert due to allocation limit set:" << limit << "MiB"; return false; } -#endif QVector ba(buffSize); if (auto err = pConverter->Copy(pConverter, &rect, ba.data(), convStrideSize)) { PKFormatConverter_Release(&pConverter); @@ -866,34 +853,24 @@ bool JXRHandler::read(QImage *outImage) d->setTextMetadata(img); #ifndef JXR_DENY_FLOAT_IMAGE - // JXR float are stored in scRGB -> range -0,5 to 7,5 (source Wikipedia) - if (img.format() == QImage::Format_RGBX16FPx4 || img.format() == QImage::Format_RGBA16FPx4 || img.format() == QImage::Format_RGBA16FPx4_Premultiplied) { + // JXR float are stored in scRGB. + if (img.format() == QImage::Format_RGBX16FPx4 || img.format() == QImage::Format_RGBA16FPx4 || img.format() == QImage::Format_RGBA16FPx4_Premultiplied || + img.format() == QImage::Format_RGBX32FPx4 || img.format() == QImage::Format_RGBA32FPx4 || img.format() == QImage::Format_RGBA32FPx4_Premultiplied) { auto hasAlpha = img.hasAlphaChannel(); for (qint32 y = 0, h = img.height(); y < h; ++y) { - qfloat16 *line = reinterpret_cast(img.scanLine(y)); - for (int x = 0, w = img.width(); x < w; ++x) { - const auto x4 = x * 4; - line[x4 + 0] = scRGBTosRGB(line[x4 + 0]); - line[x4 + 1] = scRGBTosRGB(line[x4 + 1]); - line[x4 + 2] = scRGBTosRGB(line[x4 + 2]); - line[x4 + 3] = hasAlpha ? alpha_scRGBTosRGB(line[x4 + 3]) : qfloat16(1); + if (img.depth() == 64) { + auto line = reinterpret_cast(img.scanLine(y)); + for (int x = 0, w = img.width() * 4; x < w; x += 4) + line[x + 3] = hasAlpha ? std::clamp(line[x + 3], qfloat16(0), qfloat16(1)) : qfloat16(1); + } else { + auto line = reinterpret_cast(img.scanLine(y)); + for (int x = 0, w = img.width() * 4; x < w; x += 4) + line[x + 3] = hasAlpha ? std::clamp(line[x + 3], float(0), float(1)) : float(1); } } - img.setColorSpace(QColorSpace(QColorSpace::SRgb)); - } else if (img.format() == QImage::Format_RGBX32FPx4 || img.format() == QImage::Format_RGBA32FPx4 - || img.format() == QImage::Format_RGBA32FPx4_Premultiplied) { - auto hasAlpha = img.hasAlphaChannel(); - for (qint32 y = 0, h = img.height(); y < h; ++y) { - float *line = reinterpret_cast(img.scanLine(y)); - for (int x = 0, w = img.width(); x < w; ++x) { - const auto x4 = x * 4; - line[x4 + 0] = scRGBTosRGB(line[x4 + 0]); - line[x4 + 1] = scRGBTosRGB(line[x4 + 1]); - line[x4 + 2] = scRGBTosRGB(line[x4 + 2]); - line[x4 + 3] = hasAlpha ? alpha_scRGBTosRGB(line[x4 + 3]) : float(1); - } + if(!img.colorSpace().isValid()) { + img.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); } - img.setColorSpace(QColorSpace(QColorSpace::SRgb)); } #endif @@ -922,19 +899,11 @@ bool JXRHandler::write(const QImage &image) #ifndef JXR_DISABLE_BGRA_HACK if (IsEqualGUID(jxlfmt, GUID_PKPixelFormat32bppRGBA)) { jxlfmt = GUID_PKPixelFormat32bppBGRA; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - qi = qi.rgbSwapped(); -#else qi.rgbSwap(); -#endif } if (IsEqualGUID(jxlfmt, GUID_PKPixelFormat32bppPRGBA)) { jxlfmt = GUID_PKPixelFormat32bppPBGRA; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - qi = qi.rgbSwapped(); -#else qi.rgbSwap(); -#endif } #endif @@ -968,7 +937,7 @@ bool JXRHandler::write(const QImage &image) } // setting metadata (a failure of setting metadata doesn't stop the encoding) - auto cs = image.colorSpace().iccProfile(); + auto cs = qi.colorSpace().iccProfile(); if (!cs.isEmpty()) { if (auto err = d->pEncoder->SetColorContext(d->pEncoder, reinterpret_cast(cs.data()), cs.size())) { qCWarning(LOG_JXRPLUGIN) << "JXRHandler::write() error while setting ICC profile:" << err; @@ -1043,28 +1012,28 @@ QVariant JXRHandler::option(ImageOption option) const if (d->initForReading(device())) { switch (d->pDecoder->WMP.oOrientationFromContainer) { case O_FLIPV: - v = QImageIOHandler::TransformationFlip; + v = int(QImageIOHandler::TransformationFlip); break; case O_FLIPH: - v = QImageIOHandler::TransformationMirror; + v = int(QImageIOHandler::TransformationMirror); break; case O_FLIPVH: - v = QImageIOHandler::TransformationRotate180; + v = int(QImageIOHandler::TransformationRotate180); break; case O_RCW: - v = QImageIOHandler::TransformationRotate90; + v = int(QImageIOHandler::TransformationRotate90); break; case O_RCW_FLIPV: - v = QImageIOHandler::TransformationFlipAndRotate90; + v = int(QImageIOHandler::TransformationFlipAndRotate90); break; case O_RCW_FLIPH: - v = QImageIOHandler::TransformationMirrorAndRotate90; + v = int(QImageIOHandler::TransformationMirrorAndRotate90); break; case O_RCW_FLIPVH: - v = QImageIOHandler::TransformationRotate270; + v = int(QImageIOHandler::TransformationRotate270); break; default: - v = QImageIOHandler::TransformationNone; + v = int(QImageIOHandler::TransformationNone); break; } } diff --git a/src/imageformats/pfm.cpp b/src/imageformats/pfm.cpp index 5c462f0..0a5111d 100644 --- a/src/imageformats/pfm.cpp +++ b/src/imageformats/pfm.cpp @@ -109,7 +109,7 @@ public: QImage::Format format() const { if (isValid()) { - return isBlackAndWhite() ? QImage::Format_Grayscale16 : QImage::Format_RGBX32FPx4; + return QImage::Format_RGBX32FPx4; } return QImage::Format_Invalid; } @@ -155,7 +155,7 @@ public: d->rollbackTransaction(); return ok; } -} ; +}; class PFMHandlerPrivate { @@ -215,42 +215,26 @@ bool PFMHandler::read(QImage *image) } for (auto y = 0, h = img.height(); y < h; ++y) { - float f; - if (header.isBlackAndWhite()) { - auto line = reinterpret_cast(img.scanLine(header.isPhotoshop() ? y : h - y - 1)); - for (auto x = 0, w = img.width(); x < w; ++x) { - s >> f; - // QColorSpace does not handle gray linear profile, so I have to convert to non-linear - f = f < 0.0031308f ? (f * 12.92f) : (1.055 * std::pow(f, 1.0 / 2.4) - 0.055); - line[x] = quint16(std::clamp(f, float(0), float(1)) * std::numeric_limits::max() + float(0.5)); - - if (s.status() != QDataStream::Ok) { - qCWarning(LOG_PFMPLUGIN) << "PFMHandler::read() detected corrupted data"; - return false; - } + auto bw = header.isBlackAndWhite(); + auto line = reinterpret_cast(img.scanLine(header.isPhotoshop() ? y : h - y - 1)); + for (auto x = 0, n = img.width() * 4; x < n; x += 4) { + line[x + 3] = float(1); + s >> line[x]; + if (bw) { + line[x + 1] = line[x]; + line[x + 2] = line[x]; + } else { + s >> line[x + 1]; + s >> line[x + 2]; } - } else { - auto line = reinterpret_cast(img.scanLine(header.isPhotoshop() ? y : h - y - 1)); - for (auto x = 0, n = img.width() * 4; x < n; x += 4) { - s >> f; - line[x] = std::clamp(f, float(0), float(1)); - s >> f; - line[x + 1] = std::clamp(f, float(0), float(1)); - s >> f; - line[x + 2] = std::clamp(f, float(0), float(1)); - line[x + 3] = float(1); - - if (s.status() != QDataStream::Ok) { - qCWarning(LOG_PFMPLUGIN) << "PFMHandler::read() detected corrupted data"; - return false; - } + if (s.status() != QDataStream::Ok) { + qCWarning(LOG_PFMPLUGIN) << "PFMHandler::read() detected corrupted data"; + return false; } } } - if (!header.isBlackAndWhite()) { - img.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); - } + img.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); *image = img; return true;