From f0f6d14367f85fb8e8c129e49801e05c318b8150 Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Sat, 1 Feb 2014 17:50:15 +0000 Subject: [PATCH] Add simple autotests Two main tests: read the file and compare to a given image (loaded from png), and write a file out and compare to a previously-written image. The write test in particular is kind of fragile, but it should help catch some errors where a code change was not intended to affect the output of the plugin. Tests are included for all the writable formats, as well as every readable format that GIMP can write to (and so I could easily get an example of). REVIEW: 115430 --- CMakeLists.txt | 1 + autotests/CMakeLists.txt | 72 +++ autotests/read/eps/bw.eps | 502 +++++++++++++++++ autotests/read/eps/bw.png | Bin 0 -> 1038 bytes autotests/read/eps/rgb-gimp-2.8.10.eps | 134 +++++ autotests/read/eps/rgb-gimp-2.8.10.png | Bin 0 -> 1077 bytes autotests/read/eps/rgb.eps | 505 ++++++++++++++++++ autotests/read/eps/rgb.png | Bin 0 -> 1753 bytes autotests/read/jp2/bw.jp2 | Bin 0 -> 306 bytes autotests/read/jp2/bw.png | Bin 0 -> 663 bytes autotests/read/jp2/rgb.jp2 | Bin 0 -> 303 bytes autotests/read/jp2/rgb.png | Bin 0 -> 510 bytes autotests/read/pcx/bw.pcx | Bin 0 -> 1649 bytes autotests/read/pcx/bw.png | Bin 0 -> 743 bytes autotests/read/pcx/rgb-gimp-2.8.10.pcx | Bin 0 -> 1825 bytes autotests/read/pcx/rgb-gimp-2.8.10.png | Bin 0 -> 1067 bytes autotests/read/pcx/rgb.pcx | Bin 0 -> 1825 bytes autotests/read/pcx/rgb.png | Bin 0 -> 1053 bytes autotests/read/pic/bw.pic | Bin 0 -> 1203 bytes autotests/read/pic/bw.png | Bin 0 -> 743 bytes autotests/read/pic/bwa.pic | Bin 0 -> 649 bytes autotests/read/pic/bwa.png | Bin 0 -> 574 bytes autotests/read/pic/rgb.pic | Bin 0 -> 1274 bytes autotests/read/pic/rgb.png | Bin 0 -> 1053 bytes autotests/read/pic/rgba.pic | Bin 0 -> 1631 bytes autotests/read/pic/rgba.png | Bin 0 -> 1234 bytes autotests/read/psd/rgb-gimp-2.8.10.png | Bin 0 -> 1067 bytes autotests/read/psd/rgb-gimp-2.8.10.psd | Bin 0 -> 3204 bytes .../read/ras/rgb-gimp-2.8.10-standard.png | Bin 0 -> 1167 bytes .../read/ras/rgb-gimp-2.8.10-standard.ras | Bin 0 -> 3104 bytes autotests/read/rgb/bw.png | Bin 0 -> 743 bytes autotests/read/rgb/bw.rgb | Bin 0 -> 1174 bytes .../rgb/rgb-gimp-2.8.10-aggressive-rle.png | Bin 0 -> 1067 bytes .../rgb/rgb-gimp-2.8.10-aggressive-rle.rgb | Bin 0 -> 2642 bytes autotests/read/rgb/rgb-gimp-2.8.10-rle.png | Bin 0 -> 1067 bytes autotests/read/rgb/rgb-gimp-2.8.10-rle.rgb | Bin 0 -> 2679 bytes .../read/rgb/rgb-gimp-2.8.10-uncompressed.png | Bin 0 -> 1067 bytes .../read/rgb/rgb-gimp-2.8.10-uncompressed.rgb | Bin 0 -> 3584 bytes autotests/read/rgb/rgb.png | Bin 0 -> 1053 bytes autotests/read/rgb/rgb.rgb | Bin 0 -> 2642 bytes autotests/read/tga/bw.png | Bin 0 -> 763 bytes autotests/read/tga/bw.tga | Bin 0 -> 3090 bytes autotests/read/tga/bwa.png | Bin 0 -> 538 bytes autotests/read/tga/bwa.tga | Bin 0 -> 4114 bytes .../read/tga/rgb-gimp-2.8.10-bottom-left.png | Bin 0 -> 1067 bytes .../read/tga/rgb-gimp-2.8.10-bottom-left.tga | Bin 0 -> 3116 bytes .../tga/rgb-gimp-2.8.10-rle-bottom-left.png | Bin 0 -> 1067 bytes .../tga/rgb-gimp-2.8.10-rle-bottom-left.tga | Bin 0 -> 1210 bytes .../read/tga/rgb-gimp-2.8.10-rle-top-left.png | Bin 0 -> 1067 bytes .../read/tga/rgb-gimp-2.8.10-rle-top-left.tga | Bin 0 -> 1210 bytes .../read/tga/rgb-gimp-2.8.10-top-left.png | Bin 0 -> 1067 bytes .../read/tga/rgb-gimp-2.8.10-top-left.tga | Bin 0 -> 3116 bytes autotests/read/tga/rgb.png | Bin 0 -> 1067 bytes autotests/read/tga/rgb.tga | Bin 0 -> 3090 bytes autotests/read/tga/rgba.png | Bin 0 -> 1284 bytes autotests/read/tga/rgba.tga | Bin 0 -> 4114 bytes autotests/read/xcf/simple-bw-gimp-2.8.10.png | Bin 0 -> 743 bytes autotests/read/xcf/simple-bw-gimp-2.8.10.xcf | Bin 0 -> 1844 bytes autotests/read/xcf/simple-bwa-gimp-2.8.10.png | Bin 0 -> 574 bytes autotests/read/xcf/simple-bwa-gimp-2.8.10.xcf | Bin 0 -> 1037 bytes autotests/read/xcf/simple-rgb-gimp-2.8.10.png | Bin 0 -> 1053 bytes autotests/read/xcf/simple-rgb-gimp-2.8.10.xcf | Bin 0 -> 1860 bytes .../read/xcf/simple-rgba-gimp-2.8.10.png | Bin 0 -> 1253 bytes .../read/xcf/simple-rgba-gimp-2.8.10.xcf | Bin 0 -> 2153 bytes autotests/read/xv/bw.png | Bin 0 -> 969 bytes autotests/read/xv/bw.xv | Bin 0 -> 1081 bytes autotests/read/xv/rgb.png | Bin 0 -> 1130 bytes autotests/read/xv/rgb.xv | 6 + autotests/readtest.cpp | 117 ++++ autotests/write/bw.eps | 502 +++++++++++++++++ autotests/write/bw.jp2 | Bin 0 -> 306 bytes autotests/write/bw.pcx | Bin 0 -> 1649 bytes autotests/write/bw.pic | Bin 0 -> 1203 bytes autotests/write/bw.png | Bin 0 -> 743 bytes autotests/write/bw.rgb | Bin 0 -> 1174 bytes autotests/write/bw.tga | Bin 0 -> 3090 bytes autotests/write/bw.xv | Bin 0 -> 1081 bytes autotests/write/bwa.pic | Bin 0 -> 649 bytes autotests/write/bwa.png | Bin 0 -> 574 bytes autotests/write/bwa.tga | Bin 0 -> 4114 bytes autotests/write/bwa.xv | Bin 0 -> 1081 bytes autotests/write/rgb.eps | 505 ++++++++++++++++++ autotests/write/rgb.jp2 | Bin 0 -> 303 bytes autotests/write/rgb.pcx | Bin 0 -> 1825 bytes autotests/write/rgb.pic | Bin 0 -> 1274 bytes autotests/write/rgb.png | Bin 0 -> 1053 bytes autotests/write/rgb.rgb | Bin 0 -> 2642 bytes autotests/write/rgb.tga | Bin 0 -> 3090 bytes autotests/write/rgb.xv | 6 + autotests/write/rgba.pic | Bin 0 -> 1631 bytes autotests/write/rgba.png | Bin 0 -> 1234 bytes autotests/write/rgba.tga | Bin 0 -> 4114 bytes autotests/write/rgba.xv | Bin 0 -> 1081 bytes autotests/writetest.cpp | 170 ++++++ tests/CMakeLists.txt | 2 - 95 files changed, 2520 insertions(+), 2 deletions(-) create mode 100644 autotests/CMakeLists.txt create mode 100644 autotests/read/eps/bw.eps create mode 100644 autotests/read/eps/bw.png create mode 100644 autotests/read/eps/rgb-gimp-2.8.10.eps create mode 100644 autotests/read/eps/rgb-gimp-2.8.10.png create mode 100644 autotests/read/eps/rgb.eps create mode 100644 autotests/read/eps/rgb.png create mode 100644 autotests/read/jp2/bw.jp2 create mode 100644 autotests/read/jp2/bw.png create mode 100644 autotests/read/jp2/rgb.jp2 create mode 100644 autotests/read/jp2/rgb.png create mode 100644 autotests/read/pcx/bw.pcx create mode 100644 autotests/read/pcx/bw.png create mode 100644 autotests/read/pcx/rgb-gimp-2.8.10.pcx create mode 100644 autotests/read/pcx/rgb-gimp-2.8.10.png create mode 100644 autotests/read/pcx/rgb.pcx create mode 100644 autotests/read/pcx/rgb.png create mode 100644 autotests/read/pic/bw.pic create mode 100644 autotests/read/pic/bw.png create mode 100644 autotests/read/pic/bwa.pic create mode 100644 autotests/read/pic/bwa.png create mode 100644 autotests/read/pic/rgb.pic create mode 100644 autotests/read/pic/rgb.png create mode 100644 autotests/read/pic/rgba.pic create mode 100644 autotests/read/pic/rgba.png create mode 100644 autotests/read/psd/rgb-gimp-2.8.10.png create mode 100644 autotests/read/psd/rgb-gimp-2.8.10.psd create mode 100644 autotests/read/ras/rgb-gimp-2.8.10-standard.png create mode 100644 autotests/read/ras/rgb-gimp-2.8.10-standard.ras create mode 100644 autotests/read/rgb/bw.png create mode 100644 autotests/read/rgb/bw.rgb create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.png create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-aggressive-rle.rgb create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-rle.png create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-rle.rgb create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.png create mode 100644 autotests/read/rgb/rgb-gimp-2.8.10-uncompressed.rgb create mode 100644 autotests/read/rgb/rgb.png create mode 100644 autotests/read/rgb/rgb.rgb create mode 100644 autotests/read/tga/bw.png create mode 100644 autotests/read/tga/bw.tga create mode 100644 autotests/read/tga/bwa.png create mode 100644 autotests/read/tga/bwa.tga create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-bottom-left.png create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-bottom-left.tga create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.png create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-rle-bottom-left.tga create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.png create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-rle-top-left.tga create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-top-left.png create mode 100644 autotests/read/tga/rgb-gimp-2.8.10-top-left.tga create mode 100644 autotests/read/tga/rgb.png create mode 100644 autotests/read/tga/rgb.tga create mode 100644 autotests/read/tga/rgba.png create mode 100644 autotests/read/tga/rgba.tga create mode 100644 autotests/read/xcf/simple-bw-gimp-2.8.10.png create mode 100644 autotests/read/xcf/simple-bw-gimp-2.8.10.xcf create mode 100644 autotests/read/xcf/simple-bwa-gimp-2.8.10.png create mode 100644 autotests/read/xcf/simple-bwa-gimp-2.8.10.xcf create mode 100644 autotests/read/xcf/simple-rgb-gimp-2.8.10.png create mode 100644 autotests/read/xcf/simple-rgb-gimp-2.8.10.xcf create mode 100644 autotests/read/xcf/simple-rgba-gimp-2.8.10.png create mode 100644 autotests/read/xcf/simple-rgba-gimp-2.8.10.xcf create mode 100644 autotests/read/xv/bw.png create mode 100644 autotests/read/xv/bw.xv create mode 100644 autotests/read/xv/rgb.png create mode 100644 autotests/read/xv/rgb.xv create mode 100644 autotests/readtest.cpp create mode 100644 autotests/write/bw.eps create mode 100644 autotests/write/bw.jp2 create mode 100644 autotests/write/bw.pcx create mode 100644 autotests/write/bw.pic create mode 100644 autotests/write/bw.png create mode 100644 autotests/write/bw.rgb create mode 100644 autotests/write/bw.tga create mode 100644 autotests/write/bw.xv create mode 100644 autotests/write/bwa.pic create mode 100644 autotests/write/bwa.png create mode 100644 autotests/write/bwa.tga create mode 100644 autotests/write/bwa.xv create mode 100644 autotests/write/rgb.eps create mode 100644 autotests/write/rgb.jp2 create mode 100644 autotests/write/rgb.pcx create mode 100644 autotests/write/rgb.pic create mode 100644 autotests/write/rgb.png create mode 100644 autotests/write/rgb.rgb create mode 100644 autotests/write/rgb.tga create mode 100644 autotests/write/rgb.xv create mode 100644 autotests/write/rgba.pic create mode 100644 autotests/write/rgba.png create mode 100644 autotests/write/rgba.tga create mode 100644 autotests/write/rgba.xv create mode 100644 autotests/writetest.cpp 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 0000000000000000000000000000000000000000..7c0ce7556b80ec78217365763ddb814d09de0f63 GIT binary patch literal 1077 zcmV-51j_q~P)mo$8xDjcnG(qp*tU>O;Uk1FVpGm& z-nO`@GD|g$66ZO8iAaLmh5{l}v&5MK(~%&Ep%IxqYY2gzEv!5cNi}80CS%?kKz`op zy=`9b>bWW;8{^fX+wo2BTu&&`bp6b9)%N)N8(v2Lj=yu%yVb1EB(lM7IyXLaOyhHKyE+eUd&Cu9DCb$&9ajuo~-!A$Jo!0ha` z!PInM!J0iaJ?{xNUs*HrQu3Y={`_+3jfEUD1Ep}4q|+yjf5YL@s?%zUEdvYm>w2HL(>g20~ebCakVw(#%eJRgH^ipXzIs$-!BPeFFgJ`!(m1tx`}xfY_iG909wSqCb9WPOkHI#$Nrv)6y?f z83HJAI6}yj6A%h+6WD?&ggjPr@hB-uK^4d#fV`h0pa2ReAX~cg{p*Fx-u0JL^(UG= zf*t%o_r7~;QW=n+xo=O`0>G+Nw8EMgDjJY1CZVi<eKqm%=r4hUmg_vOKi5)5@4Bo9 z5mc{h$PJHNBweG+nbi_^+zRgd%EO9%^%EMq$TeyfJ&w}|rdQZdHPI5)meNNdlNwIh z!K+hAqoipw$NRsO8UfVu`d(R8DsF(l&~QF;7l08scNq5rim-a}ziOFF0NRuqMQaC< zD{OF%wY2}6A4UMYH|UQA+>Z#?hGT1)`O^zu3;@W4nG?~> /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 0000000000000000000000000000000000000000..bc6c01431fd3ae5cbe2a702c4ab65ac5a8ab3729 GIT binary patch literal 1753 zcmV;~1}6E5P)wZ?Y)@<_aS)0SSPJ1o zNJt1FBsOgM-&nKEh7CJdfDnNoBwKbygv1|-i|#MRi#OBZ>hQ_l)7ff#a5{PP^yvqy&HZ8#jz2ATFW=L8u{!>>PBwRD6-w5K zDu!pI@#umDOT|E^V@7+^;*ILkX)3jD@+v&}tbX=zdGh$hTkr2&y)+zc?Cwu4ou95e zQBEf17Em!RXHK zUmf3_?_8GO{_g!7KXl#WY&d@O^|NO6>W$fOA`4e}DdReY8?)URMM*A^s6ouog6WJO zj5n7|n`*zHsi-q?D&zUc2O~Q#;#%epPl{oA62fFnrE?zreuAKZC-`sI>& zgaU7=A|jxUW>koRwu3=H(014@MCjdt8rm2u2S?F?oyFt-l_&Q%AO1U@f4xaAJTyoG zvkZ=S*WxaM#h`&Y_S9|t3Jl4JDe91npoGaN?C*Z>H^00fhRsU^0nAM$s^X5wYrA&< z=9somp;M2nggp+SK|V2&%2KGMyq^@GdmS(13v;pqeJ1{%8K- zA3nZ+aB^P9z)%ofn=%E$k@^4EXtzZw?b z|6u3Rm4ekuOGRvHUc{o6kP8rHEg469#wMiRh6W}OdROC^hHAR~qo4e2I2s%sJxvWL zxB)R14q3h#veQo#VrXaLYd;$dKtmQ0Qbr;~;>PjLjsN=W>vEXtbHRT_+`xmGwz2k2 zyFgkS0@AmrEk^`zN%y*r0U%i|#cjms)8ph zn~REWY>vmv%4Im(oF!t7MkfkEr2A4^3%xV60nx<-Fa<>usP|_@wj4s6mR_*fUOwA= z{xFNqW_w!JFe0kc_9%3m#Sn0n{uGObDTru~-zm(%w7^#?qG(}dIw~Ii^Dqj!V|$+dA&;ev^| zXi5};R)+@K=QF4z_t!**pqK(#TYEb+(F4<`P7R vxlKhODC66C;#{VAIP8&7E=I{APfTvKn4gy05dxyBLw|VVNhmZbS_FwEXgmj zQt(PF4oEFh2um$0&dkqKFx0a&FwisnAH=`|)X2!l%EH3H_&H z#45^!DLR1x_8Hz2_On*e4h BM^yj- literal 0 HcmV?d00001 diff --git a/autotests/read/jp2/bw.png b/autotests/read/jp2/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..759028abd54182fe6bb2df5e0e526f26aa6c36ae GIT binary patch literal 663 zcmV;I0%-k-P)Kl*v-$Knz5sOxZC1|En}zioU{bxBFUa&PlU%o@Ycm1XUUzcyJpxRVb(^K+L+wOQdbsd#^dKW0;vgJ-P3QXg@l! zM-|+M2*v}-Oe4Dsvoa!l?>Xlf<2;VFmT#}BmI%Oc9A5(ZyH2DVux@$*4aoGaV68dE zdV1P>dql=c;}`G?_yzm|egXd@{sLh3(I0+RO|1X`002ovPDHLkV1jYKD3JgF literal 0 HcmV?d00001 diff --git a/autotests/read/jp2/rgb.jp2 b/autotests/read/jp2/rgb.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..7aea73e28dccdca79ce6846e147f127f7737b096 GIT binary patch literal 303 zcmZQzVBpCLP*C9IYUg5LU=T?wsVvAUFj4@r8KAT-kj?;d#WFKeih#5N7&Ei818D{Z z{^b0eB1SM%07L>6C;#{VAIP8&7E=I{APfTvKn4gy05dxyBLw|VVNhmZbS_FwEXgmj zQt(PF4oEFh2um$0&dkqKFx0a&FwisnAH=`|)X2!l%EH3H_&H x#45^!DLR1xRkZ))>{FsG-14tjg!NtH|cYjiO0|NZN2>@?UL{0zz literal 0 HcmV?d00001 diff --git a/autotests/read/jp2/rgb.png b/autotests/read/jp2/rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..255fe53c7a72ea2954cac369633b6c6adc7c05ce GIT binary patch literal 510 zcmVKR6%m%Fbo4A|Np}_fgWhfYNk$iXL^hd8Ofmt5Fo`Q zxK>r|`(9PYaqRnkR8=3UYCjH_tE!69HipI+W9Zs%W8kN?tq0q^AxVkX5s48bw#y!X zMMeNb0+2-M7l5@Ckb^Qw@`jI-#5Or{M`{d7Kq$IwTXhusayNeJPm6BP( z8qcOrjqPm(D}4fKPPk2OhpVbwww)k3*^?St+u;@9rGF&Z2B{$(w@@8s$M$)J=MtYy zp3!p%TByE%rw)1!;>(d-LnBeoCRf$#H?oBiZV#Ne(>I~%0Xe81g`WXtv7L1ON}?87 zyUK1N*DO~g#iuDdB|0^k#MRStLr$RrR8_ppK|d-F4g*kMvyHWp+PcZh=@yE8wh(~J zX5rBQ0P55;_e#InO^CAy2T7J;rubw40L5vH^(j3!%Tv*vQ&qRmSM;0g0Azf7A#VCz z%`$7Vn|nnE AT>t<8 literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/bw.pcx b/autotests/read/pcx/bw.pcx new file mode 100644 index 0000000000000000000000000000000000000000..095d70e3ae869e988d161acd70c64d53045f214d GIT binary patch literal 1649 zcmchX%S%E*6vi{H>mv%K$S5diQxRpjsTM_0P#{F~SXe7**REXEqQER#)viVVK#LxW zmgV9br6_uAi#AdDKrp!&C~Ds3j@-0h!cdxldw*x{H|Lx=Gk5eADs35U&9rx_I#n|N zsi|Aa{yr%e;Ys@0eG<}mCnDYuM1Ve{2qQ%48LtSE5FPa+Kq%AE2$Dqlj~QM$tH-@f zmy=97mmT);!Lb=)pSDemj!n%i;tEMfCDgp{wl&lniD0bN>nh6Cf>);z)Ececv<8s{ zDviKgN2==@Nqdb-Xz8+8`+LcNwP)lQ@vj)gDp=9nF0$&{IouzrG%cK*!HYZG-~spW zd2mVhFq5lYX{FhdaV{c;1j5cLVFoXBr&9Ppnq=r(=8STJN~gP(5Zf|V+VFZU{lbZZ zR$&@Jrr~i4=+P-6zVU(EK8+22=8JEn;I(RV-grjRW6{|WV$OIhyUI(9XYh0R_NCCo zPP_H9N@5&N9JU)A2xqIx;n;Rl?Fyny!((xSnAagP4VT@->{c|zZ~?JmJB_)VIh;7^ sFw84!=Wq%a!=@!f*uwZm29e`6`C?-_u5~BT-#1QgrR0so?P)E1)jxbCtrE}4UMN{WWBtG@56F7V!ybw)(i9BT()zyEYy z*ECJnb>X{hTkpM;5&(=b&N=6twKj?(N+|#kLcI6RIRJ3Z5kf*95z{n9#4i9{*Ue_L ztE;P`D6F;f`Fu8;5kkh}G3Wg0>8WX&s;b`J-Ufp~nx>2~LWnV@u4_cB>ly&!IF?dw zZEc;MolU1xMEnG3n&$HI^8EaKKA$`1wAPEof)Fwo3@D|G#lm}Ut?jxF02pIY^wC~p z45idsyUa@|hr{8)!NC`R-y<9qLJ&e2W1RCW%LpNlkB?-YwM_g-rqjE0Co zBz*z^0Ove#Ym8ZO&VP@CIF32zKbeE3X~MYXocGUxbFM5)tu+7$A^NYt81wM(@c#a; zl*;q`?>W&!1$A9pYuCj=pkXQ5pSe{mFTVOV^*y77_t{#z7Na5J-rnA5G^*?R`T5xx z)Bk&r=lRagju2ur8m;)?!0O%f-oL)SUSD6|-`}5{oP@QfPk?~YwyoA$DYc@};Ky&* ZzW_2gTD;a-w0-~p002ovPDHLkV1n%MZ8iV^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..90282b4a517e59177bfa47e0cf33280f1c16940d GIT binary patch literal 1825 zcmb7FTWnNC7^X2M#up!qAu)E(*-!&O)GUWWOo_kiWxO=0e2s7!W*O5jF3B(Xa92z2+!yN<=;>?dI zWpVhp=jC3ML+XW~JJQllXdKc$$&uzah<3U`7vj-P!C0mX*mRT`{p_cBv za_%M^(r*Iew%SJ7`GOGyT8`5Z`*67n5`_?^{9miB8!nf z{Im}P68Cnyg{e&U)>IuXF8B(=tdtis z_G6^+Z<0FHNu z=*&-)ERU=`S-eWrvY-K^RG%fe8zlyvL6Yo~ASIrzyauWz8CAAugw>K_*}z6~%JxeR zq~R&~%z{B^OpeeT5~kUY4vj|AcSN=gas@CW9VAP(enVQBdeSMJ4S zGgcHASi%uRm7cF~T_Id*8tyHu!}J0IAz>$!V7|Gu4*!}#d^=aa&a@K>Oahk=K~T{E z5NvpJHw$Ux;HxSvViJa8=;Y6>WYx&lV|n-$^qZ0x#`;(kkLe=8%v~I;yNci~+nz(Q z;U)abhWbU#IL|DPK}LwRC5CNH)Or?3FpDtLUjOP9S3L``b1gl_pfuF_B+e1Fy1o=REW-`_jPS z+WgdJgE!^tjykJ1OyY0v&VKJS;wnk^p1f*yfWeN2@#>!r#*WbZ|l+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/rgb.pcx b/autotests/read/pcx/rgb.pcx new file mode 100644 index 0000000000000000000000000000000000000000..90282b4a517e59177bfa47e0cf33280f1c16940d GIT binary patch literal 1825 zcmb7FTWnNC7^X2M#up!qAu)E(*-!&O)GUWWOo_kiWxO=0e2s7!W*O5jF3B(Xa92z2+!yN<=;>?dI zWpVhp=jC3ML+XW~JJQllXdKc$$&uzah<3U`7vj-P!C0mX*mRT`{p_cBv za_%M^(r*Iew%SJ7`GOGyT8`5Z`*67n5`_?^{9miB8!nf z{Im}P68Cnyg{e&U)>IuXF8B(=tdtis z_G6^+Z<0FHNu z=*&-)ERU=`S-eWrvY-K^RG%fe8zlyvL6Yo~ASIrzyauWz8CAAugw>K_*}z6~%JxeR zq~R&~%z{B^OpeeT5~kUY4vj|AcSN=gas@CW9VAP(enVQBdeSMJ4S zGgcHASi%uRm7cF~T_Id*8tyHu!}J0IAz>$!V7|Gu4*!}#d^=aa&a@K>Oahk=K~T{E z5NvpJHw$Ux;HxSvViJa8=;Y6>WYx&lV|n-$^qZ0x#`;(kkLe=8%v~I;yNci~+nz(Q z;U)abhWbU#IL|DPK}LwRC5CNH)Or?3FpDtLUjOP9S3L``b1gl_pfuF_B+e1Fy1o=REW-`_jPS z+WgdJgE!^tjykJ1OyY0v&VKJS;wnk^p1f*yfWeN2@#>!r#*WbZ|l+ literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/rgb.png b/autotests/read/pcx/rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..267d67841ad5f80e0f36cbf514c33d6e9cac146b GIT binary patch literal 1053 zcmV+&1mgRNP)lSO4Jlp zjS2#ZixBXJ_+R)Bc@ifKol%+iWk`lHB8`4$`h4KW;lBywnM8wHrg0sA33d6-s zm*Fo7kqeYak;3w8Ae9*5YDOG^#3m zKft!IvVd>CwC=yO(BA$@4PDO&{p)<|h$wn#G*B?lPlQ~fh0Sm%6MNV{GjnYqH5HsU zXHHGcxkHUtR*k%pyyuU6db#x4e2yEzQlvuhvcE6U9!V%Gc8ei910=h&;8{1;jEt}%+6!V^meGuhrY0VWSRVIUs>99(c>jr(=xf( zgC6fzn6Pb!W<~u1Pg-&<^heF|M-=Wgm#nFkiNW4Gd6Cul?<-h0C6`7gMz-8r_mVn!t9)-GWR7 zRQeB_9xS1op6KN3){S8G^M3a$j8y@2xEvfTPstqmHNADUIec!VvOh(reDv220eDXJ zjn#U7TX6GwtwTpG9XiPeOI3`vXKzBk#4Ed%;xWi35OWeB8Ioq?&g2KN=Zd`r)h|Kh zXa_~ZyY%}RWilP#_BIbUd1IV2M*%LfU#PoBZ;#6CDW4W)PjH(4pG}SVlj~#I*0X&3 zM6)DL4&Mhmih3s;**cQ?p|Lq1aDyD~KH_hOVOC1D!jsm2h!cKZ3diC1r zvlk={GkBcsfLPXO_+tFSk)MJIJ=byE`%F{0HZ5}xNHT9tU2bUjB6W@|WmZbUcGyL3 zUhJ(M*ZD=EGo$FX?Rs#pqdCxJQ&e9}AB9R)g7LB+JLLjOx;}lp?{lRdK((mtQC*s| z01*5-&S&ld@CVO1o&#vo?9TtJXD$I~)v7eT4Wv4HR0yo517CeN4B(xCKrC3U0m}v0 zmY$hAJ^xuhfJ}tj&3d^JD)aGc+gOg4ubPc#=%l17Z^5O7fkFW4bEn2HG)Dp*N$&@2rRTBJ~tKtYG(7^6rp zx;Z$wba3!8II4pvh=RH*F2zd}K_w_PsL?*DjRbWlw0}69^L<~=d*1WC?{S5HzWo02 z!>dMr*V|y1&+_Sg@SWwg-J$r$?~Sw3t+4P@gl!5LFpcuZ_}$%IdPG=DH#avI7Z)NP zkLylPPY(|dW3d>Ev$M0~UWTwPrW@cI~P zFn4x##>U152L~gONH7=_E|)8txu>Vc>-BbYbhNaz*laeZ)7jqME{L^lZEelX&8@Ai zO-)Ut-EOzXx z)WpO@LqkJWRu-hXySry+XXoeVmzI_`H#gVU*SEK~x3;#HmzNh77FJhRY4q*wZ3;U> zyeJpZpP!#65(zY;%Q-nY@T9YQdwVqR`uaMVOu|F3S0=j85u_CRno^A2LqkJ!5gy2Z zvY*o>P$wrROG-+BL?i@%C;_#&xX7*P@}m+5ZftDS*4EN<0C7y_F0Mzr(Bjc9h;dI^ z3m~SzSxI@k3{4XXaU48DS7zuh(N&n)*P4Mhy=S7Z(>}x8B}fo=LhS zp~AqxfWSRce}6wwW(DPcSD630@;q8fE1ZKZpHNUke0qAiyu2LZKA$g>I9jc&tk~^# lY!(OvFjAVH8Y2*5Ti(R|b4!)JF=R@38OA8{g~a%u@e6rSmqq{p literal 0 HcmV?d00001 diff --git a/autotests/read/pic/bw.png b/autotests/read/pic/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d506bb3da276c09b8f9388dc8ad6b96f987f5e GIT binary patch literal 743 zcmV?P)E1)jxbCtrE}4UMN{WWBtG@56F7V!ybw)(i9BT()zyEYy z*ECJnb>X{hTkpM;5&(=b&N=6twKj?(N+|#kLcI6RIRJ3Z5kf*95z{n9#4i9{*Ue_L ztE;P`D6F;f`Fu8;5kkh}G3Wg0>8WX&s;b`J-Ufp~nx>2~LWnV@u4_cB>ly&!IF?dw zZEc;MolU1xMEnG3n&$HI^8EaKKA$`1wAPEof)Fwo3@D|G#lm}Ut?jxF02pIY^wC~p z45idsyUa@|hr{8)!NC`R-y<9qLJ&e2W1RCW%LpNlkB?-YwM_g-rqjE0Co zBz*z^0Ove#Ym8ZO&VP@CIF32zKbeE3X~MYXocGUxbFM5)tu+7$A^NYt81wM(@c#a; zl*;q`?>W&!1$A9pYuCj=pkXQ5pSe{mFTVOV^*y77_t{#z7Na5J-rnA5G^*?R`T5xx z)Bk&r=lRagju2ur8m;)?!0O%f-oL)SUSD6|-`}5{oP@QfPk?~YwyoA$DYc@};Ky&* ZzW_2gTD;a-w0-~p002ovPDHLkV1n%MZ8iV^ literal 0 HcmV?d00001 diff --git a/autotests/read/pic/bwa.pic b/autotests/read/pic/bwa.pic new file mode 100644 index 0000000000000000000000000000000000000000..affc603bebdd64a1d63b5477f6c71e827405733b GIT binary patch literal 649 zcmWG;_-3-CAlJdUC^fMpHASI3vm`^o+r^cELJ;8T9KxUggbWS#49pA+j2ui47&w>& z<^#>04}_@XWCkWiX2uS%crybtBZmNg8y}N^xMZUQi;}*gglMAxlb9%5BUnKb0}G>Q zP)k#5l|XgplC{g1Z8)%D>D<<~1@j!(K*lmKG%>KU+V6S$=0(eMmKX1T{`%hhjq&T3 z#@EbWzxN7YDB*hX>DPyw7f$Xzb>Uj$W9Cb1o#4j6EaGoD`Qt{hyS1LROHh8Ur!qUl zB|xV#aS95w@^PuG{C2^Ei-n1WmA#RNk&Uql?2cXrR`DfYFSxRH!?>bzzg!DqhjRs5 zUOz72fphs9UcRX2gLB0ee*e-V2P7@RA!^Uv=Ml5np0+CTr!E5W&f6Tbdj zgOC;MegC`!VUfhzUl*NO;EE+y{annn0vs%ftm~e5~H+Q literal 0 HcmV?d00001 diff --git a/autotests/read/pic/bwa.png b/autotests/read/pic/bwa.png new file mode 100644 index 0000000000000000000000000000000000000000..a75415012846b5eead134ac502aa740c0cf1cfa7 GIT binary patch literal 574 zcmV-E0>S->P)mofHc2PM z0S82JTDTEZbSp0XGyWxa{s(bsKoEDj(2WBK28=;*igwaTRl7L_Md*&EIw=uyp{O42 zJMYxF_uP6M#6OPdeZcJO2DdZjw^__#m}^{2C3mWpH;+YpM;`??^WRMJzF{zmKnEvq z8#hs6eFyS~aTdJ*4nyE5zT#)ruO$CWFz@3D2HkC-U0lIk+z8;-7!@j|=JUB2kyk0$ zuc`% z)=Dsoi?QD-p6&47*cSq7b6^1{+it?5_Qa=gD@0m#!AkDaINoFqOwxp9Y}gOZa&^vY z(*@P*x5yc=Xp=yJPdVX=6Ivy(j-?vLQWG0?_TW%DS0hw7i2p5q113|2rrJF}9RL6T M07*qoM6N<$f@8P)Z~y=R literal 0 HcmV?d00001 diff --git a/autotests/read/pic/rgb.pic b/autotests/read/pic/rgb.pic new file mode 100644 index 0000000000000000000000000000000000000000..f8a1b9cf58589d407006a6b64eefe37b6786d6a8 GIT binary patch literal 1274 zcmbu8ZA=_R7{@ua#&3Qwrtz)egC-_M6SRp$)2KmXT8)ylDr#b-(zMiGsRW7?&a%8+ zDqJCgsBk9*4=Yznq*&-#Dg_NMS2#EinwD~Kqy?^byL)^4KC`QEyp(n~5xeiM za68608I>d+LI`URs}M;@2AGC8A|r-1Kpa6H%c22fLE;jOBCaD^1W}#=gwiwsJb;SE z^FUGoBN>c{p#HZcMPwf#vK)g0KI9EV`^4Tk^ywVR?Nv_|a|O0TB{my z)J|7@d7-4w|JeI6>-ObPYn-(CAL1W+d^d;fUjfaMT%x{}wlGxj4)A2v={Q zAsP=Y>C=O7y~&tq&<9S>Oi?+ZvM0IEUyo0_IcYILt4vs7ytm=GMK(w;TxY^-jBiQ| z^a^|kqJL~jZKYvg2(SW>WRSgp2txyF02=~MZe=W{_EmAkhuAi2B0LEVNZiB-V_;xe zM;g*~WFSPW)nt^EO-k02*h0&CL16vSoBr(a)jwCEZls1&D2n7#{=AhfuyL+s5Jeaz zhf_!d+|bDBbES?eS1Jp z#Ymr~AP||+%MG@lt48|k)ku_hv4QSkRlaWarz5ikCucmYA~;A>bxA9TVKP|ut>jG3 zZTbBY_^Yizz0SOEH_Q9L7bw|rgsT}DO6bNxP-3`BDlkod7dm%S_3?%6j!(GFB$ z16f1^IvGFpY+}&jjQdHoNf7Lo{1iE^7Lv)0H3>At`B)p(H=ki4nN%iGHPL&+Lw(#@ yW+9nWCXp1qyMK*(G3%CvWKx+#*Kue`r(EBw7LrMoBuP8c$Tua5shq6aN&E%h5u9!S literal 0 HcmV?d00001 diff --git a/autotests/read/pic/rgb.png b/autotests/read/pic/rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..267d67841ad5f80e0f36cbf514c33d6e9cac146b GIT binary patch literal 1053 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0f78df63035d3be6e4d51eccda903f588eae3a19 GIT binary patch literal 3204 zcmeHJYiyHM7(Tny!2F?!Q6|i>7)^{ulc9-=#2;=y6ygPg=)^=AESVF!>0-gLRTyJ5 z2m>M$br)bb#0^*+la&bwLo-;}%IY@4#=1*jTWR}s?RV>UJ;!sY!$jks{gH&8oSvue zd2cz-`<~N`%w@|#9AKXWyrj`N2M|m?PiJH;dRsw0-b= z^uFyMR$Owfc_{VS4fgfl^p-ALnp(d7%a-?Fs1|25KKST-=dO$=pR=t^U(s>CYp|59yC14lW1d@wlT+_&dYS;^-;QgE#OMBnwv?q)BEg3~m$sAND>75G4lt!B(b zP?dE9YBEk!M3!J-%CbKUkwAa3)jkRdOcc+axDXKtieB!#8l}hxg(5mZ7X8}6ixH}5 z5l?;JFviUFDc_X9%+-tb4uu+pb{6aiQ6#&%ev>GQp8n)#nL6_4KK$-5b98%C_Iqbk zng`#wbxW&Eq1x$iTw+qOcG03*kxIqJl9EOSwSktF0gXzP_SLJ~6$+)s#fuvy3Jq^v zofju4paeq{4FPi(tAJEoYorF!z=9dh@9<3O;m)tWqnQdwhMI<{h9*R&5D|lZ)l^ko zRZVDOdgnvVEB(YC!4jjTMeM-hT@pyo4+; zd}P%zS_Bqf-ZObIul~)py&hIW-2U(CU5szZd8FwwqtoOfk!cndN)rtH^M4Z0n%_W=Kso5+aQCYcHzo31P}O*e z<1`bQC>i>j*X8UUa<^S>D$hSwTjB6_A8xg6AJTE1pk%Fc`2+JR`W$6n?WnSDEm*Q` zva)>RV^*)sc3njoFMiSODEqdZ_q5kJs(o#{YTm5$V>*fF(3P`id#0|ob$i3p;Rp^G z8X9wXc!)~?0SL7@x~a)ZI26H|SfF9*Iwd>Nm~u~Oluh|$VV$2HVE9nwmTTgW z5q6f`hP2na*jaLWw%OebDxUMM05g+*SXIqnBDbe}m!B36|6^g3z&IYwo|lV-m~NxL zxN2XJNvB7rZ_<0jqV?^q8e(CEuhXBeV~xz$<*Yd#(F^da=+Rw7e?maQA-tNXHhW$mj_du}A<1Tt2 N2yyqW_y70x{wG`a3$g$J literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f30167c0b5df9cf449761576a40a4bc8b57e3d53 GIT binary patch literal 1167 zcmV;A1aSL_P)ot-(y57<(*3F#5b z`{_(FbAHdf@B2F!p|#dL!H`c<9KfFcpfyAxL}()0#};J-A)$8gbqzuYED<7=g)D~z z$|q(8#QYRhr6|=^5w=E!DO?1O^rC<#mQNB}F^> z!v=YgJF7C3#cOoLbL1R*4q^@<3SpoZzWO}m_ZNCuyY?eih_e)x$Cu?boKO{#;uLi= z0f)LW#7@mHkTs;|&fvhdSY z8f$Hma)A=e!6=)7s10AQr%q@#xD~opg)spF&{dbAJ8Svr`wm9i?y_O|2>Zte(G!hS z(pjcclA&Nd+w5+pGApTJE7@o@eIkYYhoqQw!Tb^oyG2U*+iXfsk`*u&Ww@!D=(R=& z^)Q*=R?zoBhTv+Js7>?wyMlE)1vAYdB@H*nQk47>?dbxJaH-`UL$MhBI>+W%4Q-B? zD}k7AL!}-zp|V3_@_|h>f)GhSgeIg?kbL{0PuH-b-LiP`oj5I99i#&qs49rG#*qqv zK%xi*gxbOtV&NtPkP@T|4gzo}Zaot$FXt+0m?& z!~q=f?{Y8L1CI*j1tfA;cr`pndik@Y;x8fPvcE(Z7e)YyYQX-V$C*6YO7`FY^&JHS z_3*dk{*M4w$)V;<1BqXHiCay$>pW;!{NEb`IJQsw)91lEidDZ6yRr>*3y8(9>_z}u z!bs4_uZ+__m87+^g=F5sGT7RT0AeEIxs}%u zZ=OO=@1n-d8E>nGHuUM)Im(&oH5{;}*wLyHmRS=Tf#0_sE@vB=TwUP1=2pseag!wg zFv@_&6JzYj97j)|CrIBX=IjM(mIy#A#LRuhyKhCZhMlaTFh){&;tT3ldM=-Vt?lm#QGE5Ee=ps(c-7V&;@a;!sdpHc-9e= zC-EzBqNoY1U9Yw;&CGk{qL-+wUn hJdDKu6Tst&KLH}?ob-@u9((`*002ovPDHLkV1fWD9Mb>* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1ff5ed420eda462d9cbbe549b5c597e12f932ec8 GIT binary patch literal 3104 zcmds3Z)_Ar6hFV4_`w*6QNjmJOpGK|6B~^m3?Gby2#Kgg6A^5JAV-yWKxt1X*Y<+6 zw6UdXdndHEV2{#RDm_k$<*K>1N4xELErHT&uYvZCz1_Y2zdN(LGfqJgQu|?J)-S%i z-Mlw>?>BFLZ+3RJp4olU<#Mh4`&sRBJxWa1BTKI(!T%dU2txxwT}29mK^8+6slehO z%BxremaIrBEASavlNlt^fCVgLaR4w7h@zn>KxBc=S_(um#^!QX2sq25c!Ewuy5*kF z(ByVBc|z}=<~@{gxX-8^PMr<4|LW^LyDOSJ=j8&&2dfsn{=5FvwSA*gZEfk_dXw#* zDXN<9nikp&cx(9-(7+=}c%VAg_0c4k4v_aFPf+vwio zuK)JvmWjO$zRX^Dz3=j_nna)_ zcH(X7N^N!zoqiSO1IzIr@WV}9x+Zn?qnrJh88c@yFg$KG^qF;|!s-mGrQw|jH*Fkfm4_1`q)ak{)3bVr1MO!V>AP zp3CvR9&WcsaJRsbG=|o_#UpG1WU3}IEMyvpq(Fq!6~G^&YDLpjnM|UDy7kn;&}O*s zC$|2vLsm?)J*Xo3f>>I@xr4ly26G4_+o`q!c_5#T_Scr4KXUczbs#ugJ;n;Fh0BM_ zH^iFC$7i$JefDitW-o{p%>Aw0+DdL?lQ1%G7!K2eS;?qtxn8;Hl=sjebweQA#a>-@ zqx77da98$Sb z_9P!L_tV7jl8L>c@ne$4*`?K99O>m8P>bf{t0qT^@BB`iioHC$Q6|EZyjI$Asd3xq z4d;Gg6mr5iDWv{YZisr5)O-YWx#DH0VB49B*2_;-Z-r-p|l-QoJ7B~xr5EWAjR$_I$+EI;Jd zK`EW&pG%Y&_bwq$&LCT`B{x+t)kBmR#B~xKW7*I{HzQ@u9}^`8ah=6CHD$54^Y;4J lh!TUi&f;U!G-p%#4?&{DAg;ss1dd?J@{;}+;QzMVzW{%vH}U`g literal 0 HcmV?d00001 diff --git a/autotests/read/rgb/bw.png b/autotests/read/rgb/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d506bb3da276c09b8f9388dc8ad6b96f987f5e GIT binary patch literal 743 zcmV?P)E1)jxbCtrE}4UMN{WWBtG@56F7V!ybw)(i9BT()zyEYy z*ECJnb>X{hTkpM;5&(=b&N=6twKj?(N+|#kLcI6RIRJ3Z5kf*95z{n9#4i9{*Ue_L ztE;P`D6F;f`Fu8;5kkh}G3Wg0>8WX&s;b`J-Ufp~nx>2~LWnV@u4_cB>ly&!IF?dw zZEc;MolU1xMEnG3n&$HI^8EaKKA$`1wAPEof)Fwo3@D|G#lm}Ut?jxF02pIY^wC~p z45idsyUa@|hr{8)!NC`R-y<9qLJ&e2W1RCW%LpNlkB?-YwM_g-rqjE0Co zBz*z^0Ove#Ym8ZO&VP@CIF32zKbeE3X~MYXocGUxbFM5)tu+7$A^NYt81wM(@c#a; zl*;q`?>W&!1$A9pYuCj=pkXQ5pSe{mFTVOV^*y77_t{#z7Na5J-rnA5G^*?R`T5xx z)Bk&r=lRagju2ur8m;)?!0O%f-oL)SUSD6|-`}5{oP@QfPk?~YwyoA$DYc@};Ky&* ZzW_2gTD;a-w0-~p002ovPDHLkV1n%MZ8iV^ literal 0 HcmV?d00001 diff --git a/autotests/read/rgb/bw.rgb b/autotests/read/rgb/bw.rgb new file mode 100644 index 0000000000000000000000000000000000000000..b75e524c06060f3c40deb736d3ed82b7f3b7c492 GIT binary patch literal 1174 zcmZR)#mLCO#Gn9#j0_B5{2xeYR3Wbt_l7w3eD|JrN783j{+&=4;EV~sL9OwH#`K{lT!K)o#goBn)Z`#9|u|8{r>ys-@o6#e*a_o&%peD_Mh9c+gqFK>zgO6UE#UqH7409duxa{vGU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c5f7f03f816516189825acad40721c83558d8ea9 GIT binary patch literal 2642 zcmeH`du&r>7>5sxZJh!p8bd+=r-CsWO@>B^L=zGLB2M|xJKz~GoT5^?z!^{oR)U$}IgmtA zrr$w5u!C$c2fP9vrKscpxB@DG4P=066qR%j;Cs?Uib`w%a{+#9x;IYDKN;7EbP1cwO@Qw@N_v;xcon2!nbNydDVF`s12C)o^UgGq3s=cGjd zvP7IK5&Olx)NuU*z{tPJ!>Aj|&~<;6PeuJxe?rgc|L;2g)UW&Eo}un|9Dk=j_1rk{ zB#8H*$4`Kv{(rlNp}pvS-8Yo+aet~tC1^#e6y*ew4-7IaAB?C19q=;|Cd#pLg8qK5 zDvGM6sfwy8;SlTh3W^{|f}p4)G%8Wsqw;mdFpay-r^%A7Mr`dtR~CaDd9B?Qk(U2%ca@{k4<=CRnC$mF240fpH3;Ui-#ZMNK5T)e?i{r@tJP^zT&e*^^IGnOnNcvi?oj$>doK2zPM!D`6aKFJWy0}s>(7-xMa%2 z>FK$B?&D`&jZRO`eT8G?lvmd^+j4)XV_bE1Tao9~*5a83Uj2~9oK7FT>F=uDwS9lC z`MVa*-&1$2?M8odmHWY*TEnU)i;8?T{n@w6Z$~3{Z~JMQ4aescxN`1X%fQuB&FGym8Ce{7}IoALN3w@I&_h0iaH%|+j4uzRrAn5gyM+VoG)3dW4Q>$7&a z$oa*#9lJY8%v5aLP{SKFbm86u4pJZfKJ6ttYvhGSo9zM~9E>!xpEd z6_d5mx_R^JNDtD@qN1DeJFYaFD@hGkF?DJMXLutu)2G)&j9BjP?d>OLm)&-|J05qH VmUij!Xf0okM)gb4BbL>pKL9anqkjMZ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c3ba4eb81ec9a29443d4e2615d0660cc2aac68f9 GIT binary patch literal 2679 zcmeH{Yfw~W7{`yTz%F^2E{;v3MorDsG&Y0UWI26soTka?VpAqv%uCLwDVipl0x81o zju(_k!vt2vAOn#JNmo)+ut8a2WrKADUBFQ;?(SLka?b9#pZGL@+yi-o(En84^fnf22G$G9MW2)+b!C@PTy_&sqdMJ2QX_$53HOaK#3UIP|^nP4J( zc;E&#ARoZP1P>EDjPNja06RcU<2vvzm<&)asTW)TrC>Ao1Uv?B^prRkeqm4mrhriZ zpZR3eNL~Tn0?z?7Wx5H@g8d)^z{3O&6FiLYFg5^q7`K4=0P`_oK1m^f`6OXJN!!6P zFb&@5IdKDc6rQ+O0_r7<1&J7d_IH;I(9hrELFk4v{M=vVQ=ot9KD3H z!nB_k!YoY-czFP)g08xn_V((G&G|=uInowr$hNLM{A-!B>hN{x0hO{rK|5TGqHsY` z^psWCXYc5{bJ^X~<_?Ag*pGz0w|d2*U7gO8mnw6YA1yIkJfi@#Z#b&Ntikrf*&KMqXcj?uLo!p6FeRkC&Zm+&TT37cxFeom+n{bKR@U zOLm=I`AW$>i%M2en6Mlvnf~;ww47eg@zbtG=RnV03&+~&FMZu?&H1h_?5eX_iv~{a zEPgxRt6fr`)2XTsf0upF?n615U$wCQp1Nag*ZP{PJ@@9+8c|e9kfkeW&%R!EgNxn1 z;iqXP5}#Ax@|iO&{Z~#ldxC?(5LOWA>~Xll3LLOyS%|TcBJ+{3uO_3oM^+U+DoTnF z)wi67rOJuwc3<+RWE)JWmwC zL-|{->b1?WOO01zx`NJ{oi(7>VC`9jU2(@iASCMPP-$M_O}(^*UZ3)2lc+Z+UOm_l zBKb)1JDaZQM=kX3ylf}YFekn*>me8Nr9VFNHkC51JUbDnOH0%!x ziipO{H)PjydOOV7pK1qmxtZRbyVI-RBd}xDwtyaTt*!Cfg@0UK8PT&*N7DsX5BZzz zwaF*r_jmj*@h+e8Evo4T;pgaqk}g&`FDT$+!=0kX{FtKEHHmE?Swv z?!jC7L@jqVrOi9d>of9h&M0t^`wMLadpk)SuGqSzHmYmr!u_QVqK|x=I@QMLdA`wV zy-4z`y}a@gr{}}AMT-wc^q47`GNpv*WjYiZBs&nCcDqv`nu^TK3ZhZi-d>jUFF38% zxJGc-)VPUW_PO0YQimx{O)Vy8xw?f5>qrk`M^RBne8-iUnUzGtR?L`D!Ro%T+F7$| pV|pz0-MZCB?k;(3Hcve6I&h#%i^r&W631yv(ISTVb2R+_>>uQWxGn$y literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..370010a4a9a9ddac83603663758fae8414f988ce GIT binary patch literal 3584 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 literal 0 HcmV?d00001 diff --git a/autotests/read/tga/bwa.tga b/autotests/read/tga/bwa.tga new file mode 100644 index 0000000000000000000000000000000000000000..c0b2ab8f1ed2ec3da02a9f070202c3022c6a9ff7 GIT binary patch literal 4114 zcmeI!O-qzf6u|LGGfSm1$P`?Z&AL8-i$aTR+sY5n!i^}@B8(tJ1*1T4T_{Y7P~bLl z;np^l3r%n*_?D^Is~Y0}57&*%2!@=6bmYgK=Xu6CbI*O7Or|Ka7nd{qW%sWBx5uUe zC+JBrZ2u+vztcF6b2xhd-*X8ys7~r=uj5L(zDVo)R0Xe3Azzr==l9TsPIMITnESoR z;Vp(Sgi(yA_BHKGbfX6Yc!itD_Z>>Oe*UjbHoxrvu0{6)??puwi3Z_%b_|}wIU5zO zqmS6ZHe3sSr>LkU(L4Nw`A6Y75EZUJ_cHTa18Y%-sBou3cTU BfVltw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0364a5035953c4825c044383524a3565c6469085 GIT binary patch literal 3116 zcmd5?$nn*N$Fv~P7%eJ^5R!y9nBy+kBUF;@Wfvv#yl#Tp<3?ZT@E1(W@LkP{sjURm!)L|Y1>FRQS*ZqyJ zQBa2t*{(n_jqbaF@|F)Ns6&U0`7PL*nJJv(9MN5y^U?#h71GfzKb>+v(ZY?KwL-A{&5h{xUCp+uT+7!^xN0PWZz83eec{!}P=0 z@na26dsD+Zv(ak^vCJP6l1-%-_LpQ|c=G=K-TLAj!E}z9Axx%4y{z+U)1J>7FI?tS z#^TUi7l3A846m6UD|zsH8ZmBODuiSRzf7GjojTM#c}ms=X42$|cm>p7A9nxhs_hS^ zQwCuv|4Iy%Gk>m5?)f~`Qj*MsWo$AIU}Ti2GVi+dLHs3 z4o8KltGDEyL40?Ra1&@g3H_5+;{d83pF9`0SBlSSsl37QdICNO2y+)_ zxmbd~6Xutr%D5!=Vi;c?0-9tj29MT+yWc;oeq4lyUcsTSl-hBr$YVWMDR21R>kJfq zBt2Ug-MA}Y5Be&H=tbNT{~~qi^?_>#YNOuP(3!1~>vgGv>BOrr>m{o$&^&*r=Yt(a z_2Xn@jpeTv_Qkj-JZN2|y#AZEBd6YTH8~DC8ooQZbLvoIMX|QMYGU(p=eoL}+dWZp z^vc)IMEV?=cjF5$YuT37{CR!S(Lk@#_bHyJ>Ry|bb-Vjdqb>qg_}yE}e!_ntox zj9qXE-qXX?%P!ADPyE*5@tOAa#Et$~hjS)UBlgVZ+D&+GwLY{@Xb5OxXlPjF2uKmg zV+~jW#93NjU@5As@i{T6=n99WG~fZxSponY1d?RxDv)?!@N{pie7ZbRUsiqipY!DZ Z26n!^Yt!!H9mU(WuD8Egyk*k{+g~;{I@ACF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..170c54d4f12a252bcb24d1232a415faae04a5713 GIT binary patch literal 1210 zcmZWpZA@EL7;Y2m5C8bXnEADZADWn$EkR8r8hGHaZs+*%X)vp0ku40;6&hbc@K2i4))mE#zuJ= z5kUR55$kW3x&cotDr1zLY9^UMq?KQ)Bm2LIwv1TzJC2CNU0A&5{g~o%1T+2Giix|MTFOKsS+Itl=|;Hw>-KF zF8_nIY=xDiucxu5VE_?GLrsKOg%~NTSD2SDC&%MSYd`y`Ib~{v<6#U*E#x4q0i;SQ zA`PhuA{2;_gt3~Dq=-FBc7&NE@&(xGD>wMwA#{5P)065#1iGfQ#zD1yV(MJTNF`q^ zPrUtAvU4&uFETRCq{Hx@o1MQnM+d{qEg!QI5GFXj55W)-&j_!ILj{iq;fWew&j-iE zPm0j+YsmYxP&dI9*|ZlZe$x*Qv%BbH?)k#Nmc4GH$4L#7H{25XGJ5IF!K;Vs0*+Si z*&Y6C_UMsV_;r|YU`_bHxVQJi-E#HgcyyiSs%8%c=_hRJ28!SKZTs;v?^~KoM@$Xh zSMHfU+E`I6?W&sGw$io1?y*`YYffDLX1%}P6n`(Y_^Om>`Hy&REU|#QPw4*)%^W~8 zXXU=Rq}i{W8dU6Kq4PbRe^~p@ANB+#s@n z&ZRmOc;~@bR#!>Hp@N_+A(6%)iXnp}ps^4o$SQ#*h`hw4k`W;-(1?ox1~9b70zgB+ taY|YQ90O#AJOd;=SY;cTc*b)7rakZM-MX)Mck#|08;x%jZ{NB}_b=XTm017) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5d6673a04e1905f5396b83c886a7b47e88d49378 GIT binary patch literal 1210 zcmZWoZ%i9y7;h8j2fz5inE7uDA2cyBTY{QMH2YwdX;_wRaeu6uI5$b=bRD|LCWE>i z1)2#RL=Y8P83;}~M#gY-bxc+?1v)6y!m=?6B^$JB@2>6r>%H&Yy|3>9EgIj;o9CYA zcfa2~_j~R&7#=gMtUQB$J(bsrG1hkl*-vAHFjNqfB_z@q#4u!#1T+?+q=Y%32_i2s z=~Pt62sGm2fB_7xu>jBzaGa760mlHD(L{&@j8$EdBKuigmPsLhFdp>u2)&=7se@?h zoZK^$DhVj3`xX00_=2nBcWcjuBi_(O3+t#Es#>zx9@@gUj*m^Zw@3cy3w4xC2dY!u zGwF5(-Xr3=@QOH8@Ms90toC((xJRyf91pM8+*RzM5dDNr-AM79zHK{k_I*pE`KY=6 z`-;7j#~R8DrQMa|+m|{w+Pzlmc=gGv-)sooDo~k9gJ=cJkUSzIy=O9l-RsIv0iR39X@Dts9#-A2v~`7t4}wf0gPOPtS^s zOf#7XeBfbcFU`=Q2y@5JECq!zj_*M*ylTtJC^ZcOh(HFCabOi*_$ zc^Q&W{0diE%$l7kOB~E2jB-#426_R>pdZr;2N(&`FhnI$qAclk*9c3)HZ#9S;x z`pB`Ew0feA&8uX0G^Ixu6b1bY;+49V+m*XoEvJS8chaQY97|3JLG#tYXMXm-*^&4w zf|RumMOyi#Dth3HSaVS{;pdUE#$p6ecVozU*;3o*jmKo-L{{(-PG*0dtSO#6=9)Om zXIMM=-WuHsgz-F(Obh%>{*0?)4pI@GN@YqruQeX{yy4<+v?yhvM+qw#i_ae} zO1|{u{loh+3$x^OWZ$(8#vg`GpQLV$5l?)1yXK+-|7EXhdDXh7_u$nR<-kz_eU&|phq zn#!N!R*&eZxp1$#Mu*Rdp^*$v-)bB$7-= nbUO^>p2C8lM?G)VYpZMTJNvfnFWghOYv(4@TZKEeZ8rP^sFIbL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8ae67ffd6baedb4a8043cddfcce11f4183a56fd GIT binary patch literal 1067 zcmV+`1l0S9P)%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6158a15dd1ac907a9fcf200191a6f7eb28ca609a GIT binary patch literal 3116 zcmds4-ES0C6yNv{_+SjiDCvVHCI*s%iH*hwL(r5EAbh!MB7#j2WvLPuEbR(q+isAS zHnvu6cZJqg>{1#_q036KY&F|}J2N{w-}lbUy0c%I3_{~JLFLk&SyMiPxd3PT3Tz+fTD%9sa+Cq}W7;0%W%(R4J}C3b&`CU&EVQ)<@~ z=cKfwy;{vs{H(w2H+R?BeWBPn7wbJaP`Tjp-1o$<9~_x%ZB6{%6Kiu$QdL~%RIXKn zca}~8H9Q=HhpWP!A8b=ApTvVJj6fy3Cq_Tz(N~rWtG;PDbmBc%gJZv=?z`jL#}Cw( z70O#GMmH?9udE5V-J?~9FMa(y)$Pc<8=rke&Ng9#tl}|wgdg$0e^C0k0QJ9$!e5Ei zBYc6!c(Ghq{k_*2Ecl3jAwRlqN6;SfmG^t*OPk_fq%OSCdu3mB)Y}|BwTZe~liHt7 zyau!0rTCBdVaG3D7drdU?LJJ8>N80g7&Gd7_1clKGjV%4_fl#0?Jv2u(cHAes5GM_ z;JqL_eSV6LC74?gW+5t$@In`Y@umEbr5FYV5CH{}9$_6~q%96%f%I3+WH@&>`-wB> zXokZH42_42N7w*Jmvy8WNY@Zafe6XVfImjnvZgN6$!IZk=eha8EpYw@HvX|gmQ6D~ zD5LZRzNDCS_&8S@%p#0Tr3FtHj`2o z**8_0xgaK|A8KLqD%g#Ux#2lYvzQ*t2wH9P&5F&ZT}K9}TRE~_%++N!O3jE-$EE&f ze~P@>miaS*G>bbR(b~_I$z7kPnu?N{h=8mnh!H{U)dBafuIippI;C2@J;@8q{xW{D zc>I8W?1Z4OW@$ASM|wF6WcyrX#l&#Yy+6{rWG>Hal#cKOr%fI{HA|xc!EvN+$p8^?a+u((;Ml_Q zaNA=A%R=NsWzwW@f(A%uR#|WZma9Qh&?KEd29Ofln^?LpQ=YVym`M1p0fkw+=caYe z=g(IlRiCVk-b`-zX1b%R4OdUysn{BOciqR?pUJll`!*Z>Q>(d17aLz_h!p6Jes4Uk zYkWVzb+9~-Z@zTyy)@t6{z(m8%?k7DLhFbq`Drv%w9igNJfp?UXe66>&_6wWWgvYg zJZDdzxHIdGG+tV<3R>!JF!t%i@@sQ>ZiUOS3eC^{enfjDp)I>Dmh23X>@rGIqO?IE zK$eZwh4x>5>|bwL?5a);Wme>7tQ3ysf^609Jfcl)N9qFTi@JxFD9HA?rCk+0I-)fr zn@`;D@oz;5+iqk=)X(#jBiAB-)GU1zv2RD+7WwA;)N!1OjZR)-W+Rxl@@?U?PDTYD zta?028SnK3T6E(30RV*9E3(iW4+8@v$N{tAN;su7`~G8VVokJh{_=a?raqnNkU&|$ zl~QMdKn%hmIFcJgj~5vLV_*h!5TNg62N-|>2I#im{r1)3Mc>+s>DptBUdbQ+z;?g8 z4w(+<^ba!qcN3=Vi%-7pTnkq}AN0P$SQSA3y-gk9E89cAX0|RjN6#!*_NNJz52HRH z0MF}zv0C46^Il$WbeO1B3jYZJx@NUKdmZKlUfHdcjzBhnl*WuIKr*E4*saMA63>-- zi+WIk)N)V-lq~<^@29lMOmf@bJly0@aIQ8dRRJDyU#PoFZ;#5{iGUGTAHwP~wdRhm zkL6lV^X+5JlDKM-RYTd)^jp!`)}izdjm?FSSFHyCNK&w$@m~9~aAOS*PB@_DU zyI}zD41^M4RRO93T*u7Lo}BxvA3!$7-DXp@g%lsZu8XCld*g-!U~o`tY35w%##9FE lGAs)KOcRRUpA7K->@O^Fmij$zpd|nR002ovPDHLkV1f|Z`)~jN literal 0 HcmV?d00001 diff --git a/autotests/read/tga/rgb.tga b/autotests/read/tga/rgb.tga new file mode 100644 index 0000000000000000000000000000000000000000..be0fc052909f2a1b111e723634df0ecd6b1be8b1 GIT binary patch literal 3090 zcmds3-A^1<6yNv{_+U(p(S`?2OpGR|iA3Xr>4UK`wTWM-iM5raR=Y);Zd(d#OBdMG zLLq{vuxkr~l`SPwEZenIx@Z>I!oa%Fw3LMN$`OzykjEOZ1c>t*k$|PBvc?z0 zjG`+XmRP_8p0fl1I0z)k)Kwtyz~C(vVucX2mK6%li#VQO6Olfp|5H4(9nYLF`sPFr zV;&wf8^%(nLtVf6`cChPCeL__#C>W<DQgEx1+tuM_Jdfz%KkiDHee5lD&+S2sST;d`^z)^T2^U~L?J;mQ0eYWFB zFg~CFhbfX&5Ddq*cl&pQ{3pjoWy9h6p`|ct{b-Zj zB)gMrGWnS7jEA+<+Ja5cMbHQ4@V+q5^W*>iU--Yke_hn0Hf?lrz-Sz|40 z@lq+Mc9kuzVK?9erFJq6p&6>F9^_LVvmuy1R*h6l&TCb~VziL7ODtC}goWioSP#Xr z91mN(mq$MsZX|#?6^N=pR&P>namv?~%Co&h$W_t3c^Y=bAA8M>Py8#0=0y0tr(M#=1rZK-C%%>f_))Q127Bmq|n zFp@y0?y!BtWjkdG&;S6d6s)OkX_oaQgG;m+uordzvuQYAxXxFsJ>m+rs@fF?nVB1q zXL@`1?YFC>WOSsicnysknAKTMm-K8mS<87u1pp)fR~#79fq9uR{mSriR*F_K(k-@I zU(9XfdWX`=P{vX&Y;8!Hjf~Rs)+u!MFX{QE@%VZ3keFv931-^R$DSCJO?OS93lS|h zcvH&97I@3u5R4T+|Hr@w04T7@wPWBC03CN(rW~zWngf;OqRWS>!NKP+wP3R;mxHy$ zx%W>iu4qLJt_09W5i!n;aSb0G56%>E*XD#f7N^GOs#tVe+Pu4=7Op+10{{V~-_LAQ z`)$b1<&avvIhv?m-lOn=v=Z>EGeAmQF*cT`%)WS2;)YXIH zU;p+u0gT~m(zl@}zUk#jrTQwtbFZBi4($7ZZ`J3|P1u6M@l&xqaaY}wteXL~H+)+R z^(~};?^|+dy9YL3oDw_rRnmQjPW2Evkshh(*=`3v`TQ286`!^%aP*@bY^KOXDmjEP zkGYH6Q1*oJPK!Qm1N3{p!HVVOavc;>bxt4j{G|6bTlZ-j;2PuML7Qp=uEa7tVkAVf2tK94d0CWt^>4+HsUT?{#ZGgagdl9MDuqm^)p6-bt=k>Jg z(>A~-6XT#gMMT}x0D#5JCNygS>|ZYcw*NaUQEq+0%YbsNVxWGV3)U>)`Z@s|3+^Vg zzbP_X3W?1-u1J~rK(eBDsOtvMb#Nldhtly~!{_zE&N(%222v%{pZMa${b}cM)b=&} z*#_sB3`(qBQ_2ok(r2z}Zpsq33|EC#eA=$SE(-d$zxD|Wr5G8X+=-ZfQK}UKGPZus zVeIZL$45HI|nL4g%v6DI2l!+-V~hX0D84F7GCIlcy_sIM)!6lPfYI@G6XY1GL| zkHydO)0z(kHTG1x)!83)?U0=xbd#sB;I_x4%K6($sx_8hYS!6)abe>6Gy57VpRHHC zaehA6$Awcowk=$9(AIC#b8#axTyFTr@Sp7_!+)nq4FA`pF#JEA#rg4CopI;mHwm)O zAA1)*Z_a=C+-t_uCpE=OuQj( z=y>%fz5DG?j?e4A^1WN|p{k|z*Go}@_wV_28i4lmVfvhb0cgL#J%<0i9Sr}!7c%_+ zR?G4EOQTWW>o*BL`&_ka=l0q)EAlFqw66}=xVAKi>1SN5>&|$)%i0$DK)VHjm=T-(ATdxJ z>|^*ZTEOsMqK)ytXraV;0p#=-Q~yz*E@7W&*_=!%h5b|9IIhk-EpTGhZ{9=4w%Q(9 zr)ISL1fN;W3BEncLwL@#PGFb6wVa*dzdxt_eq$D(z0COR#^olg;{QE4gx>iCyPR;o z**w$gQ^Ja<**+UHMX;)+h2VcrX5VA3rcLw0PnND|{5^SM^rl6vu9CE{3Y(d;|1&VA zJxtVyeo}cT^mD~;-+Pm{g`AltjZG~r#Mb?1U|IS@)OzhlsWW@t34fpcQFnFAFMA1E z*oDo^J7-i_Z|*U4zPr%#!o$X-Z#UQ5FTH(ST^yTQT8JI@o6ouvp+R_4{KiNde{8Wc^B&an!o0SEnAWow4HAD=f+KB&rF&al$X?ftv$5p z%N&>ZxpSQoL}?M$*vu4Nagj%M?coBkgZm!K?cV;{X4;At|E4(t*woTOOz-7HK8I&@ zmC3JSo`bOSGpSA(o?gkgrH}4Eu_r_T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e2d506bb3da276c09b8f9388dc8ad6b96f987f5e GIT binary patch literal 743 zcmV?P)E1)jxbCtrE}4UMN{WWBtG@56F7V!ybw)(i9BT()zyEYy z*ECJnb>X{hTkpM;5&(=b&N=6twKj?(N+|#kLcI6RIRJ3Z5kf*95z{n9#4i9{*Ue_L ztE;P`D6F;f`Fu8;5kkh}G3Wg0>8WX&s;b`J-Ufp~nx>2~LWnV@u4_cB>ly&!IF?dw zZEc;MolU1xMEnG3n&$HI^8EaKKA$`1wAPEof)Fwo3@D|G#lm}Ut?jxF02pIY^wC~p z45idsyUa@|hr{8)!NC`R-y<9qLJ&e2W1RCW%LpNlkB?-YwM_g-rqjE0Co zBz*z^0Ove#Ym8ZO&VP@CIF32zKbeE3X~MYXocGUxbFM5)tu+7$A^NYt81wM(@c#a; zl*;q`?>W&!1$A9pYuCj=pkXQ5pSe{mFTVOV^*y77_t{#z7Na5J-rnA5G^*?R`T5xx z)Bk&r=lRagju2ur8m;)?!0O%f-oL)SUSD6|-`}5{oP@QfPk?~YwyoA$DYc@};Ky&* ZzW_2gTD;a-w0-~p002ovPDHLkV1n%MZ8iV^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c3ff8d7a9f32c8995501845648434265d2283c1e GIT binary patch literal 1844 zcmeHGOHUI~6rMh0`ru(JXbCKC;-)nzwqc_#Fro$e-54aFmxKtJf6QhZ`)wmP-2uUH65-Bs#>p9aYsapL5a*}V(H{Utmy*KyF2x4-a zOmcA&7ZW@KK@1>w0Zb-%90Az+=NSe8(GIWz%z&c?$G#5eAAsBj=sk0)udg?F zacLXtxWU})^z`if!t--Y?y;AzS3ZCI`sMBN`(gzSum{JpD#cQHU2bMaR#k0pw^Gqm ztwLMrPU(@WX>g5t=uY{?adtS5OnVcwSJ~dD)7HVPuC4Uis+zhSu!jqV_OHHICmlES zzVd?48C^$5=}C9{-A!c51CQsvqO&=VXYO~lUoFjd8IJPe31>`SMSFL_EfvvQDK5>x aC3aG+vaP7}GCddu-DxS->P)mofHc2PM z0S82JTDTEZbSp0XGyWxa{s(bsKoEDj(2WBK28=;*igwaTRl7L_Md*&EIw=uyp{O42 zJMYxF_uP6M#6OPdeZcJO2DdZjw^__#m}^{2C3mWpH;+YpM;`??^WRMJzF{zmKnEvq z8#hs6eFyS~aTdJ*4nyE5zT#)ruO$CWFz@3D2HkC-U0lIk+z8;-7!@j|=JUB2kyk0$ zuc`% z)=Dsoi?QD-p6&47*cSq7b6^1{+it?5_Qa=gD@0m#!AkDaINoFqOwxp9Y}gOZa&^vY z(*@P*x5yc=Xp=yJPdVX=6Ivy(j-?vLQWG0?_TW%DS0hw7i2p5q113|2rrJF}9RL6T M07*qoM6N<$f@8P)Z~y=R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9418174eb28b1b4e33d0fb9de136c3b20a8c13df GIT binary patch literal 1037 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5899695f1852a072582f98c974a4ff80dfc95610 GIT binary patch literal 1253 zcmVpO{nQR~+fm zW8CR?4x2Z=*x#H6W!~w<-ramw08U1M*&$VG2dkDhZkR4src2Q(fx$*4kVCle(bgjQ=?;SZ zb92H2$tQr&%Rn)1f|pZ$0e9IIW%racL{?`2g|?R(!6w5oX1K19pG98q4`?239T=aS zCca#itt6sy?23%_!S|J}&^4gp$OqNRtDmt2yM)P)L zYSa;Os{|?X!kJC(SS?b&wp8#2UIbw(&yqMroneIY$a%xMrP%5czMAVj7GcV zSzHA4djcp>1_8MUWUd1u!`X%%B9_VUic>-mcBLOKn$SVJ!)bntyZGwY>)Ao&Enmw! z9HTS8ZlcegG)1YCgJ)%Hhdp&y>5#p?d{{08>luTnyeEuRrZ=N>p)Mcwy!_uG^fuj^X{* z=OE63=u550a8g&jCLS*(S+*(CU%jzH0N^}xHoPmqnWC#>d9CQcyb@ToWOtj=Ghpkq zn{uk##K9cPM&?-7(na1%I0$|T|V{>9|ZpVhH z+N!>#k+SKH)h!Qyyh}jO_W?pcO(z3mB2hn3Xl`epVSmFp&cV?~wWV%ydY%A9ft>mw z+Ab<#WhS`|A$Lj8>RuOcjQZn^=N|(Az==~wHND>d%Y15WTXwh9jw$fCeaX4+-*V4O z007uZI1g9YY@6a<$DuE4mghTML%o{`JQ(121R9WF!oULbZkqpJ|BCtz1Ct9E#%n#6 P00000NkvXXu0mjfmsmvt literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..76f80d672cbe46a71d61b159f1578a966d8e9a1a GIT binary patch literal 2153 zcmZ{k4=|K@7{}ii%c`}uSm9D{rVCx`qB5pGrx8jaxi&LV{;b_?Ywh~8I!j2qqM@6} zsSY_JxWJa)YQ-HAwf%9UrELkRtV7e@?^#>p=IWVw_V?N6`+MH^_j{gaUM?>( ziil@%2o8_W#*h&@2cCx<$I*`&aW0z5LyYHLq+Ghhp`TD zV}x-6ZP}n3V1~${I~wF<9m95G9is(XIE&}Z;<>Y!GK)=Su_={x2N`LZ%IW6fsv5(V!YDH zr{#H*_>ZFK9MQebw&(4|#eU8NrjO}sUW^^HiS8RHOMG-%k|9;J4-QxVl(uq(PJHwI zqUb(FdY0;Z{t3ym%a`TFv68jRb>h^`)jq8Qm2n-7Z8wttsuf%;+Z*Ca5a^uxn!$E- zoUsO8?wOx&SIJ~MPn2(8g(OpK(%Wa#+TA?N5|L+MYLF*pg-wNt<4@)R(5=lFZlEo7 z@(y>i11dUu?e>L2p!({wlJm8Q@a*Z#n2=D2b^g{+TTuX%og5r|C>vB;d;xB2g-tqn z?c3+&1X^ufXJ;K`PBv9%=Ui?A^4}ShA{GEeNb7p<)&sS)cDHmthJ&2T+8Y-M;Ob~< zWsX^6?`U(4u@o!|^TGy61ar6lh3wNCZAdOPmoEOA*sN*sM`NNQ+wEfRJ}1d?v!QIM zDX*;-KOC#sumCk(WxOhMoA7jOy5rKt(M<)ijLbJ9Qo1Q9WarRrd{I&yV|Q*&bN0oO zRMqQ}FHMj#sK12C3`~m1^sDJ=x|M&dBE4tw=2z%7L%1b+e@bXUW4EmN_wqyKX^%9G z=%X{K8Ihf-xB?f^+&){8ou;L}{x`jCTKZ>fWNZqkt-d(5`VNpEbL&=LCQu-g>9;EY zXm5Bp)59I8qOz$j?+B3U`QV^J1thzYnR!J9DL@X(SGhVl0Il5; zc`ES$(20^iA9Z&CX&ye1-|t3Moov08SNemty$6C^J!Tqhw{EqwogGs3?GB)kR+_l& z*&&;_?!lBu)BjdnbF}4Tt;W_=Y0yj$+&{!*Mcf-I+rmjr&X7MYvR@IFx@69lCZz@q zb-!Ak6R|(}r9!gxkR(pp-jTGxDT+&`Ca6YdBID9d4sQh-u|ZAs>~aHx64R5Zk>{0t8Z06BIW8nr|4Bpl zORYT$C9WLq@9FG#Fz`Y-q<%L!{%UIUFcoy#@d@?YA<&1$)#DQr!!J}LuX=l)wAT2M zp?`)Oi^>b7i3y3)!qUp8?>f>Fli~vd_I&g8JREgk%8+hJr@_%^bZf8H>Fdj=REm+2 zv4K7g-xu6$Nq4A!+xT(krtZR${$Ezpw3NAm0#FV)73 z0(#yS(m|y}DTbspAgWlYOr&ZlL8(mmJbm0p5%dqGX>$#|yVNBXkc- fZdisx%q(~GmlgUzB$vZ}=$2O4G>J;avHjS;@Gt1G literal 0 HcmV?d00001 diff --git a/autotests/read/xv/bw.png b/autotests/read/xv/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8fc8dd763d27e2685e1f236c2b78999a3f7072 GIT binary patch literal 969 zcmWktL5SC75PfDsySTfaJOs)@L$^@c4j#fN{!6navW2q{UhEL!VJPY#h@dGQ6e>pX z9w8(XL5rk?85fQD(L2DPANTB${CXq$Fwb8M_MWhyzX4s)b~ zE^slIbfGI;%{5)=4tH};cY46XJko<+@G`ITqBp$FJH0tnbec1roaBTBGQbdoSV)F2 z6rmQHp$td3g=aV;5MdD+!6-yoR7Nox(H5Q29L@wSm_be!!3tSm2}-OaOIV6hE6q}t zquk1~oE50BimYH2s;nxjSdD6{&T0;~i&o4cC);6-Y_J6_){-r3MXR-DE8Ed-?b*%_ zbXZ4runS$*m0j#cw{>SXM}nHx%qFKO!H68G8eyUsB}W2=@l>PcaBG-EH+l|bhoB5& zBb+QjR;}xQ~mIBVCkc&wp@Md`{U#BleO8~hxdJT z_x6psGkdpx`PcSKAHRO<$is!v4!*Yf{(-f{?;f4re0=WJ%Nw%ii{-hMZO*RSE9H~+i2xNCXa^B>;3zI5i)?@w?2 j^uim*9vpqL{~n${JbC=YY~Rl5ORlXRn*I3B(X;;pZPvt) literal 0 HcmV?d00001 diff --git a/autotests/read/xv/bw.xv b/autotests/read/xv/bw.xv new file mode 100644 index 0000000000000000000000000000000000000000..b884b2e9aa6641a4be1498b9303923b7e406a2e0 GIT binary patch literal 1081 zcmd5)K?;K~5X?ER5X=iAQt;ZwvWFz47U|6w>}U2d`7t_=2bO=>$*+NaH1^9i7#-KOC%|{r*@VE@zs?alU){ d^ysN;=Fxw&zFFU1e*w1p>zP)5<=o%j*$0Jvhy(xt literal 0 HcmV?d00001 diff --git a/autotests/read/xv/rgb.png b/autotests/read/xv/rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..d584013eadd0aedcff7f758393f0486e7b954c49 GIT binary patch literal 1130 zcmWlZTZq?n5XFx-s0GQFEeOKEfk43|h%O7>SaF0<38z02c0odF8<|M0!N9L}82;k#$!`nB^rZtVat ze;s!}*qpbw*9~);z5Bhrp96ES@qtZinkOKD0|f#|Kn^M}zyfw~K>-!0Lkk9&z#LWx zAOzuvLINpBM^>YR5|pE=EeRnwp@={vL{3!1AQoaLE>e&Rsgo8N$b`(viUJfu;S@y) zN}+VhYTQu?l~YyQCWPUPVgi#eIa4u%S(u%6EoMcI{06{@1@s-*@sQFFD@fQD$eMrlG*G+ncr6tzUl zwW=K_#NdW9f{_@xQ5nNnjNQ0QVJfC>T4pd4GdC*>ScrvNlqD?1(k-hYV`Hz_p3S4f37jvJ$uQt6F)BU&X@-rPpMeWs}pZrs6} zdx4uCZ?9QLRvdm3n6+SC_o_|zzPa_E4Oq5u?a0LF%;Ybltw&dEzZ!bag)QFS8rpT? zX#dQW3vVnQ99_8l>Nkh(fBwGH$3Hl;=Wxf?cR$_s^?{EU{qVx_)vG2Bb@fh6T-y8H z_d^@h2kyGF|L&e`2e0pbwR2|b`sv}m|IUn#Ui|5NU)6Bm)$21gb@s!Rv-|&==^MYi z=H#<~zj&tO_ox1tUh?C~$(v)x%9nfZI5*aszI=A=wT`9F9sF!+-{pM|jkl&RPIO)C zIJ$q!*{Rnz?>{lUWN_E`(wF8vd?LnLZ=aj&TR1#>_?^+6olhTF_QWlZ%sc=7`k~ia zBfGm!|GTsE(nkY7zttKUx~*$+OpXm4TQI!nR8Pvjn‘Ъ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 0000000000000000000000000000000000000000..7aea73e28dccdca79ce6846e147f127f7737b096 GIT binary patch literal 303 zcmZQzVBpCLP*C9IYUg5LU=T?wsVvAUFj4@r8KAT-kj?;d#WFKeih#5N7&Ei818D{Z z{^b0eB1SM%07L>6C;#{VAIP8&7E=I{APfTvKn4gy05dxyBLw|VVNhmZbS_FwEXgmj zQt(PF4oEFh2um$0&dkqKFx0a&FwisnAH=`|)X2!l%EH3H_&H x#45^!DLR1xRkZ))>{FsG-14tjg!NtH|cYjiO0|NZN2>@?UL{0zz literal 0 HcmV?d00001 diff --git a/autotests/write/rgb.pcx b/autotests/write/rgb.pcx new file mode 100644 index 0000000000000000000000000000000000000000..90282b4a517e59177bfa47e0cf33280f1c16940d GIT binary patch literal 1825 zcmb7FTWnNC7^X2M#up!qAu)E(*-!&O)GUWWOo_kiWxO=0e2s7!W*O5jF3B(Xa92z2+!yN<=;>?dI zWpVhp=jC3ML+XW~JJQllXdKc$$&uzah<3U`7vj-P!C0mX*mRT`{p_cBv za_%M^(r*Iew%SJ7`GOGyT8`5Z`*67n5`_?^{9miB8!nf z{Im}P68Cnyg{e&U)>IuXF8B(=tdtis z_G6^+Z<0FHNu z=*&-)ERU=`S-eWrvY-K^RG%fe8zlyvL6Yo~ASIrzyauWz8CAAugw>K_*}z6~%JxeR zq~R&~%z{B^OpeeT5~kUY4vj|AcSN=gas@CW9VAP(enVQBdeSMJ4S zGgcHASi%uRm7cF~T_Id*8tyHu!}J0IAz>$!V7|Gu4*!}#d^=aa&a@K>Oahk=K~T{E z5NvpJHw$Ux;HxSvViJa8=;Y6>WYx&lV|n-$^qZ0x#`;(kkLe=8%v~I;yNci~+nz(Q z;U)abhWbU#IL|DPK}LwRC5CNH)Or?3FpDtLUjOP9S3L``b1gl_pfuF_B+e1Fy1o=REW-`_jPS z+WgdJgE!^tjykJ1OyY0v&VKJS;wnk^p1f*yfWeN2@#>!r#*WbZ|l+ literal 0 HcmV?d00001 diff --git a/autotests/write/rgb.pic b/autotests/write/rgb.pic new file mode 100644 index 0000000000000000000000000000000000000000..f8a1b9cf58589d407006a6b64eefe37b6786d6a8 GIT binary patch literal 1274 zcmbu8ZA=_R7{@ua#&3Qwrtz)egC-_M6SRp$)2KmXT8)ylDr#b-(zMiGsRW7?&a%8+ zDqJCgsBk9*4=Yznq*&-#Dg_NMS2#EinwD~Kqy?^byL)^4KC`QEyp(n~5xeiM za68608I>d+LI`URs}M;@2AGC8A|r-1Kpa6H%c22fLE;jOBCaD^1W}#=gwiwsJb;SE z^FUGoBN>c{p#HZcMPwf#vK)g0KI9EV`^4Tk^ywVR?Nv_|a|O0TB{my z)J|7@d7-4w|JeI6>-ObPYn-(CAL1W+d^d;fUjfaMT%x{}wlGxj4)A2v={Q zAsP=Y>C=O7y~&tq&<9S>Oi?+ZvM0IEUyo0_IcYILt4vs7ytm=GMK(w;TxY^-jBiQ| z^a^|kqJL~jZKYvg2(SW>WRSgp2txyF02=~MZe=W{_EmAkhuAi2B0LEVNZiB-V_;xe zM;g*~WFSPW)nt^EO-k02*h0&CL16vSoBr(a)jwCEZls1&D2n7#{=AhfuyL+s5Jeaz zhf_!d+|bDBbES?eS1Jp z#Ymr~AP||+%MG@lt48|k)ku_hv4QSkRlaWarz5ikCucmYA~;A>bxA9TVKP|ut>jG3 zZTbBY_^Yizz0SOEH_Q9L7bw|rgsT}DO6bNxP-3`BDlkod7dm%S_3?%6j!(GFB$ z16f1^IvGFpY+}&jjQdHoNf7Lo{1iE^7Lv)0H3>At`B)p(H=ki4nN%iGHPL&+Lw(#@ yW+9nWCXp1qyMK*(G3%CvWKx+#*Kue`r(EBw7LrMoBuP8c$Tua5shq6aN&E%h5u9!S literal 0 HcmV?d00001 diff --git a/autotests/write/rgb.png b/autotests/write/rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..267d67841ad5f80e0f36cbf514c33d6e9cac146b GIT binary patch literal 1053 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‘Ъ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 0000000000000000000000000000000000000000..05fed0fccecb597d236d30fd020e681a96ea69a6 GIT binary patch literal 1631 zcmbu=R_R<22mf8pHY6#}UvKp2 zYj9Qlns854Jkai4gM<2x6;Z*>E&vx3%`iZLEU0ub1ENzA7^2b<25qjLvlGk4!3Gus zlpu~cxQT--9Pr0zJDQfnd2YS2fj`_4E`NN|UyUXRi;+J#IWp(MRJy*@zdv0myHV%X ztypS zs>9UThD!S`jpx(ClxLD}6)$N&jWF`D%&%EP%jS-f!D0Ygu5Hxz8N`Fu5Bs`xw;nwi z95%guJ@)*~XdYu`@&FDBagh3wmVL+znQu-`!VKxL1=(0}M&Xcq)T!{0in553(jU?G z%m-4(GYy;0)D-EFyy_vFJuj@#n#h%(>zB?kzE5Tz95=lh77tQ}$4q0$`0Qs-hDM$b z^xf4egJ|Yxhj)iI;Gh`?NpC2UOAGgS^LvP=tqqeu%8qG@6K6=ox}bzMrA=oKbW!b| zb7lWu6&|W0o}j+5p`cdY=eGUztf)&opD%lm>0l>IUs+uhCdw3HRkcm`-sHO#B+bDDo&qp9=K zWU)i*T1xUe>+USrgoEX6oXNz=SBC-%OO^wRDP~ZaET?tai3^Jn2B0HUij@Tg5`%+; zfdg=`VdPUk4R_^nG`v1K@$3c(v3wA~v@QA<6}FOT#k;yO?1UJp&xnv7;pNwmin5|( z;+!L?0A3MuKSB5~V&6;tk%5inouQb&dOq7SIP7mM8IDD+FN^^*$r)0yP=?)JHfwrKJet#z=G2o6;=H9DaDmFB1852b5*-BPuh37(!$a5-~{S zsyXL+wgs`5=pkYzswtI8sLUzl$u_NXA3=87jzGjrR3B6-y5_R&C8XQwC`8Oe^&thT zzerLnO_MGcmip{H<0&A@DK>LsaPZ30q5krSHFo3!>%f8bwsr3x)tpst_Y?}1S3I(+F~ii*4m3rleD|JY?9s0-Zwil zyK{Eu_+X2ORT_(fp#Qfs59j;wopazD;J+Snr;iL?0t~qzBweSv8^VF%1000=@s4p4 zoAw{I=W+r1fi!5pFhX!S<>Joeo)U((^4$3Am+*{nhno{ipjoJV(Qo2D>VWQZQurj19!) zcc)okvBDSEB;3hUn&=8Hc4oS>ZAL}9aB)bTn;6jBmRJTb0f64A11ccw1B`uumvPKv z3(RE_pbY@%5ZE_k(wr*y2Fg6q*b?(SnBrUyUx#k*G?qz+GM%$$Gs)&`B5rM%Hp_Lx z-Mp$8qCYuTQT^3IH5a=G!1}WzFaY68pg#!A%M$e&n<}|%M9-Qx)EHYTtRad1l+vHI zy7{d)nYKt0{&|N?-FdV zmRv<<7Pd%ZpI9C~7nrSKk@@Wf+fSpsiJEA0^P)vd*ETZ%_6!L7%U5tW*~1{aD#3l` z)X)+0^3M2bE%lkE6c2v*_-Jt@`|$VhglTJH`&`$=aCM_rUptk5AbPW*3BV{E0gT}z z``PaE%dzBS%hW79RG8phWr_Rt5a3V;Lax#1&XCZO)fUy-iO{qjT$S$tpF0Cs_v0Y( zRy%TRf#>5hJWCDsSh*O-fLEOX9D1VwCe=t-FCc_@WG)P#A&2lB96Ev?3>t3;pb0RXuBGYnA!z+=t; zw3l`xY&Nkr`|CO#52K*S&RxPI<5$4THAKWT0AMM*7VV~nJx&4Co)ah&k&P=7h|oc@ zb)5v7HgMe`z|p`CoAAq5D-Nvg@c3xBUs+)5R(DmfFwK|x(v2D}YN}o5=SEO1` zo%+Q0k2wT*{^i4zn+!~=tXVEFWx&JCa6r&S$1dSE0`}?oRgHW-s$ZELM%1??HEWuR z_3si){xIS8f2!I37xu+kKyUuzh_`7mjX-nQ~+uTJ{ w_k9nbx{?mu8{ifKfO2cpZmp#F|M^$s7lp6{{Qo`Ly#N3J07*qoM6N<$f}o*MqyPW_ literal 0 HcmV?d00001 diff --git a/autotests/write/rgba.tga b/autotests/write/rgba.tga new file mode 100644 index 0000000000000000000000000000000000000000..d1fe8623d77408233644939f03497e0f1231cee5 GIT binary patch literal 4114 zcmZQzU}As)1qL8gf$>IZL$45HI|nL4g%v6DI2l!+-V~hX0D84F7GCIlcy_sIM)!6lPfYI@G6XY1GL| zkHydO)0z(kHTG1x)!83)?U0=xbd#sB;I_x4%K6($sx_8hYS!6)abe>6Gy57VpRHHC zaehA6$Awcowk=$9(AIC#b8#axTyFTr@Sp7_!+)nq4FA`pF#JEA#rg4CopI;mHwm)O zAA1)*Z_a=C+-t_uCpE=OuQj( z=y>%fz5DG?j?e4A^1WN|p{k|z*Go}@_wV_28i4lmVfvhb0cgL#J%<0i9Sr}!7c%_+ zR?G4EOQTWW>o*BL`&_ka=l0q)EAlFqw66}=xVAKi>1SN5>&|$)%i0$DK)VHjm=T-(ATdxJ z>|^*ZTEOsMqK)ytXraV;0p#=-Q~yz*E@7W&*_=!%h5b|9IIhk-EpTGhZ{9=4w%Q(9 zr)ISL1fN;W3BEncLwL@#PGFb6wVa*dzdxt_eq$D(z0COR#^olg;{QE4gx>iCyPR;o z**w$gQ^Ja<**+UHMX;)+h2VcrX5VA3rcLw0PnND|{5^SM^rl6vu9CE{3Y(d;|1&VA zJxtVyeo}cT^mD~;-+Pm{g`AltjZG~r#Mb?1U|IS@)OzhlsWW@t34fpcQFnFAFMA1E z*oDo^J7-i_Z|*U4zPr%#!o$X-Z#UQ5FTH(ST^yTQT8JI@o6ouvp+R_4{KiNde{8Wc^B&an!o0SEnAWow4HAD=f+KB&rF&al$X?ftv$5p z%N&>ZxpSQoL}?M$*vu4Nagj%M?coBkgZm!K?cV;{X4;At|E4(t*woTOOz-7HK8I&@ zmC3JSo`bOSGpSA(o?gkgrH}4Eu_r_T literal 0 HcmV?d00001 diff --git a/autotests/write/rgba.xv b/autotests/write/rgba.xv new file mode 100644 index 0000000000000000000000000000000000000000..7fe0441fe7e3625057e21bb26a52af718ff00bb0 GIT binary patch literal 1081 zcmWGAS1>j<;!=(X3v&$$_Vo9&;!^hXb@%jh^9QnA{aoVx-Qu17eSKa1LV~ThjExk4 z$jH=`i-8*8!GniOwY5)uy;yXrDY?Du%9X9>ZtU6Nr3^Lu@xzBed2f*X(Wc~Xp#0T$ zH}-6GSB5Bf{P@wshpqhC?>??AI@;FUKl8(lk01B!nW&5`-v*R_+t>GW<-|!dKWyE0 zX-~~mbtL&mAoJg@D>}L5#*VTJ8_PEBhzW(sGXTwhbP(viw`&Wh%-C^b$CWc-lXt|J zK(!+WKuk=eQD`Z$2r4@!GH7a05ULn5Pp-DMcIHfE5mdGu5ZKwFiXro?&BKe$t&v4g z+1*{MPOa)j6+`B&T-n*VawW0|D!a3{H_IyvRScPT<;spN8zv%)pt9%G#>UppK@~&h zS(yn7n^_@?pt9B7lat-mQN@sXix(X_v}iH12rB#N($?0cM^VL)d2U{Qg}J%NBB<=b zsXK1m*nujB%)4^~1dv70*gK{MmKL(32_kXzwAi`X@yN4-0g?uECP*G#jFx-=61JnR literal 0 HcmV?d00001 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)