diff --git a/CMakeLists.txt b/CMakeLists.txt index df7d02f..2b88843 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ set(REQUIRED_QT_VERSION 5.2.0) find_package(Qt5Gui ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) add_subdirectory(src) +add_subdirectory(autotests) add_subdirectory(tests) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt new file mode 100644 index 0000000..dbec894 --- /dev/null +++ b/autotests/CMakeLists.txt @@ -0,0 +1,72 @@ +#find_package(Qt5Test ${REQUIRED_QT_VERSION} NO_MODULE) + +include(ECMMarkAsTest) + +add_definitions(-DPLUGIN_DIR="${CMAKE_CURRENT_BINARY_DIR}/../src") +remove_definitions(-DQT_NO_CAST_FROM_ASCII) + +macro(kimageformats_read_tests) + add_executable(readtest readtest.cpp) + target_link_libraries(readtest Qt5::Gui) + target_compile_definitions(readtest + PRIVATE IMAGEDIR="${CMAKE_CURRENT_SOURCE_DIR}/read") + ecm_mark_as_test(readtest) + foreach(_testname ${ARGN}) + add_test( + NAME kimageformats-read-${_testname} + COMMAND readtest ${_testname} + ) + endforeach(_testname) +endmacro() + +macro(kimageformats_write_tests) + add_executable(writetest writetest.cpp) + target_link_libraries(writetest Qt5::Gui) + target_compile_definitions(writetest + PRIVATE IMAGEDIR="${CMAKE_CURRENT_SOURCE_DIR}/write") + ecm_mark_as_test(writetest) + foreach(_testname ${ARGN}) + string(REGEX MATCH "-lossless$" _is_lossless "${_testname}") + unset(lossless_arg) + if (_is_lossless) + set(lossless_arg "--lossless") + string(REGEX REPLACE "-lossless$" "" _testname "${_testname}") + endif() + add_test( + NAME kimageformats-write-${_testname} + COMMAND writetest ${lossless_arg} ${_testname} + ) + endforeach(_testname) +endmacro() + +# Basic read tests +# Loads each image in read//, and compares the +# result against the data read from the corresponding png file +kimageformats_read_tests( + eps + jp2 + pcx + pic + psd + ras + rgb + tga + xcf + xv +) + +# Basic write tests +# Loads each png image in write/, writes the data out +# as a image, and compares the result against the +# the corresponding file. +# You can append -lossless to the format to indicate that +# reading back the image data will result in an identical image. +kimageformats_write_tests( + eps + jp2 + pcx-lossless + pic-lossless + rgb-lossless + tga # fixme: the alpha images appear not to be written properly + xv +) diff --git a/autotests/read/eps/bw.eps b/autotests/read/eps/bw.eps new file mode 100644 index 0000000..3af28d5 --- /dev/null +++ b/autotests/read/eps/bw.eps @@ -0,0 +1,502 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 0.24.5 (http://poppler.freedesktop.org) +%%Creator: KDE EPS image plugin +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 32 32 +%%HiResBoundingBox: 0 0 32 32 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + 2 array astore + /setpagedevice where { + pop 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 32 32 re +W +q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 -1 0 32] cm +q +q +Q +Q +q +q +q +[1 0 0 1 0 0] cm +[32 0 0 -32 0 32] cm +/DeviceRGB setcolorspace +<< + /ImageType 1 + /Width 32 + /Height 32 + /ImageMatrix [32 0 0 -32 0 32] + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /DataSource currentfile + /ASCII85Decode filter + << >> /DCTDecode filter +>> +pdfIm +s4IA0!"_al8O`[\!10ZOeE%*6F"?A;UOt +Z1LbBV#mqFa(`=5<-7:2j.Ps"@2`NfY6UX@47n?3D;cHat='/U/@q9._B4u!oF*)P +JGBeCZK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^ +rf%8R-g>V&OjQ5OekiqC&o(2MHp@n@XqZ"J6*ru?D!%;) +SAnPdkC3+K>G'A1VH@gd&KnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A +'`Q#s>ai`&\eCE.%f\,!,l[jrG5O;H4@((,Nu7daD.`FnrL6**b\LH,D=SYd",m^?i=l4k#>Y&g9bUO +>MtTa;Y#@t+:FeG9N]V>#1:nBP>^,H +rr3i7qYL3ks8Murs8DQZo^(l=rV?9dq>(!grVqB~> +r;RQ3p?_#1q>0g\p$Lr7o'Pf>qXX=HmJ?e]J,~> +s8O,=nBneOeC:XDIuUA;Vpk(NI>;j;^80&UU>,VGs*t~> +s8O#:mE3iKrr2]^qto3FY/,OEk3:(>i7$6GnbW7bJ,~> +rVm`6lE4o2NnVdeaJsl,X.4m!h9;V"Fb\WIrr7K~> +s8O,:dtV1_a1#Lk*\DP`CmWLr:eDd]L5N6=1n+(:s*t~> +s8O,9a`ji]s8DBPr:?UcD3._\p +rVm`2``!BaL!tg.P)5E?Jo4/5k)G";*GsX+rr7K~> +s8O,:dtV(?^W)3l,qa=M0ic')HZVDbS;t:!3h5jBs*t~> +s8O,9a`jcXrr2Q\rUZO=,XY[bjk[5SdDjJqi:$XEs*t~> +rVm`2b&TI#Ia!RuR(;e8\XeMEkdHG>:6"Q8rr7K~> +s8O,=nBnbIg$IS)PE2AfH[*g.m,5FVe(Eg,Y20$Us*t~> +s8O#:mE3fIrr;omrVXuD-qC)gq"Nk)m-X34oD8IdJ,~> +rVm`6m`W8Uc0*E]bh_dWnF>o5qX3(qb0feZrr7K~> +rr3l7qY0[\rr)Zao' +rr3*!q>(!drsA"DC2M)hs8W&qrr)rurr)kI~> +r;QcrrqZotrVH6_nF#iCrVm'#r;HNirr)kI~> +o`#*]D]DU%r:L#>~> +o`#*gdG)_'rUg,?~> +o`#'lkK`2coDa=~> +o`#*[H#7uerq-5@~> +o`#'no'Z#CoDa=~> +o`#*gZ>Z +o`#'d]WK!>oDa=~> +o`#'i_0NiloDa=~> +o`#*aTT+KQr:L#>~> +o`#'gaMuR#oDa=~> +o`#']HqJeMoDa=~> +o`#*f[sXLurUg,?~> +o`#'lmdBWBoDa=~> +o`#*bTnJ`jrq-5@~> +o`#*^Fs'K#qt0o=~> +o`#*let9hLrq-5@~> +o`#*dRnn@_rUg,?~> +o`#*^O+_r,qt0o=~> +o`#*e[A0PUr:L#>~> +o`#*\D&P^Yqt0o=~> +o`#*idD*iirq-5@~> +o`#*lkNM+#rq-5@~> +o`#*]KlLYGqt0o=~> +o`#*fVI,eXrq-5@~> +o`#'i_L98qoDa=~> +o`#*e]s+j,rq-5@~> +o`#']O+WDVoDa=~> +o`#'^Mf+C>oDa=~> +o`#'hd*U,5oDa=~> +o`#'bW,J^-oDa=~> +o`#'fb/qQooDa=~> +o`#'iiRHrdoDa=~> +p&>3phcL\*lLY%+~> +o`#'g\8\hKoDa=~> +p&>3pn>0Kmp%/36~> +p&>3ne9R:Bm.:7-~> +o`#*[A///#rq-5@~> +o`#*YB.IWRrq-5@~> +p&>3pn)*Top[eE8~> +o`#*ZH<=7\q=O];~> +o`#*[Is$k#r:L#>~> +o`#*kdu]gJr:L#>~> +o`#*cWIfZ,p@SB8~> +o`#*^QC4Ghq=O];~> +o`#*dPqb(co^r06~> +o`#*j`eT>iq=O];~> +o`#*f\#$+Gq"4T:~> +o`#*cSRH!"oCW'5~> +o`#*eS2)jio^r06~> +o`#*nmIB`8rUg,?~> +o`#*kcF::.qXjf<~> +o`#*eWI&uko^r06~> +o`#*op#Y<.rq-5@~> +o`#*kcA.2#qXjf<~> +o`#*keZlC0qXjf<~> +o`#*nldaPOrUg,?~> +o`#*eRkZXeo^r06~> +o`#*i\R8gUq"4T:~> +o`#*lfp\A_qt0o=~> +o`#*eWdB)mo^r06~> +o`#*fWB32@p%897~> +o`#*hZU7*dp[nK9~> +o`#*mk2YLar:L#>~> +o`#*mh4:+mr:L#>~> +o`#*mhO^=qr:L#>~> +oD\pjq"XdYs*t~> +oD\pjo^r(Qs*t~> +oD\pjo^r(Qs*t~> +iW"E~> +iW"E~> +iW"E~> +iW"E~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/autotests/read/eps/rgb-gimp-2.8.10.png b/autotests/read/eps/rgb-gimp-2.8.10.png new file mode 100644 index 0000000..7c0ce75 Binary files /dev/null and b/autotests/read/eps/rgb-gimp-2.8.10.png differ diff --git a/autotests/read/eps/rgb.eps b/autotests/read/eps/rgb.eps new file mode 100644 index 0000000..5df1b48 --- /dev/null +++ b/autotests/read/eps/rgb.eps @@ -0,0 +1,505 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 0.24.5 (http://poppler.freedesktop.org) +%%Creator: KDE EPS image plugin +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 32 32 +%%HiResBoundingBox: 0 0 32 32 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + 2 array astore + /setpagedevice where { + pop 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 32 32 re +W +q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 -1 0 32] cm +q +q +Q +Q +q +q +q +[1 0 0 1 0 0] cm +[32 0 0 -32 0 32] cm +/DeviceRGB setcolorspace +<< + /ImageType 1 + /Width 32 + /Height 32 + /ImageMatrix [32 0 0 -32 0 32] + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /DataSource currentfile + /ASCII85Decode filter + << >> /DCTDecode filter +>> +pdfIm +s4IA0!"_al8O`[\!10ZOeE%*6F"?A;UOt +Z1LbBV#mqFa(`=5<-7:2j.Ps"@2`NfY6UX@47n?3D;cHat='/U/@q9._B4u!oF*)P +JGBeCZK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^ +rf%8R-g>V&OjQ5OekiqC&o(2MHp@n@XqZ"J6*ru?D!%;) +SAnPdkC3+K>G'A1VH@gd&KnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A +'`Q#s>ai`&\eCE.%f\,!n_Shppj9lmgH&*&Z5`-0!&G^+@?%=sWQn:&Z!JmV>Q3(78UA/^ +N/i2JRek1>=8iOIiX'uaq]C(*rY9%6hVL.U[YF1+o2#E2rZgV +fAtg!5rLlk%;jl*n<+SZT8_SR;=skUV066U1.p=mFr6"gf2][jPofDZ&\`7@/-r'! +;,l&`4))eYGD-KF%4Q#*6m7m-&ibs?(?PB?TXYaa%2C(@*]]s]E087&>\*L"WW)s0NHRN"Ia3BM^PX0A?"k)FD":7 +Zape3'Q25[,qME[RXmKi%7R$RY-ahd^2Mq#oHbDPloej\L\ps +H'BN#QqXg'$f%32o+9)=0tktVb?\UUL)@Rm9:'aT6=iISQ2.kIjQ"\ +%_ROO<=2Wb\MS98hQG^TuG$9X6EFe(Kg?r;t$)Qpec%CS=pnp0%dOlMsGLMhk<;`4 +`K1YFe4Dk#>F*pbBZ'QZsG'6YnmBb4>:XPI-!+d5f%ibMn4q,rTa=JCm8q9KN(pJ_ +E6F)2g+:rKf>4``l^LjY[CVCPY(ZDD*'3X"&qXqOb/bQNI^2+A(eWj>@,-V.Fe`[b"_:aa,33f`~> +%-EOD- +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/autotests/read/eps/rgb.png b/autotests/read/eps/rgb.png new file mode 100644 index 0000000..bc6c014 Binary files /dev/null and b/autotests/read/eps/rgb.png differ diff --git a/autotests/read/jp2/bw.jp2 b/autotests/read/jp2/bw.jp2 new file mode 100644 index 0000000..5e1ec4d Binary files /dev/null and b/autotests/read/jp2/bw.jp2 differ diff --git a/autotests/read/jp2/bw.png b/autotests/read/jp2/bw.png new file mode 100644 index 0000000..759028a Binary files /dev/null and b/autotests/read/jp2/bw.png differ diff --git a/autotests/read/jp2/rgb.jp2 b/autotests/read/jp2/rgb.jp2 new file mode 100644 index 0000000..7aea73e Binary files /dev/null and b/autotests/read/jp2/rgb.jp2 differ diff --git a/autotests/read/jp2/rgb.png b/autotests/read/jp2/rgb.png new file mode 100644 index 0000000..255fe53 Binary files /dev/null and b/autotests/read/jp2/rgb.png differ diff --git a/autotests/read/pcx/bw.pcx b/autotests/read/pcx/bw.pcx new file mode 100644 index 0000000..095d70e Binary files /dev/null and b/autotests/read/pcx/bw.pcx differ diff --git a/autotests/read/pcx/bw.png b/autotests/read/pcx/bw.png new file mode 100644 index 0000000..e2d506b Binary files /dev/null and b/autotests/read/pcx/bw.png differ diff --git a/autotests/read/pcx/rgb-gimp-2.8.10.pcx b/autotests/read/pcx/rgb-gimp-2.8.10.pcx new file mode 100644 index 0000000..90282b4 Binary files /dev/null and b/autotests/read/pcx/rgb-gimp-2.8.10.pcx differ diff --git a/autotests/read/pcx/rgb-gimp-2.8.10.png b/autotests/read/pcx/rgb-gimp-2.8.10.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/pcx/rgb-gimp-2.8.10.png differ diff --git a/autotests/read/pcx/rgb.pcx b/autotests/read/pcx/rgb.pcx new file mode 100644 index 0000000..90282b4 Binary files /dev/null and b/autotests/read/pcx/rgb.pcx differ diff --git a/autotests/read/pcx/rgb.png b/autotests/read/pcx/rgb.png new file mode 100644 index 0000000..267d678 Binary files /dev/null and b/autotests/read/pcx/rgb.png differ diff --git a/autotests/read/pic/bw.pic b/autotests/read/pic/bw.pic new file mode 100644 index 0000000..552c2e8 Binary files /dev/null and b/autotests/read/pic/bw.pic differ diff --git a/autotests/read/pic/bw.png b/autotests/read/pic/bw.png new file mode 100644 index 0000000..e2d506b Binary files /dev/null and b/autotests/read/pic/bw.png differ diff --git a/autotests/read/pic/bwa.pic b/autotests/read/pic/bwa.pic new file mode 100644 index 0000000..affc603 Binary files /dev/null and b/autotests/read/pic/bwa.pic differ diff --git a/autotests/read/pic/bwa.png b/autotests/read/pic/bwa.png new file mode 100644 index 0000000..a754150 Binary files /dev/null and b/autotests/read/pic/bwa.png differ diff --git a/autotests/read/pic/rgb.pic b/autotests/read/pic/rgb.pic new file mode 100644 index 0000000..f8a1b9c Binary files /dev/null and b/autotests/read/pic/rgb.pic differ diff --git a/autotests/read/pic/rgb.png b/autotests/read/pic/rgb.png new file mode 100644 index 0000000..267d678 Binary files /dev/null and b/autotests/read/pic/rgb.png differ diff --git a/autotests/read/pic/rgba.pic b/autotests/read/pic/rgba.pic new file mode 100644 index 0000000..05fed0f Binary files /dev/null and b/autotests/read/pic/rgba.pic differ diff --git a/autotests/read/pic/rgba.png b/autotests/read/pic/rgba.png new file mode 100644 index 0000000..cb0cae0 Binary files /dev/null and b/autotests/read/pic/rgba.png differ diff --git a/autotests/read/psd/rgb-gimp-2.8.10.png b/autotests/read/psd/rgb-gimp-2.8.10.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/psd/rgb-gimp-2.8.10.png differ diff --git a/autotests/read/psd/rgb-gimp-2.8.10.psd b/autotests/read/psd/rgb-gimp-2.8.10.psd new file mode 100644 index 0000000..0f78df6 Binary files /dev/null and b/autotests/read/psd/rgb-gimp-2.8.10.psd differ diff --git a/autotests/read/ras/rgb-gimp-2.8.10-standard.png b/autotests/read/ras/rgb-gimp-2.8.10-standard.png new file mode 100644 index 0000000..f30167c Binary files /dev/null and b/autotests/read/ras/rgb-gimp-2.8.10-standard.png differ diff --git a/autotests/read/ras/rgb-gimp-2.8.10-standard.ras b/autotests/read/ras/rgb-gimp-2.8.10-standard.ras new file mode 100644 index 0000000..1ff5ed4 Binary files /dev/null and b/autotests/read/ras/rgb-gimp-2.8.10-standard.ras differ diff --git a/autotests/read/rgb/bw.png b/autotests/read/rgb/bw.png new file mode 100644 index 0000000..e2d506b Binary files /dev/null and b/autotests/read/rgb/bw.png differ diff --git a/autotests/read/rgb/bw.rgb b/autotests/read/rgb/bw.rgb new file mode 100644 index 0000000..b75e524 Binary files /dev/null and b/autotests/read/rgb/bw.rgb differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.png b/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.png differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.rgb b/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.rgb new file mode 100644 index 0000000..c5f7f03 Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.rgb differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-rle.png b/autotests/read/rgb/rgb-gimp-2.8.10-rle.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-rle.png differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-rle.rgb b/autotests/read/rgb/rgb-gimp-2.8.10-rle.rgb new file mode 100644 index 0000000..c3ba4eb Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-rle.rgb differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.png b/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.png differ diff --git a/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.rgb b/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.rgb new file mode 100644 index 0000000..370010a Binary files /dev/null and b/autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.rgb differ diff --git a/autotests/read/rgb/rgb.png b/autotests/read/rgb/rgb.png new file mode 100644 index 0000000..267d678 Binary files /dev/null and b/autotests/read/rgb/rgb.png differ diff --git a/autotests/read/rgb/rgb.rgb b/autotests/read/rgb/rgb.rgb new file mode 100644 index 0000000..a334b21 Binary files /dev/null and b/autotests/read/rgb/rgb.rgb differ diff --git a/autotests/read/tga/bw.png b/autotests/read/tga/bw.png new file mode 100644 index 0000000..b4046ab Binary files /dev/null and b/autotests/read/tga/bw.png differ diff --git a/autotests/read/tga/bw.tga b/autotests/read/tga/bw.tga new file mode 100644 index 0000000..0ae195a Binary files /dev/null and b/autotests/read/tga/bw.tga differ diff --git a/autotests/read/tga/bwa.png b/autotests/read/tga/bwa.png new file mode 100644 index 0000000..2e56197 Binary files /dev/null and b/autotests/read/tga/bwa.png differ diff --git a/autotests/read/tga/bwa.tga b/autotests/read/tga/bwa.tga new file mode 100644 index 0000000..c0b2ab8 Binary files /dev/null and b/autotests/read/tga/bwa.tga differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.png b/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.png differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.tga b/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.tga new file mode 100644 index 0000000..0364a50 Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-bottom-left.tga differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.png b/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.png differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.tga b/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.tga new file mode 100644 index 0000000..170c54d Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.tga differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.png b/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.png differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.tga b/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.tga new file mode 100644 index 0000000..5d6673a Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.tga differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-top-left.png b/autotests/read/tga/rgb-gimp-2.8.10-top-left.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-top-left.png differ diff --git a/autotests/read/tga/rgb-gimp-2.8.10-top-left.tga b/autotests/read/tga/rgb-gimp-2.8.10-top-left.tga new file mode 100644 index 0000000..6158a15 Binary files /dev/null and b/autotests/read/tga/rgb-gimp-2.8.10-top-left.tga differ diff --git a/autotests/read/tga/rgb.png b/autotests/read/tga/rgb.png new file mode 100644 index 0000000..f8ae67f Binary files /dev/null and b/autotests/read/tga/rgb.png differ diff --git a/autotests/read/tga/rgb.tga b/autotests/read/tga/rgb.tga new file mode 100644 index 0000000..be0fc05 Binary files /dev/null and b/autotests/read/tga/rgb.tga differ diff --git a/autotests/read/tga/rgba.png b/autotests/read/tga/rgba.png new file mode 100644 index 0000000..a4810b8 Binary files /dev/null and b/autotests/read/tga/rgba.png differ diff --git a/autotests/read/tga/rgba.tga b/autotests/read/tga/rgba.tga new file mode 100644 index 0000000..d1fe862 Binary files /dev/null and b/autotests/read/tga/rgba.tga differ diff --git a/autotests/read/xcf/simple-bw-gimp-2.8.10.png b/autotests/read/xcf/simple-bw-gimp-2.8.10.png new file mode 100644 index 0000000..e2d506b Binary files /dev/null and b/autotests/read/xcf/simple-bw-gimp-2.8.10.png differ diff --git a/autotests/read/xcf/simple-bw-gimp-2.8.10.xcf b/autotests/read/xcf/simple-bw-gimp-2.8.10.xcf new file mode 100644 index 0000000..c3ff8d7 Binary files /dev/null and b/autotests/read/xcf/simple-bw-gimp-2.8.10.xcf differ diff --git a/autotests/read/xcf/simple-bwa-gimp-2.8.10.png b/autotests/read/xcf/simple-bwa-gimp-2.8.10.png new file mode 100644 index 0000000..a754150 Binary files /dev/null and b/autotests/read/xcf/simple-bwa-gimp-2.8.10.png differ diff --git a/autotests/read/xcf/simple-bwa-gimp-2.8.10.xcf b/autotests/read/xcf/simple-bwa-gimp-2.8.10.xcf new file mode 100644 index 0000000..9418174 Binary files /dev/null and b/autotests/read/xcf/simple-bwa-gimp-2.8.10.xcf differ diff --git a/autotests/read/xcf/simple-rgb-gimp-2.8.10.png b/autotests/read/xcf/simple-rgb-gimp-2.8.10.png new file mode 100644 index 0000000..267d678 Binary files /dev/null and b/autotests/read/xcf/simple-rgb-gimp-2.8.10.png differ diff --git a/autotests/read/xcf/simple-rgb-gimp-2.8.10.xcf b/autotests/read/xcf/simple-rgb-gimp-2.8.10.xcf new file mode 100644 index 0000000..81fb0a1 Binary files /dev/null and b/autotests/read/xcf/simple-rgb-gimp-2.8.10.xcf differ diff --git a/autotests/read/xcf/simple-rgba-gimp-2.8.10.png b/autotests/read/xcf/simple-rgba-gimp-2.8.10.png new file mode 100644 index 0000000..5899695 Binary files /dev/null and b/autotests/read/xcf/simple-rgba-gimp-2.8.10.png differ diff --git a/autotests/read/xcf/simple-rgba-gimp-2.8.10.xcf b/autotests/read/xcf/simple-rgba-gimp-2.8.10.xcf new file mode 100644 index 0000000..76f80d6 Binary files /dev/null and b/autotests/read/xcf/simple-rgba-gimp-2.8.10.xcf differ diff --git a/autotests/read/xv/bw.png b/autotests/read/xv/bw.png new file mode 100644 index 0000000..5f8fc8d Binary files /dev/null and b/autotests/read/xv/bw.png differ diff --git a/autotests/read/xv/bw.xv b/autotests/read/xv/bw.xv new file mode 100644 index 0000000..b884b2e Binary files /dev/null and b/autotests/read/xv/bw.xv differ diff --git a/autotests/read/xv/rgb.png b/autotests/read/xv/rgb.png new file mode 100644 index 0000000..d584013 Binary files /dev/null and b/autotests/read/xv/rgb.png differ diff --git a/autotests/read/xv/rgb.xv b/autotests/read/xv/rgb.xv new file mode 100644 index 0000000..60cdbf3 --- /dev/null +++ b/autotests/read/xv/rgb.xv @@ -0,0 +1,6 @@ +P7 332 +#XVVERSION: +#IMGINFO: +#END_OF_COMMENTS: +32 32 255 +џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлЛОннОžЛЖЖйюв~ž{ЛОКйОПпџџџџџџлWмМ~>vjn‘Ъq]Zšš•И];ŸџџџџџџлW}Мм?>>rf'KЪВ~z7vššЙ~?ŸџџџџџџџлЛПоўпПŸžЛ‹gkзћџџПЛппџпПпџџџџџџџџџџџџџџџџџГoћџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{[пџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~}~пџџџџџџџџџџџџџџџџџџџџџџџџџџџџКЎкџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЩЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ№ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвŠЭћџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЂЋћџџџџџџџџџџџџџџџџџџџџџџџџџџџџђэюћџџџџџџџџџџџџџџџџџџџџџџџџџџџџжvжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšyšџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнинџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕjЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџoOпџџџџџџџџџџџџџџџџџџџџџџџџџџџџoNRЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ”Кџџџџџџџџџџџџџџџџџџџџџџџџџџџџж••кџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ>>ŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџП~~ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџоИИоџџџџџџџџџџџџџџџџџџџџџџџџџџџџКqqКџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ++Зџџџџџџџџџџџџџџџџџџџџџџџџџџџџл““лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ \ No newline at end of file diff --git a/autotests/readtest.cpp b/autotests/readtest.cpp new file mode 100644 index 0000000..d27ca7b --- /dev/null +++ b/autotests/readtest.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2014 Alex Merry + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char ** argv) +{ + QCoreApplication app(argc, argv); + QCoreApplication::addLibraryPath(QStringLiteral(PLUGIN_DIR)); + QCoreApplication::setApplicationName(QStringLiteral("readtest")); + QCoreApplication::setApplicationVersion(QStringLiteral("1.0.0")); + + QCommandLineParser parser; + parser.setApplicationDescription(QStringLiteral("Performs basic image conversion checking.")); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument(QStringLiteral("format"), QStringLiteral("format to test")); + + parser.process(app); + + const QStringList args = parser.positionalArguments(); + if (args.count() < 1) { + QTextStream(stderr) << "Must provide a format\n"; + parser.showHelp(1); + } else if (args.count() > 1) { + QTextStream(stderr) << "Too many arguments\n"; + parser.showHelp(1); + } + + QString suffix = args.at(0); + QByteArray format = suffix.toLatin1(); + + QDir imgdir(QLatin1String(IMAGEDIR "/") + suffix); + imgdir.setNameFilters(QStringList(QLatin1String("*.") + suffix)); + imgdir.setFilter(QDir::Files); + + int passed = 0; + int failed = 0; + + QTextStream(stdout) << "********* " + << "Starting basic read tests for " + << suffix << " images *********\n"; + + foreach (QFileInfo fi, imgdir.entryInfoList()) { + int suffixPos = fi.filePath().count() - suffix.count(); + QString inputfile = fi.filePath(); + QString expfile = fi.filePath().replace(suffixPos, suffix.count(), "png"); + QString expfilename = QFileInfo(expfile).fileName(); + + QImageReader inputReader(inputfile, format.constData()); + QImageReader expReader(expfile, "png"); + + QImage inputImage; + QImage expImage; + + if (!expReader.read(&expImage)) { + QTextStream(stdout) << "ERROR: " << fi.fileName() + << ": could not load " << expfilename + << ": " << expReader.errorString() + << "\n"; + ++failed; + continue; + } + if (!inputReader.read(&inputImage)) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": failed to load: " + << inputReader.errorString() + << "\n"; + ++failed; + continue; + } + inputImage = inputImage.convertToFormat(expImage.format()); + if (expImage != inputImage) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": differs from " << expfilename << "\n"; + ++failed; + } else { + QTextStream(stdout) << "PASS : " << fi.fileName() << "\n"; + ++passed; + } + } + + QTextStream(stdout) << "Totals: " + << passed << " passed, " + << failed << " failed\n"; + QTextStream(stdout) << "********* " + << "Finished basic read tests for " + << suffix << " images *********\n"; + + return failed == 0 ? 0 : 1; +} diff --git a/autotests/write/bw.eps b/autotests/write/bw.eps new file mode 100644 index 0000000..3af28d5 --- /dev/null +++ b/autotests/write/bw.eps @@ -0,0 +1,502 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 0.24.5 (http://poppler.freedesktop.org) +%%Creator: KDE EPS image plugin +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 32 32 +%%HiResBoundingBox: 0 0 32 32 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + 2 array astore + /setpagedevice where { + pop 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 32 32 re +W +q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 -1 0 32] cm +q +q +Q +Q +q +q +q +[1 0 0 1 0 0] cm +[32 0 0 -32 0 32] cm +/DeviceRGB setcolorspace +<< + /ImageType 1 + /Width 32 + /Height 32 + /ImageMatrix [32 0 0 -32 0 32] + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /DataSource currentfile + /ASCII85Decode filter + << >> /DCTDecode filter +>> +pdfIm +s4IA0!"_al8O`[\!10ZOeE%*6F"?A;UOt +Z1LbBV#mqFa(`=5<-7:2j.Ps"@2`NfY6UX@47n?3D;cHat='/U/@q9._B4u!oF*)P +JGBeCZK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^ +rf%8R-g>V&OjQ5OekiqC&o(2MHp@n@XqZ"J6*ru?D!%;) +SAnPdkC3+K>G'A1VH@gd&KnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A +'`Q#s>ai`&\eCE.%f\,!,l[jrG5O;H4@((,Nu7daD.`FnrL6**b\LH,D=SYd",m^?i=l4k#>Y&g9bUO +>MtTa;Y#@t+:FeG9N]V>#1:nBP>^,H10ZOeE%*6F"?A;UOt +Z1LbBV#mqFa(`=5<-7:2j.Ps"@2`NfY6UX@47n?3D;cHat='/U/@q9._B4u!oF*)P +JGBeCZK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^ +rf%8R-g>V&OjQ5OekiqC&o(2MHp@n@XqZ"J6*ru?D!%;) +SAnPdkC3+K>G'A1VH@gd&KnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A +'`Q#s>ai`&\eCE.%f\,!n_Shppj9lmgH&*&Z5`-0!&G^+@?%=sWQn:&Z!JmV>Q3(78UA/^ +N/i2JRek1>=8iOIiX'uaq]C(*rY9%6hVL.U[YF1+o2#E2rZgV +fAtg!5rLlk%;jl*n<+SZT8_SR;=skUV066U1.p=mFr6"gf2][jPofDZ&\`7@/-r'! +;,l&`4))eYGD-KF%4Q#*6m7m-&ibs?(?PB?TXYaa%2C(@*]]s]E087&>\*L"WW)s0NHRN"Ia3BM^PX0A?"k)FD":7 +Zape3'Q25[,qME[RXmKi%7R$RY-ahd^2Mq#oHbDPloej\L\ps +H'BN#QqXg'$f%32o+9)=0tktVb?\UUL)@Rm9:'aT6=iISQ2.kIjQ"\ +%_ROO<=2Wb\MS98hQG^TuG$9X6EFe(Kg?r;t$)Qpec%CS=pnp0%dOlMsGLMhk<;`4 +`K1YFe4Dk#>F*pbBZ'QZsG'6YnmBb4>:XPI-!+d5f%ibMn4q,rTa=JCm8q9KN(pJ_ +E6F)2g+:rKf>4``l^LjY[CVCPY(ZDD*'3X"&qXqOb/bQNI^2+A(eWj>@,-V.Fe`[b"_:aa,33f`~> +%-EOD- +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/autotests/write/rgb.jp2 b/autotests/write/rgb.jp2 new file mode 100644 index 0000000..7aea73e Binary files /dev/null and b/autotests/write/rgb.jp2 differ diff --git a/autotests/write/rgb.pcx b/autotests/write/rgb.pcx new file mode 100644 index 0000000..90282b4 Binary files /dev/null and b/autotests/write/rgb.pcx differ diff --git a/autotests/write/rgb.pic b/autotests/write/rgb.pic new file mode 100644 index 0000000..f8a1b9c Binary files /dev/null and b/autotests/write/rgb.pic differ diff --git a/autotests/write/rgb.png b/autotests/write/rgb.png new file mode 100644 index 0000000..267d678 Binary files /dev/null and b/autotests/write/rgb.png differ diff --git a/autotests/write/rgb.rgb b/autotests/write/rgb.rgb new file mode 100644 index 0000000..a334b21 Binary files /dev/null and b/autotests/write/rgb.rgb differ diff --git a/autotests/write/rgb.tga b/autotests/write/rgb.tga new file mode 100644 index 0000000..be0fc05 Binary files /dev/null and b/autotests/write/rgb.tga differ diff --git a/autotests/write/rgb.xv b/autotests/write/rgb.xv new file mode 100644 index 0000000..60cdbf3 --- /dev/null +++ b/autotests/write/rgb.xv @@ -0,0 +1,6 @@ +P7 332 +#XVVERSION: +#IMGINFO: +#END_OF_COMMENTS: +32 32 255 +џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлЛОннОžЛЖЖйюв~ž{ЛОКйОПпџџџџџџлWмМ~>vjn‘Ъq]Zšš•И];ŸџџџџџџлW}Мм?>>rf'KЪВ~z7vššЙ~?ŸџџџџџџџлЛПоўпПŸžЛ‹gkзћџџПЛппџпПпџџџџџџџџџџџџџџџџџГoћџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{[пџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~}~пџџџџџџџџџџџџџџџџџџџџџџџџџџџџКЎкџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЩЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ№ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвŠЭћџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЂЋћџџџџџџџџџџџџџџџџџџџџџџџџџџџџђэюћџџџџџџџџџџџџџџџџџџџџџџџџџџџџжvжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšyšџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнинџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕjЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџoOпџџџџџџџџџџџџџџџџџџџџџџџџџџџџoNRЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ”Кџџџџџџџџџџџџџџџџџџџџџџџџџџџџж••кџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ>>ŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџП~~ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџоИИоџџџџџџџџџџџџџџџџџџџџџџџџџџџџКqqКџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ++Зџџџџџџџџџџџџџџџџџџџџџџџџџџџџл““лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ \ No newline at end of file diff --git a/autotests/write/rgba.pic b/autotests/write/rgba.pic new file mode 100644 index 0000000..05fed0f Binary files /dev/null and b/autotests/write/rgba.pic differ diff --git a/autotests/write/rgba.png b/autotests/write/rgba.png new file mode 100644 index 0000000..cb0cae0 Binary files /dev/null and b/autotests/write/rgba.png differ diff --git a/autotests/write/rgba.tga b/autotests/write/rgba.tga new file mode 100644 index 0000000..d1fe862 Binary files /dev/null and b/autotests/write/rgba.tga differ diff --git a/autotests/write/rgba.xv b/autotests/write/rgba.xv new file mode 100644 index 0000000..7fe0441 Binary files /dev/null and b/autotests/write/rgba.xv differ diff --git a/autotests/writetest.cpp b/autotests/writetest.cpp new file mode 100644 index 0000000..cd50ff0 --- /dev/null +++ b/autotests/writetest.cpp @@ -0,0 +1,170 @@ +/* + * Copyright 2014 Alex Merry + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char ** argv) +{ + QCoreApplication app(argc, argv); + QCoreApplication::addLibraryPath(QStringLiteral(PLUGIN_DIR)); + QCoreApplication::setApplicationName(QStringLiteral("readtest")); + QCoreApplication::setApplicationVersion(QStringLiteral("1.0.0")); + + QCommandLineParser parser; + parser.setApplicationDescription(QStringLiteral("Performs basic image conversion checking.")); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument(QStringLiteral("format"), QStringLiteral("format to test.")); + QCommandLineOption lossless( + QStringList() << QStringLiteral("l") << QStringLiteral("lossless"), + QStringLiteral("Check that reading back the data gives the same image.")); + parser.addOption(lossless); + + parser.process(app); + + const QStringList args = parser.positionalArguments(); + if (args.count() < 1) { + QTextStream(stderr) << "Must provide a format\n"; + parser.showHelp(1); + } else if (args.count() > 1) { + QTextStream(stderr) << "Too many arguments\n"; + parser.showHelp(1); + } + + QString suffix = args.at(0); + QByteArray format = suffix.toLatin1(); + + QDir imgdir(QStringLiteral(IMAGEDIR)); + imgdir.setNameFilters(QStringList(QLatin1String("*.") + suffix)); + imgdir.setFilter(QDir::Files); + + int passed = 0; + int failed = 0; + + QTextStream(stdout) << "********* " + << "Starting basic write tests for " + << suffix << " images *********\n"; + + foreach (QFileInfo fi, imgdir.entryInfoList()) { + int suffixPos = fi.filePath().count() - suffix.count(); + QString pngfile = fi.filePath().replace(suffixPos, suffix.count(), "png"); + QString pngfilename = QFileInfo(pngfile).fileName(); + + QImageReader pngReader(pngfile, "png"); + QImage pngImage; + if (!pngReader.read(&pngImage)) { + QTextStream(stdout) << "ERROR: " << fi.fileName() + << ": could not load " << pngfilename + << ": " << pngReader.errorString() + << "\n"; + ++failed; + continue; + } + + QFile expFile(fi.filePath()); + if (!expFile.open(QIODevice::ReadOnly)) { + QTextStream(stdout) << "ERROR: " << fi.fileName() + << ": could not open " << fi.fileName() + << ": " << expFile.errorString() + << "\n"; + ++failed; + continue; + } + QByteArray expData = expFile.readAll(); + if (expData.isEmpty()) { + // check if there was actually anything to read + expFile.reset(); + char buf[1]; + qint64 result = expFile.read(buf, 1); + if (result < 0) { + QTextStream(stdout) << "ERROR: " << fi.fileName() + << ": could not load " << fi.fileName() + << ": " << expFile.errorString() + << "\n"; + ++failed; + continue; + } + } + + QByteArray writtenData; + { + QBuffer buffer(&writtenData); + QImageWriter imgWriter(&buffer, format.constData()); + if (!imgWriter.write(pngImage)) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": failed to write image data\n"; + ++failed; + continue; + } + } + + if (expData != writtenData) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": written data differs from " << fi.fileName() << "\n"; + ++failed; + continue; + } + + QImage reReadImage; + { + QBuffer buffer(&writtenData); + QImageReader imgReader(&buffer, format.constData()); + if (!imgReader.read(&reReadImage)) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": could not read back the written data\n"; + ++failed; + continue; + } + reReadImage = reReadImage.convertToFormat(pngImage.format()); + } + + if (parser.isSet(lossless)) { + if (pngImage != reReadImage) { + QTextStream(stdout) << "FAIL : " << fi.fileName() + << ": re-reading the data resulted in a different image\n"; + ++failed; + continue; + } + } + + QTextStream(stdout) << "PASS : " << fi.fileName() << "\n"; + ++passed; + } + + QTextStream(stdout) << "Totals: " + << passed << " passed, " + << failed << " failed\n"; + QTextStream(stdout) << "********* " + << "Finished basic write tests for " + << suffix << " images *********\n"; + + return failed == 0 ? 0 : 1; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b57287b..81d903a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,8 +2,6 @@ add_definitions(-DPLUGIN_DIR="${CMAKE_CURRENT_BINARY_DIR}/../src") include(ECMMarkAsTest) -find_package(Qt5 5.2.0 CONFIG REQUIRED Test Gui) - macro(kimageformats_executable_tests) foreach(_testname ${ARGN}) add_executable(${_testname} ${_testname}.cpp)