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 0000000..de135fe Binary files /dev/null and b/autotests/read/hdr/orientation_all.png differ diff --git a/autotests/read/pfm/testcard_gray.png b/autotests/read/pfm/testcard_gray.png index 3da44c6..8997b93 100644 Binary files a/autotests/read/pfm/testcard_gray.png and b/autotests/read/pfm/testcard_gray.png differ 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;