From 4951c793633a55c5d1e4d94283fa82cff31cee48 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Thu, 27 Oct 2016 16:19:15 +1100 Subject: [PATCH] image/png: implement truecolor transparency. Change-Id: I99b9a51db29d514ebaa9c1cfde65c0b5184c0f42 Reviewed-on: https://go-review.googlesource.com/32140 Reviewed-by: Rob Pike --- src/image/png/reader.go | 126 ++++++-- src/image/png/reader_test.go | 133 +++++++- src/image/png/testdata/pngsuite/README | 21 +- src/image/png/testdata/pngsuite/ftbbn0g01.png | Bin 0 -> 176 bytes src/image/png/testdata/pngsuite/ftbbn0g02.png | Bin 0 -> 197 bytes src/image/png/testdata/pngsuite/ftbbn0g04.png | Bin 0 -> 429 bytes src/image/png/testdata/pngsuite/ftbbn2c16.png | Bin 0 -> 2041 bytes src/image/png/testdata/pngsuite/ftbbn2c16.sng | 45 +++ src/image/png/testdata/pngsuite/ftbbn3p08.png | Bin 0 -> 1499 bytes src/image/png/testdata/pngsuite/ftbbn3p08.sng | 292 ++++++++++++++++++ src/image/png/testdata/pngsuite/ftbgn2c16.png | Bin 0 -> 2041 bytes src/image/png/testdata/pngsuite/ftbgn2c16.sng | 45 +++ src/image/png/testdata/pngsuite/ftbgn3p08.png | Bin 0 -> 1499 bytes src/image/png/testdata/pngsuite/ftbgn3p08.sng | 292 ++++++++++++++++++ src/image/png/testdata/pngsuite/ftbrn2c08.png | Bin 0 -> 1633 bytes src/image/png/testdata/pngsuite/ftbrn2c08.sng | 45 +++ src/image/png/testdata/pngsuite/ftbwn0g16.png | Bin 0 -> 1313 bytes src/image/png/testdata/pngsuite/ftbwn3p08.png | Bin 0 -> 1496 bytes src/image/png/testdata/pngsuite/ftbwn3p08.sng | 291 +++++++++++++++++ src/image/png/testdata/pngsuite/ftbyn3p08.png | Bin 0 -> 1499 bytes src/image/png/testdata/pngsuite/ftbyn3p08.sng | 292 ++++++++++++++++++ src/image/png/testdata/pngsuite/ftp0n0g08.png | Bin 0 -> 719 bytes src/image/png/testdata/pngsuite/ftp0n0g08.sng | 41 +++ src/image/png/testdata/pngsuite/ftp0n2c08.png | Bin 0 -> 1594 bytes src/image/png/testdata/pngsuite/ftp0n2c08.sng | 41 +++ src/image/png/testdata/pngsuite/ftp0n3p08.png | Bin 0 -> 1476 bytes src/image/png/testdata/pngsuite/ftp0n3p08.sng | 288 +++++++++++++++++ src/image/png/testdata/pngsuite/ftp1n3p08.png | Bin 0 -> 1483 bytes src/image/png/testdata/pngsuite/ftp1n3p08.sng | 290 +++++++++++++++++ 29 files changed, 2185 insertions(+), 57 deletions(-) create mode 100644 src/image/png/testdata/pngsuite/ftbbn0g01.png create mode 100644 src/image/png/testdata/pngsuite/ftbbn0g02.png create mode 100644 src/image/png/testdata/pngsuite/ftbbn0g04.png create mode 100644 src/image/png/testdata/pngsuite/ftbbn2c16.png create mode 100644 src/image/png/testdata/pngsuite/ftbbn2c16.sng create mode 100644 src/image/png/testdata/pngsuite/ftbbn3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftbbn3p08.sng create mode 100644 src/image/png/testdata/pngsuite/ftbgn2c16.png create mode 100644 src/image/png/testdata/pngsuite/ftbgn2c16.sng create mode 100644 src/image/png/testdata/pngsuite/ftbgn3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftbgn3p08.sng create mode 100644 src/image/png/testdata/pngsuite/ftbrn2c08.png create mode 100644 src/image/png/testdata/pngsuite/ftbrn2c08.sng create mode 100644 src/image/png/testdata/pngsuite/ftbwn0g16.png create mode 100644 src/image/png/testdata/pngsuite/ftbwn3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftbwn3p08.sng create mode 100644 src/image/png/testdata/pngsuite/ftbyn3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftbyn3p08.sng create mode 100644 src/image/png/testdata/pngsuite/ftp0n0g08.png create mode 100644 src/image/png/testdata/pngsuite/ftp0n0g08.sng create mode 100644 src/image/png/testdata/pngsuite/ftp0n2c08.png create mode 100644 src/image/png/testdata/pngsuite/ftp0n2c08.sng create mode 100644 src/image/png/testdata/pngsuite/ftp0n3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftp0n3p08.sng create mode 100644 src/image/png/testdata/pngsuite/ftp1n3p08.png create mode 100644 src/image/png/testdata/pngsuite/ftp1n3p08.sng diff --git a/src/image/png/reader.go b/src/image/png/reader.go index 44214eda29..9b07d406ef 100644 --- a/src/image/png/reader.go +++ b/src/image/png/reader.go @@ -113,6 +113,11 @@ type decoder struct { idatLength uint32 tmp [3 * 256]byte interlace int + + // useTransparent and transparent are used for grayscale and truecolor + // transparency, as opposed to palette transparency. + useTransparent bool + transparent [6]byte } // A FormatError reports that the input is not a valid PNG. @@ -252,20 +257,33 @@ func (d *decoder) parsePLTE(length uint32) error { } func (d *decoder) parsetRNS(length uint32) error { - if length > 256 { - return FormatError("bad tRNS length") - } - n, err := io.ReadFull(d.r, d.tmp[:length]) - if err != nil { - return err - } - d.crc.Write(d.tmp[:n]) switch d.cb { - case cbG8, cbG16: + case cbG1, cbG2, cbG4, cbG8, cbG16: return UnsupportedError("grayscale transparency") + case cbTC8, cbTC16: - return UnsupportedError("truecolor transparency") + if length != 6 { + return FormatError("bad tRNS length") + } + n, err := io.ReadFull(d.r, d.tmp[:length]) + if err != nil { + return err + } + d.crc.Write(d.tmp[:n]) + + copy(d.transparent[:], d.tmp[:length]) + d.useTransparent = true + case cbP1, cbP2, cbP4, cbP8: + if length > 256 { + return FormatError("bad tRNS length") + } + n, err := io.ReadFull(d.r, d.tmp[:length]) + if err != nil { + return err + } + d.crc.Write(d.tmp[:n]) + if len(d.palette) < n { d.palette = d.palette[:n] } @@ -273,7 +291,8 @@ func (d *decoder) parsetRNS(length uint32) error { rgba := d.palette[i].(color.RGBA) d.palette[i] = color.NRGBA{rgba.R, rgba.G, rgba.B, d.tmp[i]} } - case cbGA8, cbGA16, cbTCA8, cbTCA16: + + default: return FormatError("tRNS, color type mismatch") } return d.verifyChecksum() @@ -366,7 +385,7 @@ func (d *decoder) decode() (image.Image, error) { // readImagePass reads a single image pass, sized according to the pass number. func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image.Image, error) { - var bitsPerPixel int = 0 + bitsPerPixel := 0 pixOffset := 0 var ( gray *image.Gray @@ -402,8 +421,13 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image img = nrgba case cbTC8: bitsPerPixel = 24 - rgba = image.NewRGBA(image.Rect(0, 0, width, height)) - img = rgba + if d.useTransparent { + nrgba = image.NewNRGBA(image.Rect(0, 0, width, height)) + img = nrgba + } else { + rgba = image.NewRGBA(image.Rect(0, 0, width, height)) + img = rgba + } case cbP1, cbP2, cbP4, cbP8: bitsPerPixel = d.depth paletted = image.NewPaletted(image.Rect(0, 0, width, height), d.palette) @@ -422,8 +446,13 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image img = nrgba64 case cbTC16: bitsPerPixel = 48 - rgba64 = image.NewRGBA64(image.Rect(0, 0, width, height)) - img = rgba64 + if d.useTransparent { + nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height)) + img = nrgba64 + } else { + rgba64 = image.NewRGBA64(image.Rect(0, 0, width, height)) + img = rgba64 + } case cbTCA16: bitsPerPixel = 64 nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height)) @@ -515,16 +544,37 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image nrgba.SetNRGBA(x, y, color.NRGBA{ycol, ycol, ycol, cdat[2*x+1]}) } case cbTC8: - pix, i, j := rgba.Pix, pixOffset, 0 - for x := 0; x < width; x++ { - pix[i+0] = cdat[j+0] - pix[i+1] = cdat[j+1] - pix[i+2] = cdat[j+2] - pix[i+3] = 0xff - i += 4 - j += 3 + if d.useTransparent { + pix, i, j := nrgba.Pix, pixOffset, 0 + tr, tg, tb := d.transparent[1], d.transparent[3], d.transparent[5] + for x := 0; x < width; x++ { + r := cdat[j+0] + g := cdat[j+1] + b := cdat[j+2] + a := byte(0xff) + if r == tr && g == tg && b == tb { + a = 0x00 + } + pix[i+0] = r + pix[i+1] = g + pix[i+2] = b + pix[i+3] = a + i += 4 + j += 3 + } + pixOffset += nrgba.Stride + } else { + pix, i, j := rgba.Pix, pixOffset, 0 + for x := 0; x < width; x++ { + pix[i+0] = cdat[j+0] + pix[i+1] = cdat[j+1] + pix[i+2] = cdat[j+2] + pix[i+3] = 0xff + i += 4 + j += 3 + } + pixOffset += rgba.Stride } - pixOffset += rgba.Stride case cbP1: for x := 0; x < width; x += 8 { b := cdat[x/8] @@ -586,11 +636,27 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image nrgba64.SetNRGBA64(x, y, color.NRGBA64{ycol, ycol, ycol, acol}) } case cbTC16: - for x := 0; x < width; x++ { - rcol := uint16(cdat[6*x+0])<<8 | uint16(cdat[6*x+1]) - gcol := uint16(cdat[6*x+2])<<8 | uint16(cdat[6*x+3]) - bcol := uint16(cdat[6*x+4])<<8 | uint16(cdat[6*x+5]) - rgba64.SetRGBA64(x, y, color.RGBA64{rcol, gcol, bcol, 0xffff}) + if d.useTransparent { + tr := uint16(d.transparent[0])<<8 | uint16(d.transparent[1]) + tg := uint16(d.transparent[2])<<8 | uint16(d.transparent[3]) + tb := uint16(d.transparent[4])<<8 | uint16(d.transparent[5]) + for x := 0; x < width; x++ { + rcol := uint16(cdat[6*x+0])<<8 | uint16(cdat[6*x+1]) + gcol := uint16(cdat[6*x+2])<<8 | uint16(cdat[6*x+3]) + bcol := uint16(cdat[6*x+4])<<8 | uint16(cdat[6*x+5]) + acol := uint16(0xffff) + if rcol == tr && gcol == tg && bcol == tb { + acol = 0x0000 + } + nrgba64.SetNRGBA64(x, y, color.NRGBA64{rcol, gcol, bcol, acol}) + } + } else { + for x := 0; x < width; x++ { + rcol := uint16(cdat[6*x+0])<<8 | uint16(cdat[6*x+1]) + gcol := uint16(cdat[6*x+2])<<8 | uint16(cdat[6*x+3]) + bcol := uint16(cdat[6*x+4])<<8 | uint16(cdat[6*x+5]) + rgba64.SetRGBA64(x, y, color.RGBA64{rcol, gcol, bcol, 0xffff}) + } } case cbTCA16: for x := 0; x < width; x++ { diff --git a/src/image/png/reader_test.go b/src/image/png/reader_test.go index 0bc4203acb..72afea8d66 100644 --- a/src/image/png/reader_test.go +++ b/src/image/png/reader_test.go @@ -39,6 +39,21 @@ var filenames = []string{ "basn4a16", "basn6a08", "basn6a16", + //"ftbbn0g01", // TODO: grayscale transparency. + //"ftbbn0g02", // TODO: grayscale transparency. + //"ftbbn0g04", // TODO: grayscale transparency. + "ftbbn2c16", + "ftbbn3p08", + "ftbgn2c16", + "ftbgn3p08", + "ftbrn2c08", + //"ftbwn0g16", // TODO: grayscale transparency. + "ftbwn3p08", + "ftbyn3p08", + "ftp0n0g08", + "ftp0n2c08", + "ftp0n3p08", + "ftp1n3p08", } var filenamesPaletted = []string{ @@ -64,6 +79,38 @@ func readPNG(filename string) (image.Image, error) { return Decode(f) } +// fakebKGDs maps from filenames to fake bKGD chunks for our approximation to +// the sng command-line tool. Package png doesn't keep that metadata when +// png.Decode returns an image.Image. +var fakebKGDs = map[string]string{ + "ftbbn0g01": "bKGD {gray: 0;}\n", + "ftbbn0g02": "bKGD {gray: 0;}\n", + "ftbbn0g04": "bKGD {gray: 0;}\n", + "ftbbn2c16": "bKGD {red: 0; green: 0; blue: 65535;}\n", + "ftbbn3p08": "bKGD {index: 245}\n", + "ftbgn2c16": "bKGD {red: 0; green: 65535; blue: 0;}\n", + "ftbgn3p08": "bKGD {index: 245}\n", + "ftbrn2c08": "bKGD {red: 255; green: 0; blue: 0;}\n", + "ftbwn0g16": "bKGD {gray: 65535;}\n", + "ftbwn3p08": "bKGD {index: 0}\n", + "ftbyn3p08": "bKGD {index: 245}\n", +} + +// fakeIHDRUsings maps from filenames to fake IHDR "using" lines for our +// approximation to the sng command-line tool. The PNG model is that +// transparency (in the tRNS chunk) is separate to the color/grayscale/palette +// color model (in the IHDR chunk). The Go model is that the concrete +// image.Image type returned by png.Decode, such as image.RGBA (with all pixels +// having 100% alpha) or image.NRGBA, encapsulates whether or not the image has +// transparency. This map is a hack to work around the fact that the Go model +// can't otherwise discriminate PNG's "IHDR says color (with no alpha) but tRNS +// says alpha" and "IHDR says color with alpha". +var fakeIHDRUsings = map[string]string{ + "ftbbn2c16": " using color;\n", + "ftbgn2c16": " using color;\n", + "ftbrn2c08": " using color;\n", +} + // An approximation of the sng command-line tool. func sng(w io.WriteCloser, filename string, png image.Image) { defer w.Close() @@ -95,25 +142,31 @@ func sng(w io.WriteCloser, filename string, png image.Image) { // Write the filename and IHDR. io.WriteString(w, "#SNG: from "+filename+".png\nIHDR {\n") fmt.Fprintf(w, " width: %d; height: %d; bitdepth: %d;\n", bounds.Dx(), bounds.Dy(), bitdepth) - switch { - case cm == color.RGBAModel, cm == color.RGBA64Model: - io.WriteString(w, " using color;\n") - case cm == color.NRGBAModel, cm == color.NRGBA64Model: - io.WriteString(w, " using color alpha;\n") - case cm == color.GrayModel, cm == color.Gray16Model: - io.WriteString(w, " using grayscale;\n") - case cpm != nil: - io.WriteString(w, " using color palette;\n") - default: - io.WriteString(w, "unknown PNG decoder color model\n") + if s, ok := fakeIHDRUsings[filename]; ok { + io.WriteString(w, s) + } else { + switch { + case cm == color.RGBAModel, cm == color.RGBA64Model: + io.WriteString(w, " using color;\n") + case cm == color.NRGBAModel, cm == color.NRGBA64Model: + io.WriteString(w, " using color alpha;\n") + case cm == color.GrayModel, cm == color.Gray16Model: + io.WriteString(w, " using grayscale;\n") + case cpm != nil: + io.WriteString(w, " using color palette;\n") + default: + io.WriteString(w, "unknown PNG decoder color model\n") + } } io.WriteString(w, "}\n") - // We fake a gAMA output. The test files have a gAMA chunk but the go PNG parser ignores it - // (the PNG spec section 11.3 says "Ancillary chunks may be ignored by a decoder"). + // We fake a gAMA chunk. The test files have a gAMA chunk but the go PNG + // parser ignores it (the PNG spec section 11.3 says "Ancillary chunks may + // be ignored by a decoder"). io.WriteString(w, "gAMA {1.0000}\n") // Write the PLTE and tRNS (if applicable). + useTransparent := false if cpm != nil { lastAlpha := -1 io.WriteString(w, "PLTE {\n") @@ -133,6 +186,9 @@ func sng(w io.WriteCloser, filename string, png image.Image) { fmt.Fprintf(w, " (%3d,%3d,%3d) # rgb = (0x%02x,0x%02x,0x%02x)\n", r, g, b, r, g, b) } io.WriteString(w, "}\n") + if s, ok := fakebKGDs[filename]; ok { + io.WriteString(w, s) + } if lastAlpha != -1 { io.WriteString(w, "tRNS {\n") for i := 0; i <= lastAlpha; i++ { @@ -142,6 +198,28 @@ func sng(w io.WriteCloser, filename string, png image.Image) { } io.WriteString(w, "}\n") } + } else if strings.HasPrefix(filename, "ft") { + if s, ok := fakebKGDs[filename]; ok { + io.WriteString(w, s) + } + // We fake a tRNS chunk. The test files' grayscale and truecolor + // transparent images all have their top left corner transparent. + switch c := png.At(0, 0).(type) { + case color.NRGBA: + if c.A == 0 { + useTransparent = true + io.WriteString(w, "tRNS {\n") + fmt.Fprintf(w, " red: %d; green: %d; blue: %d;\n", c.R, c.G, c.B) + io.WriteString(w, "}\n") + } + case color.NRGBA64: + if c.A == 0 { + useTransparent = true + io.WriteString(w, "tRNS {\n") + fmt.Fprintf(w, " red: %d; green: %d; blue: %d;\n", c.R, c.G, c.B) + io.WriteString(w, "}\n") + } + } } // Write the IMAGE. @@ -171,12 +249,20 @@ func sng(w io.WriteCloser, filename string, png image.Image) { case cm == color.NRGBAModel: for x := bounds.Min.X; x < bounds.Max.X; x++ { nrgba := png.At(x, y).(color.NRGBA) - fmt.Fprintf(w, "%02x%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B, nrgba.A) + if useTransparent { + fmt.Fprintf(w, "%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B) + } else { + fmt.Fprintf(w, "%02x%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B, nrgba.A) + } } case cm == color.NRGBA64Model: for x := bounds.Min.X; x < bounds.Max.X; x++ { nrgba64 := png.At(x, y).(color.NRGBA64) - fmt.Fprintf(w, "%04x%04x%04x%04x ", nrgba64.R, nrgba64.G, nrgba64.B, nrgba64.A) + if useTransparent { + fmt.Fprintf(w, "%04x%04x%04x ", nrgba64.R, nrgba64.G, nrgba64.B) + } else { + fmt.Fprintf(w, "%04x%04x%04x%04x ", nrgba64.R, nrgba64.G, nrgba64.B, nrgba64.A) + } } case cpm != nil: var b, c int @@ -256,8 +342,23 @@ func TestReader(t *testing.T) { } ps := pb.Text() ss := sb.Text() + + // Newer versions of the sng command line tool append an optional + // color name to the RGB tuple. For example: + // # rgb = (0xff,0xff,0xff) grey100 + // # rgb = (0x00,0x00,0xff) blue1 + // instead of the older version's plainer: + // # rgb = (0xff,0xff,0xff) + // # rgb = (0x00,0x00,0xff) + // We strip any such name. + if strings.Contains(ss, "# rgb = (") && !strings.HasSuffix(ss, ")") { + if i := strings.LastIndex(ss, ") "); i >= 0 { + ss = ss[:i+1] + } + } + if ps != ss { - t.Errorf("%s: Mismatch\n%sversus\n%s\n", fn, ps, ss) + t.Errorf("%s: Mismatch\n%s\nversus\n%s\n", fn, ps, ss) break } } diff --git a/src/image/png/testdata/pngsuite/README b/src/image/png/testdata/pngsuite/README index c0f78bde87..0b3676d56a 100644 --- a/src/image/png/testdata/pngsuite/README +++ b/src/image/png/testdata/pngsuite/README @@ -1,21 +1,20 @@ The *.png and README.original files in this directory are copied from -libpng.org, specifically contrib/pngsuite/* in libpng-1.2.40.tar.gz. +libpng.org, specifically contrib/pngsuite/* in libpng 1.6.26. + README.original gives the following license for those files: Permission to use, copy, and distribute these images for any purpose and without fee is hereby granted. - -The files basn0g01-30.png, basn0g02-29.png and basn0g04-31.png are in fact -not part of pngsuite but were created from files in pngsuite. Their non-power- -of-two sizes makes them useful for testing bit-depths smaller than a byte. +The files basn0g01-30.png, basn0g02-29.png and basn0g04-31.png are in fact not +part of pngsuite but were created from files in pngsuite. Their non-power-of-2 +sizes makes them useful for testing bit-depths smaller than a byte. basn3a08.png was generated from basn6a08.png using the pngnq tool, which converted it to the 8-bit paletted image with alpha values in tRNS chunk. -The *.sng files in this directory were generated from the *.png files -by the sng command-line tool and some hand editing. The files -basn0g0{1,2,4}.sng were actually generated by first converting the PNG -to a bitdepth of 8 and then running sng on them. basn4a08.sng was generated -by from a 16-bit rgba version of basn4a08.png rather than the original -gray + alpha. +The *.sng files in this directory were generated from the *.png files by the +sng command-line tool and some hand editing. The files basn0g0{1,2,4}.sng were +actually generated by first converting the PNG to a bitdepth of 8 and then +running sng on them. basn4a08.sng was generated from a 16-bit rgba version of +basn4a08.png rather than the original gray + alpha. diff --git a/src/image/png/testdata/pngsuite/ftbbn0g01.png b/src/image/png/testdata/pngsuite/ftbbn0g01.png new file mode 100644 index 0000000000000000000000000000000000000000..ba746ffb2f5e834db9e061b213a9c8fb38a80707 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk~Bp9L@-6Me%Q%R6tFatx`FS$5RU7~2?v;79du#tuwYQ>a&%Fgu_O4vfdD?GSMM7;DjgQN$$5yJ5Wm9E z+5bP`$n$a@o=x-l8#oqN8qI&s(D|rVAxZ9n%ri5ALOz#2%tAd1O%M6amNPJH^j176 T`tP7S&>99$S3j3^P6NS%G|}k|4ie z28Oc9XDvXyByV>Y28LC=%0@t5f~SjPh{WaI^M+gp3^-T=3csiv4Q}hPY)zR|f6C0w zxJ2XcWoMTCF7}HoGFZJm8u^!HI&jaJ_kuGy=R#8y15drw_Xvx6CN;KWxv0ZanUbL``{xlqk(oYc)I$ztaD0e0sz+MK9T?c literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftbbn0g04.png b/src/image/png/testdata/pngsuite/ftbbn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..39a7050d27af28f3bcb7bfc6b071cae91f8c091b GIT binary patch literal 429 zcmV;e0aE^nP)eGf1AoYPn=%bN?oV&q3&xZP#{- zd#wGeV8okcyH@o)cboHb1rrf^jB^?sG2T2?@G1n)CJc@hyhCf)&E8%^0~1oF;v>7S z;6sBJiji@r0Yq=mmR;)Ojr>$W46R-Sau7HO7xZFtI1{|4z%-nLbW=B z3o0EAC)h$;8WIR1rohQ#w444G0#1m$Dj66xet|L#R>4C36e7xMM0T)(aSAa2XfV)D zcEU#my$(kCaRx~QL^LgQ_;=)3gHxFOXBZJd{maEJLqY3H<>rDuET^1Yth7z0>+1gi X{l69U>r1pj4E?y3$fw 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 literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftbgn3p08.sng b/src/image/png/testdata/pngsuite/ftbgn3p08.sng new file mode 100644 index 0000000000..0e3b7bd77d --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftbgn3p08.sng @@ -0,0 +1,292 @@ +#SNG: from ftbgn3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) + (170,170,170) # rgb = (0xaa,0xaa,0xaa) +} +bKGD {index: 245} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/src/image/png/testdata/pngsuite/ftbrn2c08.png b/src/image/png/testdata/pngsuite/ftbrn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..5cca0d621047cacf1637cf7d77e997d51cc6b15a GIT binary patch literal 1633 zcmV-n2A=teP))6_}Akuqmh*5X4X^rIbM;BH-v?$kU01p_ErCl=u4~ zL7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2!RYsr=o3t~2tT^d3tzx&+X@9uj)%)Vj6 z{|IpB&Yj-g-pR?y{}^!Z-o3WAwzRagh=_<-fB!T`$I~7jJzDL9k&%A|7#|<+>gvkP z&5eqRQiO&cb#=`%Gt&SnAO*+-su`xq!J$j392p#Z_UzeG0aH^`SFc_zD=UkSkAGjG zNZGY3d;R({hG_tbfDeIqE;r1MUWVZftDkNW!h zs;jG$lamt?5{`w2W;;5Ta5(kAS>OWD3k(34fhLB@x3Eyz+ozkGX8`3uA)t^*Vq;_J zARVu%si6?50P_I-{r&0b>GXAy-pZYvJ_kMn+JSRiZt1pd#bWVg8=D~(>oza}`~v)> zM}7e)8HRFA`iDhFM^mix0K>z>DwQfHCnqyAGc`3;6%f#2ZhqFvO5^8uBq=H7FUwFU zT6XLhvbG*uwdz+cchJo2l$~8_P|)B15EmC05)$I?@88+kIS+9E{(W+tk&&UwQ56&v z(A`o(AH0rH_Tk~-0RaJGvDnww_wL=h^8j=?>6z)a6}IeCY}aO2b*Z|fq@=L0@WhD| zsSDdty^(jSiA*M&bM5WzEtks;bWvVj9&?GoHDC(zc6o7eG4)bKMMY_8X?Aw@u?6h# z;lshf`|a#hY<3Bkd&JHz$kWs3`0?Wg0OXPTF&CY{G^|Igi;9ZKH36!ss;DvOr&_J1 zx~1t&sZ>(M4;(lkk?c1!`x@w{b_L!AqU`OZt*xyF0OXE$lBa8(+d4*aQ!-UaQ=##! z_w+pDSx{e4UteEaTT3@Y0IErFaIj1kyl&n1z;8e!i?yF&L_nC8m3(Mu$N-?Zxp_n7 z2DAX*=>Wn$A?4)L>VvOzv*1+iR99Em(9l2wMRh0dROro{PXe>RH6x>UEG*vQa@TOV zQlU`t^yyOrfcExwL7@Om)cL>za2|4U%W^%=c<5%V3NB?X6h0+EjKsu5@-7xf85_?~ z_(n!?E-s$Cckkx$Tm=FtNq~V#ChO_xan5qaMSv9N2jF-3*7yqRh3Ek)Au1KoO;8fV zprIvzKyXeU{%KoVxrc`zkCz5CFib&h?McIcn>TN|Dcy8{RDkAq5^L3Kg|$LmUsXU< zBBJ4(W03sGWO5UeaSET!R&3c4%;9JOl9gkorlAz5VF1mVSE84$J}Q`0nqU|>1Di@4 ze5+F&_hR?T%1UBTp~Aw#cJ55qhku#R59RT^^+74-!fSSE~<7VgEJh?uUa0qm; z8Ez47t52=QkANEJ0t(=x^_iQy^73*TT0XxG7zGZwyYCSQ1YB+maEUU=$|_zAke{D# zTyIS3>>TO5U9}y3y6WrNG#}mt-ZU1(ApHmo3|zUggX&{s6zS#V<>Yh_y5_4hF$wDK z?p_S=`P`~WeyGw#>B+X26iZPz^D41kPE3=O0g4z6qf*N)=*PsGE4-+(Dp2{ zw2Zxeeeh*hh5=+_V`EuaSwV3@IIpj54kWn}jYdNZ8e`JrO`E(~ENUAnPWZ-+iMMY3 zY|zhwfLVQ0wY0S8#Df-Q7G&8n5<6nh7)vA)kx0bn+nAbqczMM?d^oX?lf?jYc4O#< zON|S4tujMN`;Hh?Jz7|PetuiGZY4pbYg^pItKUTv6B8tGw0Wp##Go?l literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftbrn2c08.sng b/src/image/png/testdata/pngsuite/ftbrn2c08.sng new file mode 100644 index 0000000000..9569bdaf78 --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftbrn2c08.sng @@ -0,0 +1,45 @@ +#SNG: from ftbrn2c08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color; +} +gAMA {1.0000} +bKGD {red: 255; green: 0; blue: 0;} +tRNS { + red: 255; green: 255; blue: 255; +} +IMAGE { + pixels hex +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff e3e3e3 c9c9c9 f1f1f1 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff e8e8e8 b5b5b5 7e7e7e 656565 6e5252 7e2e2e a64343 c79090 ebdddd ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff eeeeee bfbfbf 898989 676767 6b5d5d 7a3939 8a1212 8d0000 850000 770000 840000 9a0101 a22d2d bf7d7d ddd0d0 fcfcfc ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff f2f2f2 c4c4c4 959595 727272 6f6b6b 774444 871e1e 950101 9f0000 910000 800000 720c0c 612d2d 530e0e 500000 590000 850000 920606 7a6666 a0a0a0 cfcfcf f8f8f8 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff f7f7f7 cacaca 9a9a9a 767676 737373 7c5d5d 872e2e 930707 9e0000 a90000 b00000 c90000 cf0000 b90000 a20101 8c1919 852a2a 7f1313 810000 960000 8f0000 6b5353 6e6e6e 737373 767676 9b9b9b c4c4c4 eeeeee ffffff ffffff +ffffff ffffff cccccc 7f7f7f 767676 757575 757575 962f2f b80000 b40000 b60000 ad0c0c 943a3a 925050 b92323 d60202 e20000 ef0000 e70000 da0000 cf0000 ba0000 7d0101 6f6b6b 757575 757575 757575 757575 6a6a6a 9a9a9a ffffff ffffff +ffffff ffffff dcdcdc 858585 888888 848484 7b7b7b 855454 b71313 a91d1d 8d4f4f 787575 777777 777777 777777 816b6b aa4141 d62020 ec1010 e90c0c d01212 a52828 7b5858 777777 777777 777777 707070 5c5c5c 525252 bdbdbd ffffff ffffff +ffffff ffffff eaeaea 848484 818181 858885 8e8e8e 898989 7f7f7f 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 767676 636363 545454 505050 4c4c4c e6e6e6 ffffff ffffff +ffffff ffffff f8f8f8 7f847f 259725 04a504 39a439 8b948b 939393 8f8f8f 838383 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7a7a7a 7a7a7a 797979 6a6a6a 575757 505050 4c4c4c 494949 595959 ffffff ffffff ffffff +ffffff ffffff ffffff 8a8a8a 01b301 00c600 00f200 59b659 929292 959595 979797 949494 878787 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 717171 5a5a60 282885 040493 0c0c78 282858 46464a 828282 ffffff ffffff ffffff +ffffff ffffff ffffff 929292 0cab0c 00bd00 00f400 20dd20 919191 949494 979797 999999 9b9b9b 999999 8b8b8b 7f7f7f 7e7e7e 7e7e7e 7d7d7d 777777 626262 535360 1212be 0000cc 000092 000069 000067 2a2a55 acacac ffffff ffffff ffffff +ffffff ffffff ffffff 949494 16a116 00b400 00e200 00f400 76a276 939393 8d978d 469e46 46a746 8e9e8e 9e9e9e 9c9c9c 8e8e8e 7e7e7e 6a6a6a 5a5a5a 57575a 1818cd 0000f0 0000a0 020260 01013d 000061 1d1d59 d6d6d6 ffffff ffffff ffffff +ffffff ffffff ffffff a4a4a4 219821 00aa00 00c800 00f400 3bca3b 929292 4aac4a 00bc00 00a900 2f9a2f 9d9d9d 9f9f9f a0a0a0 7a7a7a 5a5a5a 595959 3131a1 0000ff 0000c6 03035b 191924 0c0c15 0c0c55 3b3b53 fbfbfb ffffff ffffff ffffff +ffffff ffffff ffffff b6b6b6 2b8f2b 00a200 00ad00 00eb00 07ed07 899589 43a743 00c900 009900 389538 9c9c9c 9e9e9e 9f9f9f 747474 595959 505067 0505f5 0000f0 030370 383846 484848 161639 2b2b55 727272 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff c7c7c7 348634 00b100 008d00 00d200 00f300 4c9b4c 3b9e3b 00c700 009800 3d943d 9b9b9b 9d9d9d 9e9e9e 6e6e6e 595959 2b2bad 0000ff 0000a6 252559 43434f 16167e 00009f 01018e 9c9ca1 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff d8d8d8 3e7d3e 00b100 007b00 00b800 00f100 178b17 3b9c3b 00c600 009700 3d933d 9a9a9a 9b9b9b 9d9d9d 676767 575759 0909ee 0000f0 04046b 33335a 070790 00009e 00007c 0d0d5d c7c7c7 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff eaeaea 477447 00ad00 008500 099809 00dc00 00a700 239823 00c300 009600 3f923f 989898 9a9a9a 9c9c9c 616161 42427f 0000ff 0000b9 1a1a5d 161649 00007b 00006b 00006b 1c1c56 f4f4f4 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff fcfcfc 506c50 00a900 009500 2d772d 00c100 00c500 019301 00c100 009000 4b914b 979797 999999 9a9a9a 5a5a5a 2b2ba4 0000f6 000086 2f2f53 191930 020263 000073 00009b 4d4d70 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff 687368 00a400 00a400 3e653e 14a514 00d400 008b00 00bf00 008e00 4a904a 959595 979797 969696 575757 1a1ab5 0000de 000068 3f3f4b 2b2b2b 0c0c6d 0000b3 00006b 868692 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff 8c8c8c 059e05 00b000 346634 408540 00ca00 009700 00bc00 008c00 498e49 939393 959595 8f8f8f 565656 0f0fb7 0000b9 030366 474747 2f2f64 0000a2 00009d 090958 c5c5c5 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff fafafa 90b090 348534 616461 636a63 06af06 00ae00 00b900 008b00 538d53 919191 939393 898989 555555 0a0aa8 00009d 070763 34345c 04049b 0000b1 1a1a4d b5b5bb ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff d0d0d0 6d6d6d 656565 2d8f2d 00b200 00b600 008900 558b55 8f8f8f 919191 818181 555555 15157e 000084 010165 010184 000091 1c1c6e ceced0 ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ececec 868686 587058 00af00 00b300 008800 538953 8d8d8d 8f8f8f 7a7a7a 545454 2c2c49 02026b 000064 000063 292974 dfdfe5 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff fcfcfc aaaaaa 219821 00b000 008600 578757 8b8b8b 8d8d8d 747474 535353 3d3d3d 1a1a23 0d0d43 474772 ededef ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff d1d6d1 389b38 2d772d 7d817d 888888 8b8b8b 6d6d6d 525252 4f4f4f 373737 777777 fafafa ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff efefef a0a0a0 838383 868686 888888 676767 515151 505050 a0a0a0 fdfdfd ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff fefefe c0c0c0 858585 868686 616161 525252 b7b7b7 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff dedede 909090 656565 cccccc ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff f5f5f5 e3e3e3 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +} diff --git a/src/image/png/testdata/pngsuite/ftbwn0g16.png b/src/image/png/testdata/pngsuite/ftbwn0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..99bdeed2b3b8564302d449e6578c4aca0f6261f5 GIT binary patch literal 1313 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 literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftbyn3p08.sng b/src/image/png/testdata/pngsuite/ftbyn3p08.sng new file mode 100644 index 0000000000..5d61987330 --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftbyn3p08.sng @@ -0,0 +1,292 @@ +#SNG: from ftbyn3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) + (255,255, 0) # rgb = (0xff,0xff,0x00) yellow1 +} +bKGD {index: 245} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/src/image/png/testdata/pngsuite/ftp0n0g08.png b/src/image/png/testdata/pngsuite/ftp0n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..333465fcdc9f10f7f25b2d999b558f5421983ecc GIT binary patch literal 719 zcmV;=0xe{x-64Dw5ISbDJfGPNXYF1fsnx~?7~M3eMD*m6rOMo0;2$rUW>-c(^**S*Ycd0zuX+u!1|S9WB+#F78QX<>lo? ziQz$h-hRnIWoQ!H=elq>2fX`s$g4Md}>$Ugu1e*ygBpcmqZ3DNb_5HNEsBtg8Fz$MsRgsRcUEt!R)#7 z@*=Hdg|%Ijgaqfp6x>M8@W|(*DezA>78ATBV zGiJ?6^pq7`pj8TmNNXtGQ7M(fr#kNOGpUKtO+a# zE}lAlTDXoRkAt?j2v0jgK~H>oU`AO)UQprWsr_L}qI~YALPA1E5ej}SPEJnGOv?!@ zojAEOR7Ob9QdC4?8%mP9keiy8ksVOlKd~`Xk)KCEK=mA2ntaoimYx|<+}mFjqR+?8 zZTJ8q(f(PLp6*}V-CGiDD=qBv7F)8vQWR0&(VZLQZ(jZjd%k$Tpt-FhJuqOwUu^jT z1pXapZA%Q=jx2U BP!RwC literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftp0n0g08.sng b/src/image/png/testdata/pngsuite/ftp0n0g08.sng new file mode 100644 index 0000000000..c8abd33893 --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftp0n0g08.sng @@ -0,0 +1,41 @@ +#SNG: from ftp0n0g08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using grayscale; +} +gAMA {1.0000} +IMAGE { + pixels hex +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7fe3c9f17f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7fe8b57e655a4661a1e17f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7feebf8967614d362a2824282f5091d4fc7f7f7f7f7f7f7f7f +7f7f7f7f7ff2c495726c533e2e302c272b3d23181b28306ca0cff87f7f7f7f7f +7f7ff7ca9a76736649313033353c3e38313c4533272d2b5a6e73769bc4ee7f7f +7f7fcc7f7675754e3736373c55645042444845423e38266c757575756a9a7f7f +7f7fdc8588847b6344476276777777726157524e4b4e63777777705c52bd7f7f +7f7fea8481878e897f797979797979797979797979797979766354504ce67f7f +7f7ff88268627890938f837b7b7b7b7b7b7b7b7b7a7a796a57504c49597f7f7f +7f7f7f8a69748e8f92959794877c7c7c7c7c7c7c7c715b3314182d46827f7f7f +7f7f7f92696f8f8f919497999b998b7f7e7e7d7762542517110c0c2fac7f7f7f +7f7f7f946769848f9093937a7f979e9c8e7e6a5a572d1b120d080b24d67f7f7f +7f7f7fa46764758f8f92836e636e9d9fa07a5a593e1d160d1a0d143efb7f7f7f +7f7f7fb6665f658a8e907e765a6e9c9e9f745953201b0f3a481a30727f7f7f7f +7f7f7fc76468537b8e7a757559709b9d9e6e593a1d132b442212119d7f7f7f7f +7f7f7fd86368486c8d5b7474586f9a9b9d6757231b103717120e16c77f7f7f7f +7f7f7fea61654e5d816268725870989a9c61491d15221c0e0c0c23f47f7f7f7f +7f7f7ffc6063575871735771547497999a5a391c0f331c0d0d12517f7f7f7f7f +7f7f7f7f6e606055697c51705373959796572c190c402b17140c877f7f7f7f7f +7f7f7f7f8c5f67516876586e527193958f5622150e4735121212c57f7f7f7f7f +7f7f7f7ffaa363636769666c5175919389551c121139151420b67f7f7f7f7f7f +7f7f7f7f7f7fd06d6566686b50758f918155210f0c101025ce7f7f7f7f7f7f7f +7f7f7f7f7f7f7fec8666676950738d8f7a542f0e0b0b31e07f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7ffcaa67674f738b8d74533d1b134ced7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7fd472587f888b6d524f3777fa7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7fefa0838688675150a0fd7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7ffec085866152b77f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7fde9065cc7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7ff5e37f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +} diff --git a/src/image/png/testdata/pngsuite/ftp0n2c08.png b/src/image/png/testdata/pngsuite/ftp0n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6e42cb420fd08ecd78340256157fa5f8a22934 GIT binary patch literal 1594 zcmV-A2F3Y_P)u542F>)wJ;-zU<0Ta5X4X^rIbM; zBH-v?$kU01p_ErCl=u4~L7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2zirzKlPEQpyV zJ88Z&UwhB*+;h+QpNot)Z1^7mZr{G$*Vi{SHT9YSckkY9Z*NaePmhd@j0*@zcXT}E z>DjB%+#enNPk@PuiSF+1yu7^V=xBLZ*b!IPd^0mOpafEZETD#AngxPxg<^DQ=;_m^ zO9f0%PhYumrM$d6AtB*?xjc2}&YX4Y${D5+CG4W_vSdOD(DVN&-oB_@QeZU}a320`R0!vG! zgF}Y7c_vT+6ajLvI4&-Z7Si(C+FA;c5-<-iFfc$*`Z-x=6;4i{1D^pMz*&|p+q$(x zB)Vj4J8WQZ3z!6c0e;dUzW@{rLwimBm&L@yP^|L+BO@b9r7|}+H!CYEEiFwM7}#lU ze#Y8b?eBj$IXU%j%aqGow{IV|u^C^v@>iA}GBZ1AZ=V(%{LdfavLmWItxn1d>CixU>w z(z&H&q%@~cmeiGMuLdu#(_V!Qg$)f2b#--gLIj|kgoK1hr6FtAeh>TxG#MD|V;DCe z+}c_;JUpxi(9+VfzG^*Mf$y{cVZV^}t ze*#wx4d1b}e2ZmQv#dlY6hC?LL=T{&qk~_>M>ADEa39m2fL{qvo7rko-xdG82;t3ZKJ~Z{8fjKg!o$ON?8wlCe~HHnv#{{d1tq7Cl~vHp z%#3~jNv`NUkyhKvAxIVA8=wbFDWm}$)k06v92)E2}b{Rj#QTCt*&@?&Ti zD zl4Z+2B9B~dgtK!fhf@n&;PLjfw||-Og6SEVLqkKcv9UCP1w{gUs+$RUkfbMoF`VR)x@ASCQaVB z(Z|4m%7&5?v0+2f&6_{#^|K%#LswL-t*u(|pn;hUX^xb{ju_O&VzJoG&5g&iH8u70 z_D*>4U~(ZRivi~B`tWs^S{JHXMW%x09Wf|-G_d^r{kLq{LV`-iwz!9v--{+ECrRLF z@=(%OV07*qoM6N<$f`h#14gdfE literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftp0n2c08.sng b/src/image/png/testdata/pngsuite/ftp0n2c08.sng new file mode 100644 index 0000000000..d41c7eb36c --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftp0n2c08.sng @@ -0,0 +1,41 @@ +#SNG: from ftp0n2c08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color; +} +gAMA {1.0000} +IMAGE { + pixels hex +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f e3e3e3 c9c9c9 f1f1f1 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f e8e8e8 b5b5b5 7e7e7e 656565 6e5252 7e2e2e a64343 c79090 ebdddd 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f eeeeee bfbfbf 898989 676767 6b5d5d 7a3939 8a1212 8d0000 850000 770000 840000 9a0101 a22d2d bf7d7d ddd0d0 fcfcfc 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f f2f2f2 c4c4c4 959595 727272 6f6b6b 774444 871e1e 950101 9f0000 910000 800000 720c0c 612d2d 530e0e 500000 590000 850000 920606 7a6666 a0a0a0 cfcfcf f8f8f8 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f f7f7f7 cacaca 9a9a9a 767676 737373 7c5d5d 872e2e 930707 9e0000 a90000 b00000 c90000 cf0000 b90000 a20101 8c1919 852a2a 7f1313 810000 960000 8f0000 6b5353 6e6e6e 737373 767676 9b9b9b c4c4c4 eeeeee 7f7f7f 7f7f7f +7f7f7f 7f7f7f cccccc 7f7f7f 767676 757575 757575 962f2f b80000 b40000 b60000 ad0c0c 943a3a 925050 b92323 d60202 e20000 ef0000 e70000 da0000 cf0000 ba0000 7d0101 6f6b6b 757575 757575 757575 757575 6a6a6a 9a9a9a 7f7f7f 7f7f7f +7f7f7f 7f7f7f dcdcdc 858585 888888 848484 7b7b7b 855454 b71313 a91d1d 8d4f4f 787575 777777 777777 777777 816b6b aa4141 d62020 ec1010 e90c0c d01212 a52828 7b5858 777777 777777 777777 707070 5c5c5c 525252 bdbdbd 7f7f7f 7f7f7f +7f7f7f 7f7f7f eaeaea 848484 818181 858885 8e8e8e 898989 7f7f7f 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 767676 636363 545454 505050 4c4c4c e6e6e6 7f7f7f 7f7f7f +7f7f7f 7f7f7f f8f8f8 7f847f 259725 04a504 39a439 8b948b 939393 8f8f8f 838383 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7a7a7a 7a7a7a 797979 6a6a6a 575757 505050 4c4c4c 494949 595959 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 8a8a8a 01b301 00c600 00f200 59b659 929292 959595 979797 949494 878787 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 717171 5a5a60 282885 040493 0c0c78 282858 46464a 828282 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 929292 0cab0c 00bd00 00f400 20dd20 919191 949494 979797 999999 9b9b9b 999999 8b8b8b 7f7f7f 7e7e7e 7e7e7e 7d7d7d 777777 626262 535360 1212be 0000cc 000092 000069 000067 2a2a55 acacac 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 949494 16a116 00b400 00e200 00f400 76a276 939393 8d978d 469e46 46a746 8e9e8e 9e9e9e 9c9c9c 8e8e8e 7e7e7e 6a6a6a 5a5a5a 57575a 1818cd 0000f0 0000a0 020260 01013d 000061 1d1d59 d6d6d6 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f a4a4a4 219821 00aa00 00c800 00f400 3bca3b 929292 4aac4a 00bc00 00a900 2f9a2f 9d9d9d 9f9f9f a0a0a0 7a7a7a 5a5a5a 595959 3131a1 0000ff 0000c6 03035b 191924 0c0c15 0c0c55 3b3b53 fbfbfb 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f b6b6b6 2b8f2b 00a200 00ad00 00eb00 07ed07 899589 43a743 00c900 009900 389538 9c9c9c 9e9e9e 9f9f9f 747474 595959 505067 0505f5 0000f0 030370 383846 484848 161639 2b2b55 727272 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f c7c7c7 348634 00b100 008d00 00d200 00f300 4c9b4c 3b9e3b 00c700 009800 3d943d 9b9b9b 9d9d9d 9e9e9e 6e6e6e 595959 2b2bad 0000ff 0000a6 252559 43434f 16167e 00009f 01018e 9c9ca1 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f d8d8d8 3e7d3e 00b100 007b00 00b800 00f100 178b17 3b9c3b 00c600 009700 3d933d 9a9a9a 9b9b9b 9d9d9d 676767 575759 0909ee 0000f0 04046b 33335a 070790 00009e 00007c 0d0d5d c7c7c7 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f eaeaea 477447 00ad00 008500 099809 00dc00 00a700 239823 00c300 009600 3f923f 989898 9a9a9a 9c9c9c 616161 42427f 0000ff 0000b9 1a1a5d 161649 00007b 00006b 00006b 1c1c56 f4f4f4 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f fcfcfc 506c50 00a900 009500 2d772d 00c100 00c500 019301 00c100 009000 4b914b 979797 999999 9a9a9a 5a5a5a 2b2ba4 0000f6 000086 2f2f53 191930 020263 000073 00009b 4d4d70 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 687368 00a400 00a400 3e653e 14a514 00d400 008b00 00bf00 008e00 4a904a 959595 979797 969696 575757 1a1ab5 0000de 000068 3f3f4b 2b2b2b 0c0c6d 0000b3 00006b 868692 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 8c8c8c 059e05 00b000 346634 408540 00ca00 009700 00bc00 008c00 498e49 939393 959595 8f8f8f 565656 0f0fb7 0000b9 030366 474747 2f2f64 0000a2 00009d 090958 c5c5c5 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f fafafa 90b090 348534 616461 636a63 06af06 00ae00 00b900 008b00 538d53 919191 939393 898989 555555 0a0aa8 00009d 070763 34345c 04049b 0000b1 1a1a4d b5b5bb 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f d0d0d0 6d6d6d 656565 2d8f2d 00b200 00b600 008900 558b55 8f8f8f 919191 818181 555555 15157e 000084 010165 010184 000091 1c1c6e ceced0 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f ececec 868686 587058 00af00 00b300 008800 538953 8d8d8d 8f8f8f 7a7a7a 545454 2c2c49 02026b 000064 000063 292974 dfdfe5 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f fcfcfc aaaaaa 219821 00b000 008600 578757 8b8b8b 8d8d8d 747474 535353 3d3d3d 1a1a23 0d0d43 474772 ededef 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f d1d6d1 389b38 2d772d 7d817d 888888 8b8b8b 6d6d6d 525252 4f4f4f 373737 777777 fafafa 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f efefef a0a0a0 838383 868686 888888 676767 515151 505050 a0a0a0 fdfdfd 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f fefefe c0c0c0 858585 868686 616161 525252 b7b7b7 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f dedede 909090 656565 cccccc 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f f5f5f5 e3e3e3 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +} diff --git a/src/image/png/testdata/pngsuite/ftp0n3p08.png b/src/image/png/testdata/pngsuite/ftp0n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..69a69e5872234d96cab4cbb017a0933fbfedba81 GIT binary patch literal 1476 zcmWlXc~H^`6vv-Om}J3dn5OOMOgg5aIm=3#R_~R8*9gm+#ueDlIJqsFg@0;tH{|b8}HqQ5Jw$Ebasl zi9{wQqx{s={QP`?_T1du%K+m5+1c6W&Yc6O&&;#KYi za0xyG{0*U@p&=n5OeT{~rxS7s!NI{ht9Awk26}jqu-LA432IQH$P*->1%a<=E7fhf7KmpiNEL?|$g$1|@ z&=;ZU0fm$KWEP7BFz+mN_CD$D>KXyBfJUPQ1qHz$U@Noz`t>V3 z0Y5*#_4Rf5=AAr|%l))v3zbTRZXmD;`udA>dIa18XhRr(3s9%iK@&&<11kswKn|(| zCKfuzi4TRu*jp4GWDgcp#{666_U|?<$;@lL6fyrT=v@~MF43;U zZ$6b_)kkb?TQRlFx@L1DFHuvCdiGRV@qSb5o3SyX=dqWIo~SD}lgtU8-0hinIc|l^ zwZpyIy{+Kp3qku~jyuQS{wOJTffqk}ylg!rGf@@8WYp~qRTEe@i_6M#f}U2WR@4MfM)1HJRjPCMx~ z7uM(-p3*y>&A)fhi1A3;cS(L+J1;&pqWL&it>CX0-+eBqO{=g-lKzNGvG(`sNqtRF zeg3%mDzvL|F3Eho_0DyETn8H%dc!?dA!#0>Q=Vr9#{-Ga&|1#6CAW+Q0sfY$`N-&; z^0c=#@%4)8jy6X3lL6u3JAW=?c#tm>K2a$#(Q?|Uz}T^+pWADD@MB|q8>&Xr948aj zsY1|Z7&ad@u4wr4W%TE{WS7U&Rh^yI#(OsCtq$vQ3|A*M_uLm%-A~M)I@BiVUyS#YR$&g!`CNx58tIE z|3D@=NLJY$Q%;J12ZU?1w#&^2c5EzDN05DZLoa2szJ*SEwwg0|Mem<$Yn1cWcz^cq z-}lxrB6iz%k1R&3=>`|KS%};k)l(YskH!jI!g#-(&O>3hx)5(GX8X3fe_&q16?&Zr z)72bEymR&OySDOI3mZ0C3tSEiO=8X3u^BG}uBukDWrMyZ$LQ%Y4sr7@il=hRi%!IK N0G~qvls0mN@PBi2fm#3n literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftp0n3p08.sng b/src/image/png/testdata/pngsuite/ftp0n3p08.sng new file mode 100644 index 0000000000..f1f8448d00 --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftp0n3p08.sng @@ -0,0 +1,288 @@ +#SNG: from ftp0n3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) +} +IMAGE { + pixels hex +2323232323232323232323232323232323232323232323232323232323232323 +2323232323232323232323232323232323232323232323232323232323232323 +2323232323232323232323232323e0ea66232323232323232323232323232323 +2323232323232323232323de02a336e43903f4f0232323232323232323232323 +232323232323232369ef1a358680062eb017b0ab7af459502323232323232323 +2323232323667c0ea9cc803979937917a03a878787b0e2ae8ae75c2323232323 +23235cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c692323 +23237823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e2323 +2323e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef2323 +23236c9f229d981a23282828282828282828282828282828a7b445c3c8de2323 +23235ca249d63d140f139f272727272727272727a5a528af44c3c8ce43232323 +2323239a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1232323 +232323965b58b53811940d0b090b1823a3a3252ab4d24c269957571088232323 +232323946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877232323 +23232388c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950232323 +23232302bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a923232323 +2323237b47636ec441b23d4edb3f09078bac4315f340ec855a82995f23232323 +23232359bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b23232323 +2323236cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086023232323 +23232350bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e62323232323 +23232323add6d6bf61c16f566eb20e0d924475bd578572001e6d342323232323 +2323232316d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b2323232323 +23232323550c47b3365bd45d6f33110f1a4575cbf2c0521e0802232323232323 +232323232323e7ac36be625e7031131122455a0a2f0a9900e723232323232323 +232323232323236a9e37d36270331613a545f181e53032e82323232323232323 +23232323232323235088c5d371311816a8464b7374ee89232323232323232323 +2323232323232323232377b654a29b18acc24a722a5523232323232323232323 +2323232323232323232323d78a9f9e9b3548c38ac92323232323232323232323 +232323232323232323232323c6ef1f9e3cc20223232323232323232323232323 +2323232323232323232323232323e89736782323232323232323232323232323 +23232323232323232323232323232360e0232323232323232323232323232323 +2323232323232323232323232323232323232323232323232323232323232323 +} diff --git a/src/image/png/testdata/pngsuite/ftp1n3p08.png b/src/image/png/testdata/pngsuite/ftp1n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c9f35a86271c056e955f637a8769381eb03827 GIT binary patch literal 1483 zcmWlXdpOez7{_0ijw~Xj6ZLfH5mEEBP|@KrEtkTuS}m>SI;>1?8{6D(v$V!$$}kk^ z;zXQM92O%H=ShmnbXw(ZQ8_r3^Xq+{_x=9)zVGMz<@$KL>7tBL0HEvPj`Ks*k)Uu?Q@xn6z>Z3lMM-Q#6tfUZ$jg9xOySS8oYSdsZ?58S}Ku90Gh5`xl#{MR8%wt zP*_-43Lq2;*RS7_pPzr}(xrd%E)}>Vg+~H{0|EmB;S209 z+JEZQsgoy9!bij)vJ2CNNF)M$vKCsqg}Grc6c_?OKR+KIALs+qBGU~U&cS2w^z{7x z{X6{3T?w5=n_Ror-Q69U!8X)ZUHvP8K!G~|wFu*%2C7slr~p15FS4}-9)W zgA1TkDj@~(fB8jCjUG%S0R(${)B5}SM@HTPu)4duH*Un5nj+Sda5!dbYwOg=2pWA9 zg`xngv~oCl+wa{*R;b1Lc@x0-<4`CPvRn@w_UQh+Ac}Mk^OKb>f7-E19*W;}xs}~! zRlIciNyF__FM9f7*5I)-+cbPa1|k-TrQvsONlsb*)pnz$h0|UcNA3@z)MNfwE}Uv0 zIbFH+_Zk14HEp3y&g@1-ft^E-J#CK+WhE5TXruYlt&^-N^P3g#I=H!w`R}L=sT9s{ zCuD1uhCdG)aY*zhVd3F}HZMyY{g2C62iLwz8h1Q_?PFhSvbid>^O4P?YqRlh((eZd z#_aspCH=EBx%*CRO=qIG-J;L_AlZKBgiu)@&Tb|Ii=AapW?Zqp>gYA)sH#J5XB+h; zk9wYVqsyC_bvIrV9&w7WX>VWUAVpP~na{j&$UYNXX^m&}Uyx5RnnjA&4L3VdD!1H_ zD#Iq{ZueA8l;TIb`kpn$X5SsBHj?FpV!HrYcY~@^RN}pDGk;X^V&G~0qorYaOP*rv z^qN~4t3n!C(Ta6lUVkRto3S5$_!4xZm;=Uxwl-UlXk<^TD! zwrXx-kZ%7r>OqrnxrwlgbC>i*G{g?VCRx6GHc+-!v-|w+aMq(Z)3<$!sgDrNgW zt{66;txYft&kQV}Qtm74k`-qO{C2WMU5|#0wUn?oyC~|ghKx56YPk5`Xp_O#x8g2M X(5+n&l!#upArS?SL*BSr7fRay;V71Q literal 0 HcmV?d00001 diff --git a/src/image/png/testdata/pngsuite/ftp1n3p08.sng b/src/image/png/testdata/pngsuite/ftp1n3p08.sng new file mode 100644 index 0000000000..2d179e2e99 --- /dev/null +++ b/src/image/png/testdata/pngsuite/ftp1n3p08.sng @@ -0,0 +1,290 @@ +#SNG: from ftp1n3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) +} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} -- 2.48.1