From e702bfab48d418bea1476bde286726a9dab28df5 Mon Sep 17 00:00:00 2001 From: Alexander Adhyatma Date: Fri, 1 Oct 2021 22:44:26 +0700 Subject: [PATCH] embed gui icons --- go.mod | 2 +- go.sum | 2 - internal/gui/gui.go | 9 +- internal/gui/gui_darwin.go | 28 +- internal/gui/gui_linux.go | 2 +- internal/gui/gui_windows.go | 15 +- internal/gui/icons/icon.ico | Bin 0 -> 67646 bytes internal/gui/icons/icon.png | Bin 0 -> 7025 bytes internal/gui/icons/icon.tiff | Bin 0 -> 35948 bytes vendor/golang.org/x/image/AUTHORS | 3 - vendor/golang.org/x/image/CONTRIBUTORS | 3 - vendor/golang.org/x/image/LICENSE | 27 - vendor/golang.org/x/image/PATENTS | 22 - vendor/golang.org/x/image/ccitt/reader.go | 795 --------------- vendor/golang.org/x/image/ccitt/table.go | 972 ------------------- vendor/golang.org/x/image/ccitt/writer.go | 102 -- vendor/golang.org/x/image/tiff/buffer.go | 69 -- vendor/golang.org/x/image/tiff/compress.go | 58 -- vendor/golang.org/x/image/tiff/consts.go | 149 --- vendor/golang.org/x/image/tiff/fuzz.go | 30 - vendor/golang.org/x/image/tiff/lzw/reader.go | 272 ------ vendor/golang.org/x/image/tiff/reader.go | 709 -------------- vendor/golang.org/x/image/tiff/writer.go | 438 --------- vendor/modules.txt | 6 +- 24 files changed, 16 insertions(+), 3697 deletions(-) create mode 100644 internal/gui/icons/icon.ico create mode 100644 internal/gui/icons/icon.png create mode 100644 internal/gui/icons/icon.tiff delete mode 100644 vendor/golang.org/x/image/AUTHORS delete mode 100644 vendor/golang.org/x/image/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/image/LICENSE delete mode 100644 vendor/golang.org/x/image/PATENTS delete mode 100644 vendor/golang.org/x/image/ccitt/reader.go delete mode 100644 vendor/golang.org/x/image/ccitt/table.go delete mode 100644 vendor/golang.org/x/image/ccitt/writer.go delete mode 100644 vendor/golang.org/x/image/tiff/buffer.go delete mode 100644 vendor/golang.org/x/image/tiff/compress.go delete mode 100644 vendor/golang.org/x/image/tiff/consts.go delete mode 100644 vendor/golang.org/x/image/tiff/fuzz.go delete mode 100644 vendor/golang.org/x/image/tiff/lzw/reader.go delete mode 100644 vendor/golang.org/x/image/tiff/reader.go delete mode 100644 vendor/golang.org/x/image/tiff/writer.go diff --git a/go.mod b/go.mod index 526a1a31de..e6a44015a2 100644 --- a/go.mod +++ b/go.mod @@ -43,10 +43,10 @@ require ( github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 // indirect go.etcd.io/bbolt v1.3.5 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect - golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 golang.org/x/sys v0.0.0-20210608053332-aa57babbf139 golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect + golang.org/x/text v0.3.6 // indirect golang.org/x/tools v0.1.2 // indirect golang.zx2c4.com/wireguard v0.0.20200320 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect diff --git a/go.sum b/go.sum index e7e48d3e17..2961500157 100644 --- a/go.sum +++ b/go.sum @@ -402,8 +402,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= diff --git a/internal/gui/gui.go b/internal/gui/gui.go index ce0add9110..575934132d 100644 --- a/internal/gui/gui.go +++ b/internal/gui/gui.go @@ -5,6 +5,7 @@ package gui import ( "context" + "embed" "fmt" "io" "io/ioutil" @@ -26,6 +27,9 @@ import ( // TODO @alexadhy : Show VPN status, list all vpn servers, quick dial +//go:embed icons/* +var iconFS embed.FS + var log = logging.NewMasterLogger() var ( @@ -72,10 +76,7 @@ func OnGUIQuit() { // ReadSysTrayIcon reads system tray icon. func ReadSysTrayIcon() ([]byte, error) { - if err := preReadIcon(); err != nil { - return nil, err - } - contents, err := ioutil.ReadFile(iconPath) + contents, err := iconFS.ReadFile(iconName) if err != nil { return nil, fmt.Errorf("failed to read icon: %w", err) } diff --git a/internal/gui/gui_darwin.go b/internal/gui/gui_darwin.go index 61f2660635..0987a1fefb 100644 --- a/internal/gui/gui_darwin.go +++ b/internal/gui/gui_darwin.go @@ -4,41 +4,15 @@ package gui import ( - "image/png" "os" - - "golang.org/x/image/tiff" ) const ( - pngIconPath = "/Applications/Skywire.app/Contents/Resources/icon.png" - iconPath = "/Applications/Skywire.app/Contents/Resources/tray_icon.tiff" deinstallerPath = "/Applications/Skywire.app/Contents/deinstaller" appPath = "/Applications/Skywire.app" + iconName = "icons/icon.tiff" ) -func preReadIcon() error { - imgFile, err := os.Open(pngIconPath) - if err != nil { - return err - } - img, err := png.Decode(imgFile) - if err != nil { - return err - } - - tiffFile, err := os.Create(iconPath) - if err != nil { - return err - } - - if err = tiff.Encode(tiffFile, img, nil); err != nil { - return err - } - - return tiffFile.Close() -} - func checkIsPackage() bool { _, err := os.Stat(appPath) return err == nil diff --git a/internal/gui/gui_linux.go b/internal/gui/gui_linux.go index e445f4109b..3b5282aed7 100644 --- a/internal/gui/gui_linux.go +++ b/internal/gui/gui_linux.go @@ -9,7 +9,7 @@ import ( // TODO (darkrengarius): change path const ( - iconPath = "/opt/skywire/icon.png" + iconName = "icons/icon.png" deinstallerPath = "/opt/skywire/deinstaller" ) diff --git a/internal/gui/gui_windows.go b/internal/gui/gui_windows.go index 5f6cdd8433..5c836e797d 100644 --- a/internal/gui/gui_windows.go +++ b/internal/gui/gui_windows.go @@ -11,19 +11,18 @@ import ( ) // TODO (darkrengarius): change path -const iconPath = "%LOCALDATA\\skywire\\icon.png" +const iconName = "icons/icon.ico" -func deinstallerPath() string { - return filepath.Join(localDataPath, "skywire", "deinstaller.ps1") +func localDataPath() string { + return os.Getenv("LOCALDATA") } -func platformExecUninstall() error { - localDataPath := os.Getenv("LOCALDATA") - return osutil.Run("pwsh", "-c", deinstallerPath) +func deinstallerPath() string { + return filepath.Join(localDataPath(), "skywire", "deinstaller.ps1") } -func preReadIcon() error { - return nil +func platformExecUninstall() error { + return osutil.Run("pwsh", "-c", deinstallerPath()) } func checkIsPackage() bool { diff --git a/internal/gui/icons/icon.ico b/internal/gui/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a59afb5cfbe34bbdf93a60276e440f2034f429bd GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/internal/gui/icons/icon.png b/internal/gui/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fddafbe9ac242a663c19f319206652daad355cc9 GIT binary patch literal 7025 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 literal 0 HcmV?d00001 diff --git a/internal/gui/icons/icon.tiff b/internal/gui/icons/icon.tiff new file mode 100644 index 0000000000000000000000000000000000000000..b635a4967c9ff9f7cf48f30580dd9579156d7409 GIT binary patch literal 35948 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 q)qefBU{zI#0U)VZ*>~qJl zJNFCa^R90qHD89#UT1G<+ezfF@p5Vr=KIOgRhFnXWfnYqE!&IwDa}Y|B4e0!Cy;Z{A4QOFlZBznnj7 zl~_NRhlfuLbT9{1xK({fRXKDzqwyU0-KAL2vcthdekJnezGfa_*G0C&cc}hcEL``8 zQ*_+5M1HrqJCxd9wfAvSOqa;yy?p{_bb!U&4>hI7Fy}HJ+rd^|usEL{9FfH(=?gSY zMaCqHsOd`No^(9fiuhtAdP^E9R+Z+=`VzK>4SvL_cll0?y|G^cy|QzMj6YZG13sRl z8aClI25&u}c;As;aU6szDauo3Xs*S(Hpf;Df&+)A+>$8WJPzkvr=)_W_ zO5|!U6Tw&GJ(zaSAkJOMfDFdRw|q%2B-}#3pk*kBsydZHyhH0v0vR8%%q2m zgvb@?XRUC}l(B!08ZMV=v8Ou_Qz<;{>6IuQ!l-`Nl)8xG0WS1mWPj8>Z8o{*$)kZB zy_sv${9_f-rS8F%Y$=X{Y4dTZuPyrOQ)w3YHeb-bU^aLSQSmmO%CZn)9r{%uCzQ@C z_tTOq`4_z+_sr$24uMBQQ)gSA0oiv(ZY5jrG8=l2(-LJL7SMIkYUOj2J>M@>x8|_< zB^)T1AKG<&G}3;%xb{PyJWK4bQL@#tbT4u2QONM?7^(FFnxeFj((x>DwcOvVBLr=5QIrah`MVLH7cvguvkajR~4y6V2a7j+;dH2+z%l&PPsab@SDcax_GmlAn) z@moyKN0g3SS9K}~-mzUKZ@Dme<@l&KBAwPE1y*A1D^&{mL)t%NeFFJLYewy~So+L; z#n~0=Z}OWv{L1zBRDbm*Eqrj=F)V&_;B7-kc;U=xRL~ZGXXE*-0FE=sA;VD(P0!T9 z%Wq$WZ550+j*BeJd5DKpjL*HDe6-`j*?DK1|J%FC7yB;R}vMGqwR0MKTQ4wT)7a~9RUPs>LT1VhdF%5o4R#M6XnLmAGuS=+%|QU$}LAe zdgnWL`_yAPcP>5rt^j|>)JrD!9NXAkZ}D^SFPjIKSNv|FeAm<$E{~j>Pj|nof1LUY zdU8c2?Fs00f4<1)nUkKf=WW{aSyRZ1s~~N!(6;yURWYxe`i#Br&V8RBOL0J<|INt% z2krd782SI%|KE)K$E%S4cSim>9UY7MpNxDc06ad1{J%5u|2h7A8c+c7&!wF2PyII| z|M9~Aoso}a`oA;svA};b^09p9=lN$zI$!^}<^THrUyOVJd<+26JOCiB005@-=STeK z^A9s0Epz8T*!+K~`TtV$|9OA_;9qLK_J92l|JnXa&HtC0|1UNFUuyop)ck*``TtV$ P|E1>tOU?iPqvrn)@x`mk literal 0 HcmV?d00001 diff --git a/vendor/golang.org/x/image/AUTHORS b/vendor/golang.org/x/image/AUTHORS deleted file mode 100644 index 15167cd746..0000000000 --- a/vendor/golang.org/x/image/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/image/CONTRIBUTORS b/vendor/golang.org/x/image/CONTRIBUTORS deleted file mode 100644 index 1c4577e968..0000000000 --- a/vendor/golang.org/x/image/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/image/LICENSE b/vendor/golang.org/x/image/LICENSE deleted file mode 100644 index 6a66aea5ea..0000000000 --- a/vendor/golang.org/x/image/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/image/PATENTS b/vendor/golang.org/x/image/PATENTS deleted file mode 100644 index 733099041f..0000000000 --- a/vendor/golang.org/x/image/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/image/ccitt/reader.go b/vendor/golang.org/x/image/ccitt/reader.go deleted file mode 100644 index 340de05367..0000000000 --- a/vendor/golang.org/x/image/ccitt/reader.go +++ /dev/null @@ -1,795 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go - -// Package ccitt implements a CCITT (fax) image decoder. -package ccitt - -import ( - "encoding/binary" - "errors" - "image" - "io" - "math/bits" -) - -var ( - errIncompleteCode = errors.New("ccitt: incomplete code") - errInvalidBounds = errors.New("ccitt: invalid bounds") - errInvalidCode = errors.New("ccitt: invalid code") - errInvalidMode = errors.New("ccitt: invalid mode") - errInvalidOffset = errors.New("ccitt: invalid offset") - errMissingEOL = errors.New("ccitt: missing End-of-Line") - errRunLengthOverflowsWidth = errors.New("ccitt: run length overflows width") - errRunLengthTooLong = errors.New("ccitt: run length too long") - errUnsupportedMode = errors.New("ccitt: unsupported mode") - errUnsupportedSubFormat = errors.New("ccitt: unsupported sub-format") - errUnsupportedWidth = errors.New("ccitt: unsupported width") -) - -// Order specifies the bit ordering in a CCITT data stream. -type Order uint32 - -const ( - // LSB means Least Significant Bits first. - LSB Order = iota - // MSB means Most Significant Bits first. - MSB -) - -// SubFormat represents that the CCITT format consists of a number of -// sub-formats. Decoding or encoding a CCITT data stream requires knowing the -// sub-format context. It is not represented in the data stream per se. -type SubFormat uint32 - -const ( - Group3 SubFormat = iota - Group4 -) - -// AutoDetectHeight is passed as the height argument to NewReader to indicate -// that the image height (the number of rows) is not known in advance. -const AutoDetectHeight = -1 - -// Options are optional parameters. -type Options struct { - // Align means that some variable-bit-width codes are byte-aligned. - Align bool - // Invert means that black is the 1 bit or 0xFF byte, and white is 0. - Invert bool -} - -// maxWidth is the maximum (inclusive) supported width. This is a limitation of -// this implementation, to guard against integer overflow, and not anything -// inherent to the CCITT format. -const maxWidth = 1 << 20 - -func invertBytes(b []byte) { - for i, c := range b { - b[i] = ^c - } -} - -func reverseBitsWithinBytes(b []byte) { - for i, c := range b { - b[i] = bits.Reverse8(c) - } -} - -// highBits writes to dst (1 bit per pixel, most significant bit first) the -// high (0x80) bits from src (1 byte per pixel). It returns the number of bytes -// written and read such that dst[:d] is the packed form of src[:s]. -// -// For example, if src starts with the 8 bytes [0x7D, 0x7E, 0x7F, 0x80, 0x81, -// 0x82, 0x00, 0xFF] then 0x1D will be written to dst[0]. -// -// If src has (8 * len(dst)) or more bytes then only len(dst) bytes are -// written, (8 * len(dst)) bytes are read, and invert is ignored. -// -// Otherwise, if len(src) is not a multiple of 8 then the final byte written to -// dst is padded with 1 bits (if invert is true) or 0 bits. If inverted, the 1s -// are typically temporary, e.g. they will be flipped back to 0s by an -// invertBytes call in the highBits caller, reader.Read. -func highBits(dst []byte, src []byte, invert bool) (d int, s int) { - // Pack as many complete groups of 8 src bytes as we can. - n := len(src) / 8 - if n > len(dst) { - n = len(dst) - } - dstN := dst[:n] - for i := range dstN { - src8 := src[i*8 : i*8+8] - dstN[i] = ((src8[0] & 0x80) >> 0) | - ((src8[1] & 0x80) >> 1) | - ((src8[2] & 0x80) >> 2) | - ((src8[3] & 0x80) >> 3) | - ((src8[4] & 0x80) >> 4) | - ((src8[5] & 0x80) >> 5) | - ((src8[6] & 0x80) >> 6) | - ((src8[7] & 0x80) >> 7) - } - d, s = n, 8*n - dst, src = dst[d:], src[s:] - - // Pack up to 7 remaining src bytes, if there's room in dst. - if (len(dst) > 0) && (len(src) > 0) { - dstByte := byte(0) - if invert { - dstByte = 0xFF >> uint(len(src)) - } - for n, srcByte := range src { - dstByte |= (srcByte & 0x80) >> uint(n) - } - dst[0] = dstByte - d, s = d+1, s+len(src) - } - return d, s -} - -type bitReader struct { - r io.Reader - - // readErr is the error returned from the most recent r.Read call. As the - // io.Reader documentation says, when r.Read returns (n, err), "always - // process the n > 0 bytes returned before considering the error err". - readErr error - - // order is whether to process r's bytes LSB first or MSB first. - order Order - - // The high nBits bits of the bits field hold upcoming bits in MSB order. - bits uint64 - nBits uint32 - - // bytes[br:bw] holds bytes read from r but not yet loaded into bits. - br uint32 - bw uint32 - bytes [1024]uint8 -} - -func (b *bitReader) alignToByteBoundary() { - n := b.nBits & 7 - b.bits <<= n - b.nBits -= n -} - -// nextBitMaxNBits is the maximum possible value of bitReader.nBits after a -// bitReader.nextBit call, provided that bitReader.nBits was not more than this -// value before that call. -// -// Note that the decode function can unread bits, which can temporarily set the -// bitReader.nBits value above nextBitMaxNBits. -const nextBitMaxNBits = 31 - -func (b *bitReader) nextBit() (uint64, error) { - for { - if b.nBits > 0 { - bit := b.bits >> 63 - b.bits <<= 1 - b.nBits-- - return bit, nil - } - - if available := b.bw - b.br; available >= 4 { - // Read 32 bits, even though b.bits is a uint64, since the decode - // function may need to unread up to maxCodeLength bits, putting - // them back in the remaining (64 - 32) bits. TestMaxCodeLength - // checks that the generated maxCodeLength constant fits. - // - // If changing the Uint32 call, also change nextBitMaxNBits. - b.bits = uint64(binary.BigEndian.Uint32(b.bytes[b.br:])) << 32 - b.br += 4 - b.nBits = 32 - continue - } else if available > 0 { - b.bits = uint64(b.bytes[b.br]) << (7 * 8) - b.br++ - b.nBits = 8 - continue - } - - if b.readErr != nil { - return 0, b.readErr - } - - n, err := b.r.Read(b.bytes[:]) - b.br = 0 - b.bw = uint32(n) - b.readErr = err - - if b.order != MSB { - reverseBitsWithinBytes(b.bytes[:b.bw]) - } - } -} - -func decode(b *bitReader, decodeTable [][2]int16) (uint32, error) { - nBitsRead, bitsRead, state := uint32(0), uint64(0), int32(1) - for { - bit, err := b.nextBit() - if err != nil { - if err == io.EOF { - err = errIncompleteCode - } - return 0, err - } - bitsRead |= bit << (63 - nBitsRead) - nBitsRead++ - - // The "&1" is redundant, but can eliminate a bounds check. - state = int32(decodeTable[state][bit&1]) - if state < 0 { - return uint32(^state), nil - } else if state == 0 { - // Unread the bits we've read, then return errInvalidCode. - b.bits = (b.bits >> nBitsRead) | bitsRead - b.nBits += nBitsRead - return 0, errInvalidCode - } - } -} - -// decodeEOL decodes the 12-bit EOL code 0000_0000_0001. -func decodeEOL(b *bitReader) error { - nBitsRead, bitsRead := uint32(0), uint64(0) - for { - bit, err := b.nextBit() - if err != nil { - if err == io.EOF { - err = errMissingEOL - } - return err - } - bitsRead |= bit << (63 - nBitsRead) - nBitsRead++ - - if nBitsRead < 12 { - if bit&1 == 0 { - continue - } - } else if bit&1 != 0 { - return nil - } - - // Unread the bits we've read, then return errMissingEOL. - b.bits = (b.bits >> nBitsRead) | bitsRead - b.nBits += nBitsRead - return errMissingEOL - } -} - -type reader struct { - br bitReader - subFormat SubFormat - - // width is the image width in pixels. - width int - - // rowsRemaining starts at the image height in pixels, when the reader is - // driven through the io.Reader interface, and decrements to zero as rows - // are decoded. Alternatively, it may be negative if the image height is - // not known in advance at the time of the NewReader call. - // - // When driven through DecodeIntoGray, this field is unused. - rowsRemaining int - - // curr and prev hold the current and previous rows. Each element is either - // 0x00 (black) or 0xFF (white). - // - // prev may be nil, when processing the first row. - curr []byte - prev []byte - - // ri is the read index. curr[:ri] are those bytes of curr that have been - // passed along via the Read method. - // - // When the reader is driven through DecodeIntoGray, instead of through the - // io.Reader interface, this field is unused. - ri int - - // wi is the write index. curr[:wi] are those bytes of curr that have - // already been decoded via the decodeRow method. - // - // What this implementation calls wi is roughly equivalent to what the spec - // calls the a0 index. - wi int - - // These fields are copied from the *Options (which may be nil). - align bool - invert bool - - // atStartOfRow is whether we have just started the row. Some parts of the - // spec say to treat this situation as if "wi = -1". - atStartOfRow bool - - // penColorIsWhite is whether the next run is black or white. - penColorIsWhite bool - - // seenStartOfImage is whether we've called the startDecode method. - seenStartOfImage bool - - // truncated is whether the input is missing the final 6 consecutive EOL's - // (for Group3) or 2 consecutive EOL's (for Group4). Omitting that trailer - // (but otherwise padding to a byte boundary, with either all 0 bits or all - // 1 bits) is invalid according to the spec, but happens in practice when - // exporting from Adobe Acrobat to TIFF + CCITT. This package silently - // ignores the format error for CCITT input that has been truncated in that - // fashion, returning the full decoded image. - // - // Detecting trailer truncation (just after the final row of pixels) - // requires knowing which row is the final row, and therefore does not - // trigger if the image height is not known in advance. - truncated bool - - // readErr is a sticky error for the Read method. - readErr error -} - -func (z *reader) Read(p []byte) (int, error) { - if z.readErr != nil { - return 0, z.readErr - } - originalP := p - - for len(p) > 0 { - // Allocate buffers (and decode any start-of-image codes), if - // processing the first or second row. - if z.curr == nil { - if !z.seenStartOfImage { - if z.readErr = z.startDecode(); z.readErr != nil { - break - } - z.atStartOfRow = true - } - z.curr = make([]byte, z.width) - } - - // Decode the next row, if necessary. - if z.atStartOfRow { - if z.rowsRemaining < 0 { - // We do not know the image height in advance. See if the next - // code is an EOL. If it is, it is consumed. If it isn't, the - // bitReader shouldn't advance along the bit stream, and we - // simply decode another row of pixel data. - // - // For the Group4 subFormat, we may need to align to a byte - // boundary. For the Group3 subFormat, the previous z.decodeRow - // call (or z.startDecode call) has already consumed one of the - // 6 consecutive EOL's. The next EOL is actually the second of - // 6, in the middle, and we shouldn't align at that point. - if z.align && (z.subFormat == Group4) { - z.br.alignToByteBoundary() - } - - if err := z.decodeEOL(); err == errMissingEOL { - // No-op. It's another row of pixel data. - } else if err != nil { - z.readErr = err - break - } else { - if z.readErr = z.finishDecode(true); z.readErr != nil { - break - } - z.readErr = io.EOF - break - } - - } else if z.rowsRemaining == 0 { - // We do know the image height in advance, and we have already - // decoded exactly that many rows. - if z.readErr = z.finishDecode(false); z.readErr != nil { - break - } - z.readErr = io.EOF - break - - } else { - z.rowsRemaining-- - } - - if z.readErr = z.decodeRow(z.rowsRemaining == 0); z.readErr != nil { - break - } - } - - // Pack from z.curr (1 byte per pixel) to p (1 bit per pixel). - packD, packS := highBits(p, z.curr[z.ri:], z.invert) - p = p[packD:] - z.ri += packS - - // Prepare to decode the next row, if necessary. - if z.ri == len(z.curr) { - z.ri, z.curr, z.prev = 0, z.prev, z.curr - z.atStartOfRow = true - } - } - - n := len(originalP) - len(p) - if z.invert { - invertBytes(originalP[:n]) - } - return n, z.readErr -} - -func (z *reader) penColor() byte { - if z.penColorIsWhite { - return 0xFF - } - return 0x00 -} - -func (z *reader) startDecode() error { - switch z.subFormat { - case Group3: - if err := z.decodeEOL(); err != nil { - return err - } - - case Group4: - // No-op. - - default: - return errUnsupportedSubFormat - } - - z.seenStartOfImage = true - return nil -} - -func (z *reader) finishDecode(alreadySeenEOL bool) error { - numberOfEOLs := 0 - switch z.subFormat { - case Group3: - if z.truncated { - return nil - } - // The stream ends with a RTC (Return To Control) of 6 consecutive - // EOL's, but we should have already just seen an EOL, either in - // z.startDecode (for a zero-height image) or in z.decodeRow. - numberOfEOLs = 5 - - case Group4: - autoDetectHeight := z.rowsRemaining < 0 - if autoDetectHeight { - // Aligning to a byte boundary was already handled by reader.Read. - } else if z.align { - z.br.alignToByteBoundary() - } - // The stream ends with two EOL's. If the first one is missing, and we - // had an explicit image height, we just assume that the trailing two - // EOL's were truncated and return a nil error. - if err := z.decodeEOL(); err != nil { - if (err == errMissingEOL) && !autoDetectHeight { - z.truncated = true - return nil - } - return err - } - numberOfEOLs = 1 - - default: - return errUnsupportedSubFormat - } - - if alreadySeenEOL { - numberOfEOLs-- - } - for ; numberOfEOLs > 0; numberOfEOLs-- { - if err := z.decodeEOL(); err != nil { - return err - } - } - return nil -} - -func (z *reader) decodeEOL() error { - return decodeEOL(&z.br) -} - -func (z *reader) decodeRow(finalRow bool) error { - z.wi = 0 - z.atStartOfRow = true - z.penColorIsWhite = true - - if z.align { - z.br.alignToByteBoundary() - } - - switch z.subFormat { - case Group3: - for ; z.wi < len(z.curr); z.atStartOfRow = false { - if err := z.decodeRun(); err != nil { - return err - } - } - err := z.decodeEOL() - if finalRow && (err == errMissingEOL) { - z.truncated = true - return nil - } - return err - - case Group4: - for ; z.wi < len(z.curr); z.atStartOfRow = false { - mode, err := decode(&z.br, modeDecodeTable[:]) - if err != nil { - return err - } - rm := readerMode{} - if mode < uint32(len(readerModes)) { - rm = readerModes[mode] - } - if rm.function == nil { - return errInvalidMode - } - if err := rm.function(z, rm.arg); err != nil { - return err - } - } - return nil - } - - return errUnsupportedSubFormat -} - -func (z *reader) decodeRun() error { - table := blackDecodeTable[:] - if z.penColorIsWhite { - table = whiteDecodeTable[:] - } - - total := 0 - for { - n, err := decode(&z.br, table) - if err != nil { - return err - } - if n > maxWidth { - panic("unreachable") - } - total += int(n) - if total > maxWidth { - return errRunLengthTooLong - } - // Anything 0x3F or below is a terminal code. - if n <= 0x3F { - break - } - } - - if total > (len(z.curr) - z.wi) { - return errRunLengthOverflowsWidth - } - dst := z.curr[z.wi : z.wi+total] - penColor := z.penColor() - for i := range dst { - dst[i] = penColor - } - z.wi += total - z.penColorIsWhite = !z.penColorIsWhite - - return nil -} - -// The various modes' semantics are based on determining a row of pixels' -// "changing elements": those pixels whose color differs from the one on its -// immediate left. -// -// The row above the first row is implicitly all white. Similarly, the column -// to the left of the first column is implicitly all white. -// -// For example, here's Figure 1 in "ITU-T Recommendation T.6", where the -// current and previous rows contain black (B) and white (w) pixels. The a? -// indexes point into curr, the b? indexes point into prev. -// -// b1 b2 -// v v -// prev: BBBBBwwwwwBBBwwwww -// curr: BBBwwwwwBBBBBBwwww -// ^ ^ ^ -// a0 a1 a2 -// -// a0 is the "reference element" or current decoder position, roughly -// equivalent to what this implementation calls reader.wi. -// -// a1 is the next changing element to the right of a0, on the "coding line" -// (the current row). -// -// a2 is the next changing element to the right of a1, again on curr. -// -// b1 is the first changing element on the "reference line" (the previous row) -// to the right of a0 and of opposite color to a0. -// -// b2 is the next changing element to the right of b1, again on prev. -// -// The various modes calculate a1 (and a2, for modeH): -// - modePass calculates that a1 is at or to the right of b2. -// - modeH calculates a1 and a2 without considering b1 or b2. -// - modeV* calculates a1 to be b1 plus an adjustment (between -3 and +3). - -const ( - findB1 = false - findB2 = true -) - -// findB finds either the b1 or b2 value. -func (z *reader) findB(whichB bool) int { - // The initial row is a special case. The previous row is implicitly all - // white, so that there are no changing pixel elements. We return b1 or b2 - // to be at the end of the row. - if len(z.prev) != len(z.curr) { - return len(z.curr) - } - - i := z.wi - - if z.atStartOfRow { - // a0 is implicitly at -1, on a white pixel. b1 is the first black - // pixel in the previous row. b2 is the first white pixel after that. - for ; (i < len(z.prev)) && (z.prev[i] == 0xFF); i++ { - } - if whichB == findB2 { - for ; (i < len(z.prev)) && (z.prev[i] == 0x00); i++ { - } - } - return i - } - - // As per figure 1 above, assume that the current pen color is white. - // First, walk past every contiguous black pixel in prev, starting at a0. - oppositeColor := ^z.penColor() - for ; (i < len(z.prev)) && (z.prev[i] == oppositeColor); i++ { - } - - // Then walk past every contiguous white pixel. - penColor := ^oppositeColor - for ; (i < len(z.prev)) && (z.prev[i] == penColor); i++ { - } - - // We're now at a black pixel (or at the end of the row). That's b1. - if whichB == findB2 { - // If we're looking for b2, walk past every contiguous black pixel - // again. - oppositeColor := ^penColor - for ; (i < len(z.prev)) && (z.prev[i] == oppositeColor); i++ { - } - } - - return i -} - -type readerMode struct { - function func(z *reader, arg int) error - arg int -} - -var readerModes = [...]readerMode{ - modePass: {function: readerModePass}, - modeH: {function: readerModeH}, - modeV0: {function: readerModeV, arg: +0}, - modeVR1: {function: readerModeV, arg: +1}, - modeVR2: {function: readerModeV, arg: +2}, - modeVR3: {function: readerModeV, arg: +3}, - modeVL1: {function: readerModeV, arg: -1}, - modeVL2: {function: readerModeV, arg: -2}, - modeVL3: {function: readerModeV, arg: -3}, - modeExt: {function: readerModeExt}, -} - -func readerModePass(z *reader, arg int) error { - b2 := z.findB(findB2) - if (b2 < z.wi) || (len(z.curr) < b2) { - return errInvalidOffset - } - dst := z.curr[z.wi:b2] - penColor := z.penColor() - for i := range dst { - dst[i] = penColor - } - z.wi = b2 - return nil -} - -func readerModeH(z *reader, arg int) error { - // The first iteration finds a1. The second finds a2. - for i := 0; i < 2; i++ { - if err := z.decodeRun(); err != nil { - return err - } - } - return nil -} - -func readerModeV(z *reader, arg int) error { - a1 := z.findB(findB1) + arg - if (a1 < z.wi) || (len(z.curr) < a1) { - return errInvalidOffset - } - dst := z.curr[z.wi:a1] - penColor := z.penColor() - for i := range dst { - dst[i] = penColor - } - z.wi = a1 - z.penColorIsWhite = !z.penColorIsWhite - return nil -} - -func readerModeExt(z *reader, arg int) error { - return errUnsupportedMode -} - -// DecodeIntoGray decodes the CCITT-formatted data in r into dst. -// -// It returns an error if dst's width and height don't match the implied width -// and height of CCITT-formatted data. -func DecodeIntoGray(dst *image.Gray, r io.Reader, order Order, sf SubFormat, opts *Options) error { - bounds := dst.Bounds() - if (bounds.Dx() < 0) || (bounds.Dy() < 0) { - return errInvalidBounds - } - if bounds.Dx() > maxWidth { - return errUnsupportedWidth - } - - z := reader{ - br: bitReader{r: r, order: order}, - subFormat: sf, - align: (opts != nil) && opts.Align, - invert: (opts != nil) && opts.Invert, - width: bounds.Dx(), - } - if err := z.startDecode(); err != nil { - return err - } - - width := bounds.Dx() - for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - p := (y - bounds.Min.Y) * dst.Stride - z.curr = dst.Pix[p : p+width] - if err := z.decodeRow(y+1 == bounds.Max.Y); err != nil { - return err - } - z.curr, z.prev = nil, z.curr - } - - if err := z.finishDecode(false); err != nil { - return err - } - - if z.invert { - for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - p := (y - bounds.Min.Y) * dst.Stride - invertBytes(dst.Pix[p : p+width]) - } - } - - return nil -} - -// NewReader returns an io.Reader that decodes the CCITT-formatted data in r. -// The resultant byte stream is one bit per pixel (MSB first), with 1 meaning -// white and 0 meaning black. Each row in the result is byte-aligned. -// -// A negative height, such as passing AutoDetectHeight, means that the image -// height is not known in advance. A negative width is invalid. -func NewReader(r io.Reader, order Order, sf SubFormat, width int, height int, opts *Options) io.Reader { - readErr := error(nil) - if width < 0 { - readErr = errInvalidBounds - } else if width > maxWidth { - readErr = errUnsupportedWidth - } - - return &reader{ - br: bitReader{r: r, order: order}, - subFormat: sf, - align: (opts != nil) && opts.Align, - invert: (opts != nil) && opts.Invert, - width: width, - rowsRemaining: height, - readErr: readErr, - } -} diff --git a/vendor/golang.org/x/image/ccitt/table.go b/vendor/golang.org/x/image/ccitt/table.go deleted file mode 100644 index ef7ea9d40e..0000000000 --- a/vendor/golang.org/x/image/ccitt/table.go +++ /dev/null @@ -1,972 +0,0 @@ -// generated by "go run gen.go". DO NOT EDIT. - -package ccitt - -// Each decodeTable is represented by an array of [2]int16's: a binary tree. -// Each array element (other than element 0, which means invalid) is a branch -// node in that tree. The root node is always element 1 (the second element). -// -// To walk the tree, look at the next bit in the bit stream, using it to select -// the first or second element of the [2]int16. If that int16 is 0, we have an -// invalid code. If it is positive, go to that branch node. If it is negative, -// then we have a leaf node, whose value is the bitwise complement (the ^ -// operator) of that int16. -// -// Comments above each decodeTable also show the same structure visually. The -// "b123" lines show the 123'rd branch node. The "=XXXXX" lines show an invalid -// code. The "=v1234" lines show a leaf node with value 1234. When reading the -// bit stream, a 0 or 1 bit means to go up or down, as you move left to right. -// -// For example, in modeDecodeTable, branch node b005 is three steps up from the -// root node, meaning that we have already seen "000". If the next bit is "0" -// then we move to branch node b006. Otherwise, the next bit is "1", and we -// move to the leaf node v0000 (also known as the modePass constant). Indeed, -// the bits that encode modePass are "0001". -// -// Tables 1, 2 and 3 come from the "ITU-T Recommendation T.6: FACSIMILE CODING -// SCHEMES AND CODING CONTROL FUNCTIONS FOR GROUP 4 FACSIMILE APPARATUS" -// specification: -// -// https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-T.6-198811-I!!PDF-E&type=items - -// modeDecodeTable represents Table 1 and the End-of-Line code. -// -// +=XXXXX -// b009 +-+ -// | +=v0009 -// b007 +-+ -// | | +=v0008 -// b010 | +-+ -// | +=v0005 -// b006 +-+ -// | | +=v0007 -// b008 | +-+ -// | +=v0004 -// b005 +-+ -// | +=v0000 -// b003 +-+ -// | +=v0001 -// b002 +-+ -// | | +=v0006 -// b004 | +-+ -// | +=v0003 -// b001 +-+ -// +=v0002 -var modeDecodeTable = [...][2]int16{ - 0: {0, 0}, - 1: {2, ^2}, - 2: {3, 4}, - 3: {5, ^1}, - 4: {^6, ^3}, - 5: {6, ^0}, - 6: {7, 8}, - 7: {9, 10}, - 8: {^7, ^4}, - 9: {0, ^9}, - 10: {^8, ^5}, -} - -// whiteDecodeTable represents Tables 2 and 3 for a white run. -// -// +=XXXXX -// b059 +-+ -// | | +=v1792 -// b096 | | +-+ -// | | | | +=v1984 -// b100 | | | +-+ -// | | | +=v2048 -// b094 | | +-+ -// | | | | +=v2112 -// b101 | | | | +-+ -// | | | | | +=v2176 -// b097 | | | +-+ -// | | | | +=v2240 -// b102 | | | +-+ -// | | | +=v2304 -// b085 | +-+ -// | | +=v1856 -// b098 | | +-+ -// | | | +=v1920 -// b095 | +-+ -// | | +=v2368 -// b103 | | +-+ -// | | | +=v2432 -// b099 | +-+ -// | | +=v2496 -// b104 | +-+ -// | +=v2560 -// b040 +-+ -// | | +=v0029 -// b060 | +-+ -// | +=v0030 -// b026 +-+ -// | | +=v0045 -// b061 | | +-+ -// | | | +=v0046 -// b041 | +-+ -// | +=v0022 -// b016 +-+ -// | | +=v0023 -// b042 | | +-+ -// | | | | +=v0047 -// b062 | | | +-+ -// | | | +=v0048 -// b027 | +-+ -// | +=v0013 -// b008 +-+ -// | | +=v0020 -// b043 | | +-+ -// | | | | +=v0033 -// b063 | | | +-+ -// | | | +=v0034 -// b028 | | +-+ -// | | | | +=v0035 -// b064 | | | | +-+ -// | | | | | +=v0036 -// b044 | | | +-+ -// | | | | +=v0037 -// b065 | | | +-+ -// | | | +=v0038 -// b017 | +-+ -// | | +=v0019 -// b045 | | +-+ -// | | | | +=v0031 -// b066 | | | +-+ -// | | | +=v0032 -// b029 | +-+ -// | +=v0001 -// b004 +-+ -// | | +=v0012 -// b030 | | +-+ -// | | | | +=v0053 -// b067 | | | | +-+ -// | | | | | +=v0054 -// b046 | | | +-+ -// | | | +=v0026 -// b018 | | +-+ -// | | | | +=v0039 -// b068 | | | | +-+ -// | | | | | +=v0040 -// b047 | | | | +-+ -// | | | | | | +=v0041 -// b069 | | | | | +-+ -// | | | | | +=v0042 -// b031 | | | +-+ -// | | | | +=v0043 -// b070 | | | | +-+ -// | | | | | +=v0044 -// b048 | | | +-+ -// | | | +=v0021 -// b009 | +-+ -// | | +=v0028 -// b049 | | +-+ -// | | | | +=v0061 -// b071 | | | +-+ -// | | | +=v0062 -// b032 | | +-+ -// | | | | +=v0063 -// b072 | | | | +-+ -// | | | | | +=v0000 -// b050 | | | +-+ -// | | | | +=v0320 -// b073 | | | +-+ -// | | | +=v0384 -// b019 | +-+ -// | +=v0010 -// b002 +-+ -// | | +=v0011 -// b020 | | +-+ -// | | | | +=v0027 -// b051 | | | | +-+ -// | | | | | | +=v0059 -// b074 | | | | | +-+ -// | | | | | +=v0060 -// b033 | | | +-+ -// | | | | +=v1472 -// b086 | | | | +-+ -// | | | | | +=v1536 -// b075 | | | | +-+ -// | | | | | | +=v1600 -// b087 | | | | | +-+ -// | | | | | +=v1728 -// b052 | | | +-+ -// | | | +=v0018 -// b010 | | +-+ -// | | | | +=v0024 -// b053 | | | | +-+ -// | | | | | | +=v0049 -// b076 | | | | | +-+ -// | | | | | +=v0050 -// b034 | | | | +-+ -// | | | | | | +=v0051 -// b077 | | | | | | +-+ -// | | | | | | | +=v0052 -// b054 | | | | | +-+ -// | | | | | +=v0025 -// b021 | | | +-+ -// | | | | +=v0055 -// b078 | | | | +-+ -// | | | | | +=v0056 -// b055 | | | | +-+ -// | | | | | | +=v0057 -// b079 | | | | | +-+ -// | | | | | +=v0058 -// b035 | | | +-+ -// | | | +=v0192 -// b005 | +-+ -// | | +=v1664 -// b036 | | +-+ -// | | | | +=v0448 -// b080 | | | | +-+ -// | | | | | +=v0512 -// b056 | | | +-+ -// | | | | +=v0704 -// b088 | | | | +-+ -// | | | | | +=v0768 -// b081 | | | +-+ -// | | | +=v0640 -// b022 | | +-+ -// | | | | +=v0576 -// b082 | | | | +-+ -// | | | | | | +=v0832 -// b089 | | | | | +-+ -// | | | | | +=v0896 -// b057 | | | | +-+ -// | | | | | | +=v0960 -// b090 | | | | | | +-+ -// | | | | | | | +=v1024 -// b083 | | | | | +-+ -// | | | | | | +=v1088 -// b091 | | | | | +-+ -// | | | | | +=v1152 -// b037 | | | +-+ -// | | | | +=v1216 -// b092 | | | | +-+ -// | | | | | +=v1280 -// b084 | | | | +-+ -// | | | | | | +=v1344 -// b093 | | | | | +-+ -// | | | | | +=v1408 -// b058 | | | +-+ -// | | | +=v0256 -// b011 | +-+ -// | +=v0002 -// b001 +-+ -// | +=v0003 -// b012 | +-+ -// | | | +=v0128 -// b023 | | +-+ -// | | +=v0008 -// b006 | +-+ -// | | | +=v0009 -// b024 | | | +-+ -// | | | | | +=v0016 -// b038 | | | | +-+ -// | | | | +=v0017 -// b013 | | +-+ -// | | +=v0004 -// b003 +-+ -// | +=v0005 -// b014 | +-+ -// | | | +=v0014 -// b039 | | | +-+ -// | | | | +=v0015 -// b025 | | +-+ -// | | +=v0064 -// b007 +-+ -// | +=v0006 -// b015 +-+ -// +=v0007 -var whiteDecodeTable = [...][2]int16{ - 0: {0, 0}, - 1: {2, 3}, - 2: {4, 5}, - 3: {6, 7}, - 4: {8, 9}, - 5: {10, 11}, - 6: {12, 13}, - 7: {14, 15}, - 8: {16, 17}, - 9: {18, 19}, - 10: {20, 21}, - 11: {22, ^2}, - 12: {^3, 23}, - 13: {24, ^4}, - 14: {^5, 25}, - 15: {^6, ^7}, - 16: {26, 27}, - 17: {28, 29}, - 18: {30, 31}, - 19: {32, ^10}, - 20: {^11, 33}, - 21: {34, 35}, - 22: {36, 37}, - 23: {^128, ^8}, - 24: {^9, 38}, - 25: {39, ^64}, - 26: {40, 41}, - 27: {42, ^13}, - 28: {43, 44}, - 29: {45, ^1}, - 30: {^12, 46}, - 31: {47, 48}, - 32: {49, 50}, - 33: {51, 52}, - 34: {53, 54}, - 35: {55, ^192}, - 36: {^1664, 56}, - 37: {57, 58}, - 38: {^16, ^17}, - 39: {^14, ^15}, - 40: {59, 60}, - 41: {61, ^22}, - 42: {^23, 62}, - 43: {^20, 63}, - 44: {64, 65}, - 45: {^19, 66}, - 46: {67, ^26}, - 47: {68, 69}, - 48: {70, ^21}, - 49: {^28, 71}, - 50: {72, 73}, - 51: {^27, 74}, - 52: {75, ^18}, - 53: {^24, 76}, - 54: {77, ^25}, - 55: {78, 79}, - 56: {80, 81}, - 57: {82, 83}, - 58: {84, ^256}, - 59: {0, 85}, - 60: {^29, ^30}, - 61: {^45, ^46}, - 62: {^47, ^48}, - 63: {^33, ^34}, - 64: {^35, ^36}, - 65: {^37, ^38}, - 66: {^31, ^32}, - 67: {^53, ^54}, - 68: {^39, ^40}, - 69: {^41, ^42}, - 70: {^43, ^44}, - 71: {^61, ^62}, - 72: {^63, ^0}, - 73: {^320, ^384}, - 74: {^59, ^60}, - 75: {86, 87}, - 76: {^49, ^50}, - 77: {^51, ^52}, - 78: {^55, ^56}, - 79: {^57, ^58}, - 80: {^448, ^512}, - 81: {88, ^640}, - 82: {^576, 89}, - 83: {90, 91}, - 84: {92, 93}, - 85: {94, 95}, - 86: {^1472, ^1536}, - 87: {^1600, ^1728}, - 88: {^704, ^768}, - 89: {^832, ^896}, - 90: {^960, ^1024}, - 91: {^1088, ^1152}, - 92: {^1216, ^1280}, - 93: {^1344, ^1408}, - 94: {96, 97}, - 95: {98, 99}, - 96: {^1792, 100}, - 97: {101, 102}, - 98: {^1856, ^1920}, - 99: {103, 104}, - 100: {^1984, ^2048}, - 101: {^2112, ^2176}, - 102: {^2240, ^2304}, - 103: {^2368, ^2432}, - 104: {^2496, ^2560}, -} - -// blackDecodeTable represents Tables 2 and 3 for a black run. -// -// +=XXXXX -// b017 +-+ -// | | +=v1792 -// b042 | | +-+ -// | | | | +=v1984 -// b063 | | | +-+ -// | | | +=v2048 -// b029 | | +-+ -// | | | | +=v2112 -// b064 | | | | +-+ -// | | | | | +=v2176 -// b043 | | | +-+ -// | | | | +=v2240 -// b065 | | | +-+ -// | | | +=v2304 -// b022 | +-+ -// | | +=v1856 -// b044 | | +-+ -// | | | +=v1920 -// b030 | +-+ -// | | +=v2368 -// b066 | | +-+ -// | | | +=v2432 -// b045 | +-+ -// | | +=v2496 -// b067 | +-+ -// | +=v2560 -// b013 +-+ -// | | +=v0018 -// b031 | | +-+ -// | | | | +=v0052 -// b068 | | | | +-+ -// | | | | | | +=v0640 -// b095 | | | | | +-+ -// | | | | | +=v0704 -// b046 | | | +-+ -// | | | | +=v0768 -// b096 | | | | +-+ -// | | | | | +=v0832 -// b069 | | | +-+ -// | | | +=v0055 -// b023 | | +-+ -// | | | | +=v0056 -// b070 | | | | +-+ -// | | | | | | +=v1280 -// b097 | | | | | +-+ -// | | | | | +=v1344 -// b047 | | | | +-+ -// | | | | | | +=v1408 -// b098 | | | | | | +-+ -// | | | | | | | +=v1472 -// b071 | | | | | +-+ -// | | | | | +=v0059 -// b032 | | | +-+ -// | | | | +=v0060 -// b072 | | | | +-+ -// | | | | | | +=v1536 -// b099 | | | | | +-+ -// | | | | | +=v1600 -// b048 | | | +-+ -// | | | +=v0024 -// b018 | +-+ -// | | +=v0025 -// b049 | | +-+ -// | | | | +=v1664 -// b100 | | | | +-+ -// | | | | | +=v1728 -// b073 | | | +-+ -// | | | +=v0320 -// b033 | | +-+ -// | | | | +=v0384 -// b074 | | | | +-+ -// | | | | | +=v0448 -// b050 | | | +-+ -// | | | | +=v0512 -// b101 | | | | +-+ -// | | | | | +=v0576 -// b075 | | | +-+ -// | | | +=v0053 -// b024 | +-+ -// | | +=v0054 -// b076 | | +-+ -// | | | | +=v0896 -// b102 | | | +-+ -// | | | +=v0960 -// b051 | | +-+ -// | | | | +=v1024 -// b103 | | | | +-+ -// | | | | | +=v1088 -// b077 | | | +-+ -// | | | | +=v1152 -// b104 | | | +-+ -// | | | +=v1216 -// b034 | +-+ -// | +=v0064 -// b010 +-+ -// | | +=v0013 -// b019 | | +-+ -// | | | | +=v0023 -// b052 | | | | +-+ -// | | | | | | +=v0050 -// b078 | | | | | +-+ -// | | | | | +=v0051 -// b035 | | | | +-+ -// | | | | | | +=v0044 -// b079 | | | | | | +-+ -// | | | | | | | +=v0045 -// b053 | | | | | +-+ -// | | | | | | +=v0046 -// b080 | | | | | +-+ -// | | | | | +=v0047 -// b025 | | | +-+ -// | | | | +=v0057 -// b081 | | | | +-+ -// | | | | | +=v0058 -// b054 | | | | +-+ -// | | | | | | +=v0061 -// b082 | | | | | +-+ -// | | | | | +=v0256 -// b036 | | | +-+ -// | | | +=v0016 -// b014 | +-+ -// | | +=v0017 -// b037 | | +-+ -// | | | | +=v0048 -// b083 | | | | +-+ -// | | | | | +=v0049 -// b055 | | | +-+ -// | | | | +=v0062 -// b084 | | | +-+ -// | | | +=v0063 -// b026 | | +-+ -// | | | | +=v0030 -// b085 | | | | +-+ -// | | | | | +=v0031 -// b056 | | | | +-+ -// | | | | | | +=v0032 -// b086 | | | | | +-+ -// | | | | | +=v0033 -// b038 | | | +-+ -// | | | | +=v0040 -// b087 | | | | +-+ -// | | | | | +=v0041 -// b057 | | | +-+ -// | | | +=v0022 -// b020 | +-+ -// | +=v0014 -// b008 +-+ -// | | +=v0010 -// b015 | | +-+ -// | | | +=v0011 -// b011 | +-+ -// | | +=v0015 -// b027 | | +-+ -// | | | | +=v0128 -// b088 | | | | +-+ -// | | | | | +=v0192 -// b058 | | | | +-+ -// | | | | | | +=v0026 -// b089 | | | | | +-+ -// | | | | | +=v0027 -// b039 | | | +-+ -// | | | | +=v0028 -// b090 | | | | +-+ -// | | | | | +=v0029 -// b059 | | | +-+ -// | | | +=v0019 -// b021 | | +-+ -// | | | | +=v0020 -// b060 | | | | +-+ -// | | | | | | +=v0034 -// b091 | | | | | +-+ -// | | | | | +=v0035 -// b040 | | | | +-+ -// | | | | | | +=v0036 -// b092 | | | | | | +-+ -// | | | | | | | +=v0037 -// b061 | | | | | +-+ -// | | | | | | +=v0038 -// b093 | | | | | +-+ -// | | | | | +=v0039 -// b028 | | | +-+ -// | | | | +=v0021 -// b062 | | | | +-+ -// | | | | | | +=v0042 -// b094 | | | | | +-+ -// | | | | | +=v0043 -// b041 | | | +-+ -// | | | +=v0000 -// b016 | +-+ -// | +=v0012 -// b006 +-+ -// | | +=v0009 -// b012 | | +-+ -// | | | +=v0008 -// b009 | +-+ -// | +=v0007 -// b004 +-+ -// | | +=v0006 -// b007 | +-+ -// | +=v0005 -// b002 +-+ -// | | +=v0001 -// b005 | +-+ -// | +=v0004 -// b001 +-+ -// | +=v0003 -// b003 +-+ -// +=v0002 -var blackDecodeTable = [...][2]int16{ - 0: {0, 0}, - 1: {2, 3}, - 2: {4, 5}, - 3: {^3, ^2}, - 4: {6, 7}, - 5: {^1, ^4}, - 6: {8, 9}, - 7: {^6, ^5}, - 8: {10, 11}, - 9: {12, ^7}, - 10: {13, 14}, - 11: {15, 16}, - 12: {^9, ^8}, - 13: {17, 18}, - 14: {19, 20}, - 15: {^10, ^11}, - 16: {21, ^12}, - 17: {0, 22}, - 18: {23, 24}, - 19: {^13, 25}, - 20: {26, ^14}, - 21: {27, 28}, - 22: {29, 30}, - 23: {31, 32}, - 24: {33, 34}, - 25: {35, 36}, - 26: {37, 38}, - 27: {^15, 39}, - 28: {40, 41}, - 29: {42, 43}, - 30: {44, 45}, - 31: {^18, 46}, - 32: {47, 48}, - 33: {49, 50}, - 34: {51, ^64}, - 35: {52, 53}, - 36: {54, ^16}, - 37: {^17, 55}, - 38: {56, 57}, - 39: {58, 59}, - 40: {60, 61}, - 41: {62, ^0}, - 42: {^1792, 63}, - 43: {64, 65}, - 44: {^1856, ^1920}, - 45: {66, 67}, - 46: {68, 69}, - 47: {70, 71}, - 48: {72, ^24}, - 49: {^25, 73}, - 50: {74, 75}, - 51: {76, 77}, - 52: {^23, 78}, - 53: {79, 80}, - 54: {81, 82}, - 55: {83, 84}, - 56: {85, 86}, - 57: {87, ^22}, - 58: {88, 89}, - 59: {90, ^19}, - 60: {^20, 91}, - 61: {92, 93}, - 62: {^21, 94}, - 63: {^1984, ^2048}, - 64: {^2112, ^2176}, - 65: {^2240, ^2304}, - 66: {^2368, ^2432}, - 67: {^2496, ^2560}, - 68: {^52, 95}, - 69: {96, ^55}, - 70: {^56, 97}, - 71: {98, ^59}, - 72: {^60, 99}, - 73: {100, ^320}, - 74: {^384, ^448}, - 75: {101, ^53}, - 76: {^54, 102}, - 77: {103, 104}, - 78: {^50, ^51}, - 79: {^44, ^45}, - 80: {^46, ^47}, - 81: {^57, ^58}, - 82: {^61, ^256}, - 83: {^48, ^49}, - 84: {^62, ^63}, - 85: {^30, ^31}, - 86: {^32, ^33}, - 87: {^40, ^41}, - 88: {^128, ^192}, - 89: {^26, ^27}, - 90: {^28, ^29}, - 91: {^34, ^35}, - 92: {^36, ^37}, - 93: {^38, ^39}, - 94: {^42, ^43}, - 95: {^640, ^704}, - 96: {^768, ^832}, - 97: {^1280, ^1344}, - 98: {^1408, ^1472}, - 99: {^1536, ^1600}, - 100: {^1664, ^1728}, - 101: {^512, ^576}, - 102: {^896, ^960}, - 103: {^1024, ^1088}, - 104: {^1152, ^1216}, -} - -const maxCodeLength = 13 - -// Each encodeTable is represented by an array of bitStrings. - -// bitString is a pair of uint32 values representing a bit code. -// The nBits low bits of bits make up the actual bit code. -// Eg. bitString{0x0004, 8} represents the bitcode "00000100". -type bitString struct { - bits uint32 - nBits uint32 -} - -// modeEncodeTable represents Table 1 and the End-of-Line code. -var modeEncodeTable = [...]bitString{ - 0: {0x0001, 4}, // "0001" - 1: {0x0001, 3}, // "001" - 2: {0x0001, 1}, // "1" - 3: {0x0003, 3}, // "011" - 4: {0x0003, 6}, // "000011" - 5: {0x0003, 7}, // "0000011" - 6: {0x0002, 3}, // "010" - 7: {0x0002, 6}, // "000010" - 8: {0x0002, 7}, // "0000010" - 9: {0x0001, 7}, // "0000001" -} - -// whiteEncodeTable2 represents Table 2 for a white run. -var whiteEncodeTable2 = [...]bitString{ - 0: {0x0035, 8}, // "00110101" - 1: {0x0007, 6}, // "000111" - 2: {0x0007, 4}, // "0111" - 3: {0x0008, 4}, // "1000" - 4: {0x000b, 4}, // "1011" - 5: {0x000c, 4}, // "1100" - 6: {0x000e, 4}, // "1110" - 7: {0x000f, 4}, // "1111" - 8: {0x0013, 5}, // "10011" - 9: {0x0014, 5}, // "10100" - 10: {0x0007, 5}, // "00111" - 11: {0x0008, 5}, // "01000" - 12: {0x0008, 6}, // "001000" - 13: {0x0003, 6}, // "000011" - 14: {0x0034, 6}, // "110100" - 15: {0x0035, 6}, // "110101" - 16: {0x002a, 6}, // "101010" - 17: {0x002b, 6}, // "101011" - 18: {0x0027, 7}, // "0100111" - 19: {0x000c, 7}, // "0001100" - 20: {0x0008, 7}, // "0001000" - 21: {0x0017, 7}, // "0010111" - 22: {0x0003, 7}, // "0000011" - 23: {0x0004, 7}, // "0000100" - 24: {0x0028, 7}, // "0101000" - 25: {0x002b, 7}, // "0101011" - 26: {0x0013, 7}, // "0010011" - 27: {0x0024, 7}, // "0100100" - 28: {0x0018, 7}, // "0011000" - 29: {0x0002, 8}, // "00000010" - 30: {0x0003, 8}, // "00000011" - 31: {0x001a, 8}, // "00011010" - 32: {0x001b, 8}, // "00011011" - 33: {0x0012, 8}, // "00010010" - 34: {0x0013, 8}, // "00010011" - 35: {0x0014, 8}, // "00010100" - 36: {0x0015, 8}, // "00010101" - 37: {0x0016, 8}, // "00010110" - 38: {0x0017, 8}, // "00010111" - 39: {0x0028, 8}, // "00101000" - 40: {0x0029, 8}, // "00101001" - 41: {0x002a, 8}, // "00101010" - 42: {0x002b, 8}, // "00101011" - 43: {0x002c, 8}, // "00101100" - 44: {0x002d, 8}, // "00101101" - 45: {0x0004, 8}, // "00000100" - 46: {0x0005, 8}, // "00000101" - 47: {0x000a, 8}, // "00001010" - 48: {0x000b, 8}, // "00001011" - 49: {0x0052, 8}, // "01010010" - 50: {0x0053, 8}, // "01010011" - 51: {0x0054, 8}, // "01010100" - 52: {0x0055, 8}, // "01010101" - 53: {0x0024, 8}, // "00100100" - 54: {0x0025, 8}, // "00100101" - 55: {0x0058, 8}, // "01011000" - 56: {0x0059, 8}, // "01011001" - 57: {0x005a, 8}, // "01011010" - 58: {0x005b, 8}, // "01011011" - 59: {0x004a, 8}, // "01001010" - 60: {0x004b, 8}, // "01001011" - 61: {0x0032, 8}, // "00110010" - 62: {0x0033, 8}, // "00110011" - 63: {0x0034, 8}, // "00110100" -} - -// whiteEncodeTable3 represents Table 3 for a white run. -var whiteEncodeTable3 = [...]bitString{ - 0: {0x001b, 5}, // "11011" - 1: {0x0012, 5}, // "10010" - 2: {0x0017, 6}, // "010111" - 3: {0x0037, 7}, // "0110111" - 4: {0x0036, 8}, // "00110110" - 5: {0x0037, 8}, // "00110111" - 6: {0x0064, 8}, // "01100100" - 7: {0x0065, 8}, // "01100101" - 8: {0x0068, 8}, // "01101000" - 9: {0x0067, 8}, // "01100111" - 10: {0x00cc, 9}, // "011001100" - 11: {0x00cd, 9}, // "011001101" - 12: {0x00d2, 9}, // "011010010" - 13: {0x00d3, 9}, // "011010011" - 14: {0x00d4, 9}, // "011010100" - 15: {0x00d5, 9}, // "011010101" - 16: {0x00d6, 9}, // "011010110" - 17: {0x00d7, 9}, // "011010111" - 18: {0x00d8, 9}, // "011011000" - 19: {0x00d9, 9}, // "011011001" - 20: {0x00da, 9}, // "011011010" - 21: {0x00db, 9}, // "011011011" - 22: {0x0098, 9}, // "010011000" - 23: {0x0099, 9}, // "010011001" - 24: {0x009a, 9}, // "010011010" - 25: {0x0018, 6}, // "011000" - 26: {0x009b, 9}, // "010011011" - 27: {0x0008, 11}, // "00000001000" - 28: {0x000c, 11}, // "00000001100" - 29: {0x000d, 11}, // "00000001101" - 30: {0x0012, 12}, // "000000010010" - 31: {0x0013, 12}, // "000000010011" - 32: {0x0014, 12}, // "000000010100" - 33: {0x0015, 12}, // "000000010101" - 34: {0x0016, 12}, // "000000010110" - 35: {0x0017, 12}, // "000000010111" - 36: {0x001c, 12}, // "000000011100" - 37: {0x001d, 12}, // "000000011101" - 38: {0x001e, 12}, // "000000011110" - 39: {0x001f, 12}, // "000000011111" -} - -// blackEncodeTable2 represents Table 2 for a black run. -var blackEncodeTable2 = [...]bitString{ - 0: {0x0037, 10}, // "0000110111" - 1: {0x0002, 3}, // "010" - 2: {0x0003, 2}, // "11" - 3: {0x0002, 2}, // "10" - 4: {0x0003, 3}, // "011" - 5: {0x0003, 4}, // "0011" - 6: {0x0002, 4}, // "0010" - 7: {0x0003, 5}, // "00011" - 8: {0x0005, 6}, // "000101" - 9: {0x0004, 6}, // "000100" - 10: {0x0004, 7}, // "0000100" - 11: {0x0005, 7}, // "0000101" - 12: {0x0007, 7}, // "0000111" - 13: {0x0004, 8}, // "00000100" - 14: {0x0007, 8}, // "00000111" - 15: {0x0018, 9}, // "000011000" - 16: {0x0017, 10}, // "0000010111" - 17: {0x0018, 10}, // "0000011000" - 18: {0x0008, 10}, // "0000001000" - 19: {0x0067, 11}, // "00001100111" - 20: {0x0068, 11}, // "00001101000" - 21: {0x006c, 11}, // "00001101100" - 22: {0x0037, 11}, // "00000110111" - 23: {0x0028, 11}, // "00000101000" - 24: {0x0017, 11}, // "00000010111" - 25: {0x0018, 11}, // "00000011000" - 26: {0x00ca, 12}, // "000011001010" - 27: {0x00cb, 12}, // "000011001011" - 28: {0x00cc, 12}, // "000011001100" - 29: {0x00cd, 12}, // "000011001101" - 30: {0x0068, 12}, // "000001101000" - 31: {0x0069, 12}, // "000001101001" - 32: {0x006a, 12}, // "000001101010" - 33: {0x006b, 12}, // "000001101011" - 34: {0x00d2, 12}, // "000011010010" - 35: {0x00d3, 12}, // "000011010011" - 36: {0x00d4, 12}, // "000011010100" - 37: {0x00d5, 12}, // "000011010101" - 38: {0x00d6, 12}, // "000011010110" - 39: {0x00d7, 12}, // "000011010111" - 40: {0x006c, 12}, // "000001101100" - 41: {0x006d, 12}, // "000001101101" - 42: {0x00da, 12}, // "000011011010" - 43: {0x00db, 12}, // "000011011011" - 44: {0x0054, 12}, // "000001010100" - 45: {0x0055, 12}, // "000001010101" - 46: {0x0056, 12}, // "000001010110" - 47: {0x0057, 12}, // "000001010111" - 48: {0x0064, 12}, // "000001100100" - 49: {0x0065, 12}, // "000001100101" - 50: {0x0052, 12}, // "000001010010" - 51: {0x0053, 12}, // "000001010011" - 52: {0x0024, 12}, // "000000100100" - 53: {0x0037, 12}, // "000000110111" - 54: {0x0038, 12}, // "000000111000" - 55: {0x0027, 12}, // "000000100111" - 56: {0x0028, 12}, // "000000101000" - 57: {0x0058, 12}, // "000001011000" - 58: {0x0059, 12}, // "000001011001" - 59: {0x002b, 12}, // "000000101011" - 60: {0x002c, 12}, // "000000101100" - 61: {0x005a, 12}, // "000001011010" - 62: {0x0066, 12}, // "000001100110" - 63: {0x0067, 12}, // "000001100111" -} - -// blackEncodeTable3 represents Table 3 for a black run. -var blackEncodeTable3 = [...]bitString{ - 0: {0x000f, 10}, // "0000001111" - 1: {0x00c8, 12}, // "000011001000" - 2: {0x00c9, 12}, // "000011001001" - 3: {0x005b, 12}, // "000001011011" - 4: {0x0033, 12}, // "000000110011" - 5: {0x0034, 12}, // "000000110100" - 6: {0x0035, 12}, // "000000110101" - 7: {0x006c, 13}, // "0000001101100" - 8: {0x006d, 13}, // "0000001101101" - 9: {0x004a, 13}, // "0000001001010" - 10: {0x004b, 13}, // "0000001001011" - 11: {0x004c, 13}, // "0000001001100" - 12: {0x004d, 13}, // "0000001001101" - 13: {0x0072, 13}, // "0000001110010" - 14: {0x0073, 13}, // "0000001110011" - 15: {0x0074, 13}, // "0000001110100" - 16: {0x0075, 13}, // "0000001110101" - 17: {0x0076, 13}, // "0000001110110" - 18: {0x0077, 13}, // "0000001110111" - 19: {0x0052, 13}, // "0000001010010" - 20: {0x0053, 13}, // "0000001010011" - 21: {0x0054, 13}, // "0000001010100" - 22: {0x0055, 13}, // "0000001010101" - 23: {0x005a, 13}, // "0000001011010" - 24: {0x005b, 13}, // "0000001011011" - 25: {0x0064, 13}, // "0000001100100" - 26: {0x0065, 13}, // "0000001100101" - 27: {0x0008, 11}, // "00000001000" - 28: {0x000c, 11}, // "00000001100" - 29: {0x000d, 11}, // "00000001101" - 30: {0x0012, 12}, // "000000010010" - 31: {0x0013, 12}, // "000000010011" - 32: {0x0014, 12}, // "000000010100" - 33: {0x0015, 12}, // "000000010101" - 34: {0x0016, 12}, // "000000010110" - 35: {0x0017, 12}, // "000000010111" - 36: {0x001c, 12}, // "000000011100" - 37: {0x001d, 12}, // "000000011101" - 38: {0x001e, 12}, // "000000011110" - 39: {0x001f, 12}, // "000000011111" -} - -// COPY PASTE table.go BEGIN - -const ( - modePass = iota // Pass - modeH // Horizontal - modeV0 // Vertical-0 - modeVR1 // Vertical-Right-1 - modeVR2 // Vertical-Right-2 - modeVR3 // Vertical-Right-3 - modeVL1 // Vertical-Left-1 - modeVL2 // Vertical-Left-2 - modeVL3 // Vertical-Left-3 - modeExt // Extension -) - -// COPY PASTE table.go END diff --git a/vendor/golang.org/x/image/ccitt/writer.go b/vendor/golang.org/x/image/ccitt/writer.go deleted file mode 100644 index 87130ab04d..0000000000 --- a/vendor/golang.org/x/image/ccitt/writer.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ccitt - -import ( - "encoding/binary" - "io" -) - -type bitWriter struct { - w io.Writer - - // order is whether to process w's bytes LSB first or MSB first. - order Order - - // The high nBits bits of the bits field hold encoded bits to be written to w. - bits uint64 - nBits uint32 - - // bytes[:bw] holds encoded bytes not yet written to w. - // Overflow protection is ensured by using a multiple of 8 as bytes length. - bw uint32 - bytes [1024]uint8 -} - -// flushBits copies 64 bits from b.bits to b.bytes. If b.bytes is then full, it -// is written to b.w. -func (b *bitWriter) flushBits() error { - binary.BigEndian.PutUint64(b.bytes[b.bw:], b.bits) - b.bits = 0 - b.nBits = 0 - b.bw += 8 - if b.bw < uint32(len(b.bytes)) { - return nil - } - b.bw = 0 - if b.order != MSB { - reverseBitsWithinBytes(b.bytes[:]) - } - _, err := b.w.Write(b.bytes[:]) - return err -} - -// close finalizes a bitcode stream by writing any -// pending bits to bitWriter's underlying io.Writer. -func (b *bitWriter) close() error { - // Write any encoded bits to bytes. - if b.nBits > 0 { - binary.BigEndian.PutUint64(b.bytes[b.bw:], b.bits) - b.bw += (b.nBits + 7) >> 3 - } - - if b.order != MSB { - reverseBitsWithinBytes(b.bytes[:b.bw]) - } - - // Write b.bw bytes to b.w. - _, err := b.w.Write(b.bytes[:b.bw]) - return err -} - -// alignToByteBoundary rounds b.nBits up to a multiple of 8. -// If all 64 bits are used, flush them to bitWriter's bytes. -func (b *bitWriter) alignToByteBoundary() error { - if b.nBits = (b.nBits + 7) &^ 7; b.nBits == 64 { - return b.flushBits() - } - return nil -} - -// writeCode writes a variable length bitcode to b's underlying io.Writer. -func (b *bitWriter) writeCode(bs bitString) error { - bits := bs.bits - nBits := bs.nBits - if 64-b.nBits >= nBits { - // b.bits has sufficient room for storing nBits bits. - b.bits |= uint64(bits) << (64 - nBits - b.nBits) - b.nBits += nBits - if b.nBits == 64 { - return b.flushBits() - } - return nil - } - - // Number of leading bits that fill b.bits. - i := 64 - b.nBits - - // Fill b.bits then flush and write remaining bits. - b.bits |= uint64(bits) >> (nBits - i) - b.nBits = 64 - - if err := b.flushBits(); err != nil { - return err - } - - nBits -= i - b.bits = uint64(bits) << (64 - nBits) - b.nBits = nBits - return nil -} diff --git a/vendor/golang.org/x/image/tiff/buffer.go b/vendor/golang.org/x/image/tiff/buffer.go deleted file mode 100644 index d1801be48e..0000000000 --- a/vendor/golang.org/x/image/tiff/buffer.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tiff - -import "io" - -// buffer buffers an io.Reader to satisfy io.ReaderAt. -type buffer struct { - r io.Reader - buf []byte -} - -// fill reads data from b.r until the buffer contains at least end bytes. -func (b *buffer) fill(end int) error { - m := len(b.buf) - if end > m { - if end > cap(b.buf) { - newcap := 1024 - for newcap < end { - newcap *= 2 - } - newbuf := make([]byte, end, newcap) - copy(newbuf, b.buf) - b.buf = newbuf - } else { - b.buf = b.buf[:end] - } - if n, err := io.ReadFull(b.r, b.buf[m:end]); err != nil { - end = m + n - b.buf = b.buf[:end] - return err - } - } - return nil -} - -func (b *buffer) ReadAt(p []byte, off int64) (int, error) { - o := int(off) - end := o + len(p) - if int64(end) != off+int64(len(p)) { - return 0, io.ErrUnexpectedEOF - } - - err := b.fill(end) - return copy(p, b.buf[o:end]), err -} - -// Slice returns a slice of the underlying buffer. The slice contains -// n bytes starting at offset off. -func (b *buffer) Slice(off, n int) ([]byte, error) { - end := off + n - if err := b.fill(end); err != nil { - return nil, err - } - return b.buf[off:end], nil -} - -// newReaderAt converts an io.Reader into an io.ReaderAt. -func newReaderAt(r io.Reader) io.ReaderAt { - if ra, ok := r.(io.ReaderAt); ok { - return ra - } - return &buffer{ - r: r, - buf: make([]byte, 0, 1024), - } -} diff --git a/vendor/golang.org/x/image/tiff/compress.go b/vendor/golang.org/x/image/tiff/compress.go deleted file mode 100644 index 3f176f00a9..0000000000 --- a/vendor/golang.org/x/image/tiff/compress.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tiff - -import ( - "bufio" - "io" -) - -type byteReader interface { - io.Reader - io.ByteReader -} - -// unpackBits decodes the PackBits-compressed data in src and returns the -// uncompressed data. -// -// The PackBits compression format is described in section 9 (p. 42) -// of the TIFF spec. -func unpackBits(r io.Reader) ([]byte, error) { - buf := make([]byte, 128) - dst := make([]byte, 0, 1024) - br, ok := r.(byteReader) - if !ok { - br = bufio.NewReader(r) - } - - for { - b, err := br.ReadByte() - if err != nil { - if err == io.EOF { - return dst, nil - } - return nil, err - } - code := int(int8(b)) - switch { - case code >= 0: - n, err := io.ReadFull(br, buf[:code+1]) - if err != nil { - return nil, err - } - dst = append(dst, buf[:n]...) - case code == -128: - // No-op. - default: - if b, err = br.ReadByte(); err != nil { - return nil, err - } - for j := 0; j < 1-code; j++ { - buf[j] = b - } - dst = append(dst, buf[:1-code]...) - } - } -} diff --git a/vendor/golang.org/x/image/tiff/consts.go b/vendor/golang.org/x/image/tiff/consts.go deleted file mode 100644 index 3e5f7f14df..0000000000 --- a/vendor/golang.org/x/image/tiff/consts.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tiff - -// A tiff image file contains one or more images. The metadata -// of each image is contained in an Image File Directory (IFD), -// which contains entries of 12 bytes each and is described -// on page 14-16 of the specification. An IFD entry consists of -// -// - a tag, which describes the signification of the entry, -// - the data type and length of the entry, -// - the data itself or a pointer to it if it is more than 4 bytes. -// -// The presence of a length means that each IFD is effectively an array. - -const ( - leHeader = "II\x2A\x00" // Header for little-endian files. - beHeader = "MM\x00\x2A" // Header for big-endian files. - - ifdLen = 12 // Length of an IFD entry in bytes. -) - -// Data types (p. 14-16 of the spec). -const ( - dtByte = 1 - dtASCII = 2 - dtShort = 3 - dtLong = 4 - dtRational = 5 -) - -// The length of one instance of each data type in bytes. -var lengths = [...]uint32{0, 1, 1, 2, 4, 8} - -// Tags (see p. 28-41 of the spec). -const ( - tImageWidth = 256 - tImageLength = 257 - tBitsPerSample = 258 - tCompression = 259 - tPhotometricInterpretation = 262 - - tFillOrder = 266 - - tStripOffsets = 273 - tSamplesPerPixel = 277 - tRowsPerStrip = 278 - tStripByteCounts = 279 - - tT4Options = 292 // CCITT Group 3 options, a set of 32 flag bits. - tT6Options = 293 // CCITT Group 4 options, a set of 32 flag bits. - - tTileWidth = 322 - tTileLength = 323 - tTileOffsets = 324 - tTileByteCounts = 325 - - tXResolution = 282 - tYResolution = 283 - tResolutionUnit = 296 - - tPredictor = 317 - tColorMap = 320 - tExtraSamples = 338 - tSampleFormat = 339 -) - -// Compression types (defined in various places in the spec and supplements). -const ( - cNone = 1 - cCCITT = 2 - cG3 = 3 // Group 3 Fax. - cG4 = 4 // Group 4 Fax. - cLZW = 5 - cJPEGOld = 6 // Superseded by cJPEG. - cJPEG = 7 - cDeflate = 8 // zlib compression. - cPackBits = 32773 - cDeflateOld = 32946 // Superseded by cDeflate. -) - -// Photometric interpretation values (see p. 37 of the spec). -const ( - pWhiteIsZero = 0 - pBlackIsZero = 1 - pRGB = 2 - pPaletted = 3 - pTransMask = 4 // transparency mask - pCMYK = 5 - pYCbCr = 6 - pCIELab = 8 -) - -// Values for the tPredictor tag (page 64-65 of the spec). -const ( - prNone = 1 - prHorizontal = 2 -) - -// Values for the tResolutionUnit tag (page 18). -const ( - resNone = 1 - resPerInch = 2 // Dots per inch. - resPerCM = 3 // Dots per centimeter. -) - -// imageMode represents the mode of the image. -type imageMode int - -const ( - mBilevel imageMode = iota - mPaletted - mGray - mGrayInvert - mRGB - mRGBA - mNRGBA - mCMYK -) - -// CompressionType describes the type of compression used in Options. -type CompressionType int - -// Constants for supported compression types. -const ( - Uncompressed CompressionType = iota - Deflate - LZW - CCITTGroup3 - CCITTGroup4 -) - -// specValue returns the compression type constant from the TIFF spec that -// is equivalent to c. -func (c CompressionType) specValue() uint32 { - switch c { - case LZW: - return cLZW - case Deflate: - return cDeflate - case CCITTGroup3: - return cG3 - case CCITTGroup4: - return cG4 - } - return cNone -} diff --git a/vendor/golang.org/x/image/tiff/fuzz.go b/vendor/golang.org/x/image/tiff/fuzz.go deleted file mode 100644 index b27c540048..0000000000 --- a/vendor/golang.org/x/image/tiff/fuzz.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build gofuzz -// +build gofuzz - -package tiff - -import "bytes" - -func Fuzz(data []byte) int { - cfg, err := DecodeConfig(bytes.NewReader(data)) - if err != nil { - return 0 - } - if cfg.Width*cfg.Height > 1e6 { - return 0 - } - img, err := Decode(bytes.NewReader(data)) - if err != nil { - return 0 - } - var w bytes.Buffer - err = Encode(&w, img, nil) - if err != nil { - panic(err) - } - return 1 -} diff --git a/vendor/golang.org/x/image/tiff/lzw/reader.go b/vendor/golang.org/x/image/tiff/lzw/reader.go deleted file mode 100644 index 78204ba92d..0000000000 --- a/vendor/golang.org/x/image/tiff/lzw/reader.go +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package lzw implements the Lempel-Ziv-Welch compressed data format, -// described in T. A. Welch, ``A Technique for High-Performance Data -// Compression'', Computer, 17(6) (June 1984), pp 8-19. -// -// In particular, it implements LZW as used by the TIFF file format, including -// an "off by one" algorithmic difference when compared to standard LZW. -package lzw // import "golang.org/x/image/tiff/lzw" - -/* -This file was branched from src/pkg/compress/lzw/reader.go in the -standard library. Differences from the original are marked with "NOTE". - -The tif_lzw.c file in the libtiff C library has this comment: - ----- -The 5.0 spec describes a different algorithm than Aldus -implements. Specifically, Aldus does code length transitions -one code earlier than should be done (for real LZW). -Earlier versions of this library implemented the correct -LZW algorithm, but emitted codes in a bit order opposite -to the TIFF spec. Thus, to maintain compatibility w/ Aldus -we interpret MSB-LSB ordered codes to be images written w/ -old versions of this library, but otherwise adhere to the -Aldus "off by one" algorithm. ----- - -The Go code doesn't read (invalid) TIFF files written by old versions of -libtiff, but the LZW algorithm in this package still differs from the one in -Go's standard package library to accomodate this "off by one" in valid TIFFs. -*/ - -import ( - "bufio" - "errors" - "fmt" - "io" -) - -// Order specifies the bit ordering in an LZW data stream. -type Order int - -const ( - // LSB means Least Significant Bits first, as used in the GIF file format. - LSB Order = iota - // MSB means Most Significant Bits first, as used in the TIFF and PDF - // file formats. - MSB -) - -const ( - maxWidth = 12 - decoderInvalidCode = 0xffff - flushBuffer = 1 << maxWidth -) - -// decoder is the state from which the readXxx method converts a byte -// stream into a code stream. -type decoder struct { - r io.ByteReader - bits uint32 - nBits uint - width uint - read func(*decoder) (uint16, error) // readLSB or readMSB - litWidth int // width in bits of literal codes - err error - - // The first 1<= 1<>= d.width - d.nBits -= d.width - return code, nil -} - -// readMSB returns the next code for "Most Significant Bits first" data. -func (d *decoder) readMSB() (uint16, error) { - for d.nBits < d.width { - x, err := d.r.ReadByte() - if err != nil { - return 0, err - } - d.bits |= uint32(x) << (24 - d.nBits) - d.nBits += 8 - } - code := uint16(d.bits >> (32 - d.width)) - d.bits <<= d.width - d.nBits -= d.width - return code, nil -} - -func (d *decoder) Read(b []byte) (int, error) { - for { - if len(d.toRead) > 0 { - n := copy(b, d.toRead) - d.toRead = d.toRead[n:] - return n, nil - } - if d.err != nil { - return 0, d.err - } - d.decode() - } -} - -// decode decompresses bytes from r and leaves them in d.toRead. -// read specifies how to decode bytes into codes. -// litWidth is the width in bits of literal codes. -func (d *decoder) decode() { - // Loop over the code stream, converting codes into decompressed bytes. -loop: - for { - code, err := d.read(d) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - d.err = err - break - } - switch { - case code < d.clear: - // We have a literal code. - d.output[d.o] = uint8(code) - d.o++ - if d.last != decoderInvalidCode { - // Save what the hi code expands to. - d.suffix[d.hi] = uint8(code) - d.prefix[d.hi] = d.last - } - case code == d.clear: - d.width = 1 + uint(d.litWidth) - d.hi = d.eof - d.overflow = 1 << d.width - d.last = decoderInvalidCode - continue - case code == d.eof: - d.err = io.EOF - break loop - case code <= d.hi: - c, i := code, len(d.output)-1 - if code == d.hi && d.last != decoderInvalidCode { - // code == hi is a special case which expands to the last expansion - // followed by the head of the last expansion. To find the head, we walk - // the prefix chain until we find a literal code. - c = d.last - for c >= d.clear { - c = d.prefix[c] - } - d.output[i] = uint8(c) - i-- - c = d.last - } - // Copy the suffix chain into output and then write that to w. - for c >= d.clear { - d.output[i] = d.suffix[c] - i-- - c = d.prefix[c] - } - d.output[i] = uint8(c) - d.o += copy(d.output[d.o:], d.output[i:]) - if d.last != decoderInvalidCode { - // Save what the hi code expands to. - d.suffix[d.hi] = uint8(c) - d.prefix[d.hi] = d.last - } - default: - d.err = errors.New("lzw: invalid code") - break loop - } - d.last, d.hi = code, d.hi+1 - if d.hi+1 >= d.overflow { // NOTE: the "+1" is where TIFF's LZW differs from the standard algorithm. - if d.width == maxWidth { - d.last = decoderInvalidCode - } else { - d.width++ - d.overflow <<= 1 - } - } - if d.o >= flushBuffer { - break - } - } - // Flush pending output. - d.toRead = d.output[:d.o] - d.o = 0 -} - -var errClosed = errors.New("lzw: reader/writer is closed") - -func (d *decoder) Close() error { - d.err = errClosed // in case any Reads come along - return nil -} - -// NewReader creates a new io.ReadCloser. -// Reads from the returned io.ReadCloser read and decompress data from r. -// If r does not also implement io.ByteReader, -// the decompressor may read more data than necessary from r. -// It is the caller's responsibility to call Close on the ReadCloser when -// finished reading. -// The number of bits to use for literal codes, litWidth, must be in the -// range [2,8] and is typically 8. It must equal the litWidth -// used during compression. -func NewReader(r io.Reader, order Order, litWidth int) io.ReadCloser { - d := new(decoder) - switch order { - case LSB: - d.read = (*decoder).readLSB - case MSB: - d.read = (*decoder).readMSB - default: - d.err = errors.New("lzw: unknown order") - return d - } - if litWidth < 2 || 8 < litWidth { - d.err = fmt.Errorf("lzw: litWidth %d out of range", litWidth) - return d - } - if br, ok := r.(io.ByteReader); ok { - d.r = br - } else { - d.r = bufio.NewReader(r) - } - d.litWidth = litWidth - d.width = 1 + uint(litWidth) - d.clear = uint16(1) << uint(litWidth) - d.eof, d.hi = d.clear+1, d.clear+1 - d.overflow = uint16(1) << d.width - d.last = decoderInvalidCode - - return d -} diff --git a/vendor/golang.org/x/image/tiff/reader.go b/vendor/golang.org/x/image/tiff/reader.go deleted file mode 100644 index de73f4b996..0000000000 --- a/vendor/golang.org/x/image/tiff/reader.go +++ /dev/null @@ -1,709 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tiff implements a TIFF image decoder and encoder. -// -// The TIFF specification is at http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf -package tiff // import "golang.org/x/image/tiff" - -import ( - "compress/zlib" - "encoding/binary" - "fmt" - "image" - "image/color" - "io" - "io/ioutil" - "math" - - "golang.org/x/image/ccitt" - "golang.org/x/image/tiff/lzw" -) - -// A FormatError reports that the input is not a valid TIFF image. -type FormatError string - -func (e FormatError) Error() string { - return "tiff: invalid format: " + string(e) -} - -// An UnsupportedError reports that the input uses a valid but -// unimplemented feature. -type UnsupportedError string - -func (e UnsupportedError) Error() string { - return "tiff: unsupported feature: " + string(e) -} - -var errNoPixels = FormatError("not enough pixel data") - -type decoder struct { - r io.ReaderAt - byteOrder binary.ByteOrder - config image.Config - mode imageMode - bpp uint - features map[int][]uint - palette []color.Color - - buf []byte - off int // Current offset in buf. - v uint32 // Buffer value for reading with arbitrary bit depths. - nbits uint // Remaining number of bits in v. -} - -// firstVal returns the first uint of the features entry with the given tag, -// or 0 if the tag does not exist. -func (d *decoder) firstVal(tag int) uint { - f := d.features[tag] - if len(f) == 0 { - return 0 - } - return f[0] -} - -// ifdUint decodes the IFD entry in p, which must be of the Byte, Short -// or Long type, and returns the decoded uint values. -func (d *decoder) ifdUint(p []byte) (u []uint, err error) { - var raw []byte - if len(p) < ifdLen { - return nil, FormatError("bad IFD entry") - } - - datatype := d.byteOrder.Uint16(p[2:4]) - if dt := int(datatype); dt <= 0 || dt >= len(lengths) { - return nil, UnsupportedError("IFD entry datatype") - } - - count := d.byteOrder.Uint32(p[4:8]) - if count > math.MaxInt32/lengths[datatype] { - return nil, FormatError("IFD data too large") - } - if datalen := lengths[datatype] * count; datalen > 4 { - // The IFD contains a pointer to the real value. - raw = make([]byte, datalen) - _, err = d.r.ReadAt(raw, int64(d.byteOrder.Uint32(p[8:12]))) - } else { - raw = p[8 : 8+datalen] - } - if err != nil { - return nil, err - } - - u = make([]uint, count) - switch datatype { - case dtByte: - for i := uint32(0); i < count; i++ { - u[i] = uint(raw[i]) - } - case dtShort: - for i := uint32(0); i < count; i++ { - u[i] = uint(d.byteOrder.Uint16(raw[2*i : 2*(i+1)])) - } - case dtLong: - for i := uint32(0); i < count; i++ { - u[i] = uint(d.byteOrder.Uint32(raw[4*i : 4*(i+1)])) - } - default: - return nil, UnsupportedError("data type") - } - return u, nil -} - -// parseIFD decides whether the IFD entry in p is "interesting" and -// stows away the data in the decoder. It returns the tag number of the -// entry and an error, if any. -func (d *decoder) parseIFD(p []byte) (int, error) { - tag := d.byteOrder.Uint16(p[0:2]) - switch tag { - case tBitsPerSample, - tExtraSamples, - tPhotometricInterpretation, - tCompression, - tPredictor, - tStripOffsets, - tStripByteCounts, - tRowsPerStrip, - tTileWidth, - tTileLength, - tTileOffsets, - tTileByteCounts, - tImageLength, - tImageWidth, - tFillOrder, - tT4Options, - tT6Options: - val, err := d.ifdUint(p) - if err != nil { - return 0, err - } - d.features[int(tag)] = val - case tColorMap: - val, err := d.ifdUint(p) - if err != nil { - return 0, err - } - numcolors := len(val) / 3 - if len(val)%3 != 0 || numcolors <= 0 || numcolors > 256 { - return 0, FormatError("bad ColorMap length") - } - d.palette = make([]color.Color, numcolors) - for i := 0; i < numcolors; i++ { - d.palette[i] = color.RGBA64{ - uint16(val[i]), - uint16(val[i+numcolors]), - uint16(val[i+2*numcolors]), - 0xffff, - } - } - case tSampleFormat: - // Page 27 of the spec: If the SampleFormat is present and - // the value is not 1 [= unsigned integer data], a Baseline - // TIFF reader that cannot handle the SampleFormat value - // must terminate the import process gracefully. - val, err := d.ifdUint(p) - if err != nil { - return 0, err - } - for _, v := range val { - if v != 1 { - return 0, UnsupportedError("sample format") - } - } - } - return int(tag), nil -} - -// readBits reads n bits from the internal buffer starting at the current offset. -func (d *decoder) readBits(n uint) (v uint32, ok bool) { - for d.nbits < n { - d.v <<= 8 - if d.off >= len(d.buf) { - return 0, false - } - d.v |= uint32(d.buf[d.off]) - d.off++ - d.nbits += 8 - } - d.nbits -= n - rv := d.v >> d.nbits - d.v &^= rv << d.nbits - return rv, true -} - -// flushBits discards the unread bits in the buffer used by readBits. -// It is used at the end of a line. -func (d *decoder) flushBits() { - d.v = 0 - d.nbits = 0 -} - -// minInt returns the smaller of x or y. -func minInt(a, b int) int { - if a <= b { - return a - } - return b -} - -// decode decodes the raw data of an image. -// It reads from d.buf and writes the strip or tile into dst. -func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error { - d.off = 0 - - // Apply horizontal predictor if necessary. - // In this case, p contains the color difference to the preceding pixel. - // See page 64-65 of the spec. - if d.firstVal(tPredictor) == prHorizontal { - switch d.bpp { - case 16: - var off int - n := 2 * len(d.features[tBitsPerSample]) // bytes per sample times samples per pixel - for y := ymin; y < ymax; y++ { - off += n - for x := 0; x < (xmax-xmin-1)*n; x += 2 { - if off+2 > len(d.buf) { - return errNoPixels - } - v0 := d.byteOrder.Uint16(d.buf[off-n : off-n+2]) - v1 := d.byteOrder.Uint16(d.buf[off : off+2]) - d.byteOrder.PutUint16(d.buf[off:off+2], v1+v0) - off += 2 - } - } - case 8: - var off int - n := 1 * len(d.features[tBitsPerSample]) // bytes per sample times samples per pixel - for y := ymin; y < ymax; y++ { - off += n - for x := 0; x < (xmax-xmin-1)*n; x++ { - if off >= len(d.buf) { - return errNoPixels - } - d.buf[off] += d.buf[off-n] - off++ - } - } - case 1: - return UnsupportedError("horizontal predictor with 1 BitsPerSample") - } - } - - rMaxX := minInt(xmax, dst.Bounds().Max.X) - rMaxY := minInt(ymax, dst.Bounds().Max.Y) - switch d.mode { - case mGray, mGrayInvert: - if d.bpp == 16 { - img := dst.(*image.Gray16) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - if d.off+2 > len(d.buf) { - return errNoPixels - } - v := d.byteOrder.Uint16(d.buf[d.off : d.off+2]) - d.off += 2 - if d.mode == mGrayInvert { - v = 0xffff - v - } - img.SetGray16(x, y, color.Gray16{v}) - } - if rMaxX == img.Bounds().Max.X { - d.off += 2 * (xmax - img.Bounds().Max.X) - } - } - } else { - img := dst.(*image.Gray) - max := uint32((1 << d.bpp) - 1) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - v, ok := d.readBits(d.bpp) - if !ok { - return errNoPixels - } - v = v * 0xff / max - if d.mode == mGrayInvert { - v = 0xff - v - } - img.SetGray(x, y, color.Gray{uint8(v)}) - } - d.flushBits() - } - } - case mPaletted: - img := dst.(*image.Paletted) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - v, ok := d.readBits(d.bpp) - if !ok { - return errNoPixels - } - img.SetColorIndex(x, y, uint8(v)) - } - d.flushBits() - } - case mRGB: - if d.bpp == 16 { - img := dst.(*image.RGBA64) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - if d.off+6 > len(d.buf) { - return errNoPixels - } - r := d.byteOrder.Uint16(d.buf[d.off+0 : d.off+2]) - g := d.byteOrder.Uint16(d.buf[d.off+2 : d.off+4]) - b := d.byteOrder.Uint16(d.buf[d.off+4 : d.off+6]) - d.off += 6 - img.SetRGBA64(x, y, color.RGBA64{r, g, b, 0xffff}) - } - } - } else { - img := dst.(*image.RGBA) - for y := ymin; y < rMaxY; y++ { - min := img.PixOffset(xmin, y) - max := img.PixOffset(rMaxX, y) - off := (y - ymin) * (xmax - xmin) * 3 - for i := min; i < max; i += 4 { - if off+3 > len(d.buf) { - return errNoPixels - } - img.Pix[i+0] = d.buf[off+0] - img.Pix[i+1] = d.buf[off+1] - img.Pix[i+2] = d.buf[off+2] - img.Pix[i+3] = 0xff - off += 3 - } - } - } - case mNRGBA: - if d.bpp == 16 { - img := dst.(*image.NRGBA64) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - if d.off+8 > len(d.buf) { - return errNoPixels - } - r := d.byteOrder.Uint16(d.buf[d.off+0 : d.off+2]) - g := d.byteOrder.Uint16(d.buf[d.off+2 : d.off+4]) - b := d.byteOrder.Uint16(d.buf[d.off+4 : d.off+6]) - a := d.byteOrder.Uint16(d.buf[d.off+6 : d.off+8]) - d.off += 8 - img.SetNRGBA64(x, y, color.NRGBA64{r, g, b, a}) - } - } - } else { - img := dst.(*image.NRGBA) - for y := ymin; y < rMaxY; y++ { - min := img.PixOffset(xmin, y) - max := img.PixOffset(rMaxX, y) - i0, i1 := (y-ymin)*(xmax-xmin)*4, (y-ymin+1)*(xmax-xmin)*4 - if i1 > len(d.buf) { - return errNoPixels - } - copy(img.Pix[min:max], d.buf[i0:i1]) - } - } - case mRGBA: - if d.bpp == 16 { - img := dst.(*image.RGBA64) - for y := ymin; y < rMaxY; y++ { - for x := xmin; x < rMaxX; x++ { - if d.off+8 > len(d.buf) { - return errNoPixels - } - r := d.byteOrder.Uint16(d.buf[d.off+0 : d.off+2]) - g := d.byteOrder.Uint16(d.buf[d.off+2 : d.off+4]) - b := d.byteOrder.Uint16(d.buf[d.off+4 : d.off+6]) - a := d.byteOrder.Uint16(d.buf[d.off+6 : d.off+8]) - d.off += 8 - img.SetRGBA64(x, y, color.RGBA64{r, g, b, a}) - } - } - } else { - img := dst.(*image.RGBA) - for y := ymin; y < rMaxY; y++ { - min := img.PixOffset(xmin, y) - max := img.PixOffset(rMaxX, y) - i0, i1 := (y-ymin)*(xmax-xmin)*4, (y-ymin+1)*(xmax-xmin)*4 - if i1 > len(d.buf) { - return errNoPixels - } - copy(img.Pix[min:max], d.buf[i0:i1]) - } - } - } - - return nil -} - -func newDecoder(r io.Reader) (*decoder, error) { - d := &decoder{ - r: newReaderAt(r), - features: make(map[int][]uint), - } - - p := make([]byte, 8) - if _, err := d.r.ReadAt(p, 0); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return nil, err - } - switch string(p[0:4]) { - case leHeader: - d.byteOrder = binary.LittleEndian - case beHeader: - d.byteOrder = binary.BigEndian - default: - return nil, FormatError("malformed header") - } - - ifdOffset := int64(d.byteOrder.Uint32(p[4:8])) - - // The first two bytes contain the number of entries (12 bytes each). - if _, err := d.r.ReadAt(p[0:2], ifdOffset); err != nil { - return nil, err - } - numItems := int(d.byteOrder.Uint16(p[0:2])) - - // All IFD entries are read in one chunk. - p = make([]byte, ifdLen*numItems) - if _, err := d.r.ReadAt(p, ifdOffset+2); err != nil { - return nil, err - } - - prevTag := -1 - for i := 0; i < len(p); i += ifdLen { - tag, err := d.parseIFD(p[i : i+ifdLen]) - if err != nil { - return nil, err - } - if tag <= prevTag { - return nil, FormatError("tags are not sorted in ascending order") - } - prevTag = tag - } - - d.config.Width = int(d.firstVal(tImageWidth)) - d.config.Height = int(d.firstVal(tImageLength)) - - if _, ok := d.features[tBitsPerSample]; !ok { - // Default is 1 per specification. - d.features[tBitsPerSample] = []uint{1} - } - d.bpp = d.firstVal(tBitsPerSample) - switch d.bpp { - case 0: - return nil, FormatError("BitsPerSample must not be 0") - case 1, 8, 16: - // Nothing to do, these are accepted by this implementation. - default: - return nil, UnsupportedError(fmt.Sprintf("BitsPerSample of %v", d.bpp)) - } - - // Determine the image mode. - switch d.firstVal(tPhotometricInterpretation) { - case pRGB: - if d.bpp == 16 { - for _, b := range d.features[tBitsPerSample] { - if b != 16 { - return nil, FormatError("wrong number of samples for 16bit RGB") - } - } - } else { - for _, b := range d.features[tBitsPerSample] { - if b != 8 { - return nil, FormatError("wrong number of samples for 8bit RGB") - } - } - } - // RGB images normally have 3 samples per pixel. - // If there are more, ExtraSamples (p. 31-32 of the spec) - // gives their meaning (usually an alpha channel). - // - // This implementation does not support extra samples - // of an unspecified type. - switch len(d.features[tBitsPerSample]) { - case 3: - d.mode = mRGB - if d.bpp == 16 { - d.config.ColorModel = color.RGBA64Model - } else { - d.config.ColorModel = color.RGBAModel - } - case 4: - switch d.firstVal(tExtraSamples) { - case 1: - d.mode = mRGBA - if d.bpp == 16 { - d.config.ColorModel = color.RGBA64Model - } else { - d.config.ColorModel = color.RGBAModel - } - case 2: - d.mode = mNRGBA - if d.bpp == 16 { - d.config.ColorModel = color.NRGBA64Model - } else { - d.config.ColorModel = color.NRGBAModel - } - default: - return nil, FormatError("wrong number of samples for RGB") - } - default: - return nil, FormatError("wrong number of samples for RGB") - } - case pPaletted: - d.mode = mPaletted - d.config.ColorModel = color.Palette(d.palette) - case pWhiteIsZero: - d.mode = mGrayInvert - if d.bpp == 16 { - d.config.ColorModel = color.Gray16Model - } else { - d.config.ColorModel = color.GrayModel - } - case pBlackIsZero: - d.mode = mGray - if d.bpp == 16 { - d.config.ColorModel = color.Gray16Model - } else { - d.config.ColorModel = color.GrayModel - } - default: - return nil, UnsupportedError("color model") - } - - return d, nil -} - -// DecodeConfig returns the color model and dimensions of a TIFF image without -// decoding the entire image. -func DecodeConfig(r io.Reader) (image.Config, error) { - d, err := newDecoder(r) - if err != nil { - return image.Config{}, err - } - return d.config, nil -} - -func ccittFillOrder(tiffFillOrder uint) ccitt.Order { - if tiffFillOrder == 2 { - return ccitt.LSB - } - return ccitt.MSB -} - -// Decode reads a TIFF image from r and returns it as an image.Image. -// The type of Image returned depends on the contents of the TIFF. -func Decode(r io.Reader) (img image.Image, err error) { - d, err := newDecoder(r) - if err != nil { - return - } - - blockPadding := false - blockWidth := d.config.Width - blockHeight := d.config.Height - blocksAcross := 1 - blocksDown := 1 - - if d.config.Width == 0 { - blocksAcross = 0 - } - if d.config.Height == 0 { - blocksDown = 0 - } - - var blockOffsets, blockCounts []uint - - if int(d.firstVal(tTileWidth)) != 0 { - blockPadding = true - - blockWidth = int(d.firstVal(tTileWidth)) - blockHeight = int(d.firstVal(tTileLength)) - - if blockWidth != 0 { - blocksAcross = (d.config.Width + blockWidth - 1) / blockWidth - } - if blockHeight != 0 { - blocksDown = (d.config.Height + blockHeight - 1) / blockHeight - } - - blockCounts = d.features[tTileByteCounts] - blockOffsets = d.features[tTileOffsets] - - } else { - if int(d.firstVal(tRowsPerStrip)) != 0 { - blockHeight = int(d.firstVal(tRowsPerStrip)) - } - - if blockHeight != 0 { - blocksDown = (d.config.Height + blockHeight - 1) / blockHeight - } - - blockOffsets = d.features[tStripOffsets] - blockCounts = d.features[tStripByteCounts] - } - - // Check if we have the right number of strips/tiles, offsets and counts. - if n := blocksAcross * blocksDown; len(blockOffsets) < n || len(blockCounts) < n { - return nil, FormatError("inconsistent header") - } - - imgRect := image.Rect(0, 0, d.config.Width, d.config.Height) - switch d.mode { - case mGray, mGrayInvert: - if d.bpp == 16 { - img = image.NewGray16(imgRect) - } else { - img = image.NewGray(imgRect) - } - case mPaletted: - img = image.NewPaletted(imgRect, d.palette) - case mNRGBA: - if d.bpp == 16 { - img = image.NewNRGBA64(imgRect) - } else { - img = image.NewNRGBA(imgRect) - } - case mRGB, mRGBA: - if d.bpp == 16 { - img = image.NewRGBA64(imgRect) - } else { - img = image.NewRGBA(imgRect) - } - } - - for i := 0; i < blocksAcross; i++ { - blkW := blockWidth - if !blockPadding && i == blocksAcross-1 && d.config.Width%blockWidth != 0 { - blkW = d.config.Width % blockWidth - } - for j := 0; j < blocksDown; j++ { - blkH := blockHeight - if !blockPadding && j == blocksDown-1 && d.config.Height%blockHeight != 0 { - blkH = d.config.Height % blockHeight - } - offset := int64(blockOffsets[j*blocksAcross+i]) - n := int64(blockCounts[j*blocksAcross+i]) - switch d.firstVal(tCompression) { - - // According to the spec, Compression does not have a default value, - // but some tools interpret a missing Compression value as none so we do - // the same. - case cNone, 0: - if b, ok := d.r.(*buffer); ok { - d.buf, err = b.Slice(int(offset), int(n)) - } else { - d.buf = make([]byte, n) - _, err = d.r.ReadAt(d.buf, offset) - } - case cG3: - inv := d.firstVal(tPhotometricInterpretation) == pWhiteIsZero - order := ccittFillOrder(d.firstVal(tFillOrder)) - r := ccitt.NewReader(io.NewSectionReader(d.r, offset, n), order, ccitt.Group3, blkW, blkH, &ccitt.Options{Invert: inv, Align: false}) - d.buf, err = ioutil.ReadAll(r) - case cG4: - inv := d.firstVal(tPhotometricInterpretation) == pWhiteIsZero - order := ccittFillOrder(d.firstVal(tFillOrder)) - r := ccitt.NewReader(io.NewSectionReader(d.r, offset, n), order, ccitt.Group4, blkW, blkH, &ccitt.Options{Invert: inv, Align: false}) - d.buf, err = ioutil.ReadAll(r) - case cLZW: - r := lzw.NewReader(io.NewSectionReader(d.r, offset, n), lzw.MSB, 8) - d.buf, err = ioutil.ReadAll(r) - r.Close() - case cDeflate, cDeflateOld: - var r io.ReadCloser - r, err = zlib.NewReader(io.NewSectionReader(d.r, offset, n)) - if err != nil { - return nil, err - } - d.buf, err = ioutil.ReadAll(r) - r.Close() - case cPackBits: - d.buf, err = unpackBits(io.NewSectionReader(d.r, offset, n)) - default: - err = UnsupportedError(fmt.Sprintf("compression value %d", d.firstVal(tCompression))) - } - if err != nil { - return nil, err - } - - xmin := i * blockWidth - ymin := j * blockHeight - xmax := xmin + blkW - ymax := ymin + blkH - err = d.decode(img, xmin, ymin, xmax, ymax) - if err != nil { - return nil, err - } - } - } - return -} - -func init() { - image.RegisterFormat("tiff", leHeader, Decode, DecodeConfig) - image.RegisterFormat("tiff", beHeader, Decode, DecodeConfig) -} diff --git a/vendor/golang.org/x/image/tiff/writer.go b/vendor/golang.org/x/image/tiff/writer.go deleted file mode 100644 index c8a01cea71..0000000000 --- a/vendor/golang.org/x/image/tiff/writer.go +++ /dev/null @@ -1,438 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tiff - -import ( - "bytes" - "compress/zlib" - "encoding/binary" - "image" - "io" - "sort" -) - -// The TIFF format allows to choose the order of the different elements freely. -// The basic structure of a TIFF file written by this package is: -// -// 1. Header (8 bytes). -// 2. Image data. -// 3. Image File Directory (IFD). -// 4. "Pointer area" for larger entries in the IFD. - -// We only write little-endian TIFF files. -var enc = binary.LittleEndian - -// An ifdEntry is a single entry in an Image File Directory. -// A value of type dtRational is composed of two 32-bit values, -// thus data contains two uints (numerator and denominator) for a single number. -type ifdEntry struct { - tag int - datatype int - data []uint32 -} - -func (e ifdEntry) putData(p []byte) { - for _, d := range e.data { - switch e.datatype { - case dtByte, dtASCII: - p[0] = byte(d) - p = p[1:] - case dtShort: - enc.PutUint16(p, uint16(d)) - p = p[2:] - case dtLong, dtRational: - enc.PutUint32(p, uint32(d)) - p = p[4:] - } - } -} - -type byTag []ifdEntry - -func (d byTag) Len() int { return len(d) } -func (d byTag) Less(i, j int) bool { return d[i].tag < d[j].tag } -func (d byTag) Swap(i, j int) { d[i], d[j] = d[j], d[i] } - -func encodeGray(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { - if !predictor { - return writePix(w, pix, dy, dx, stride) - } - buf := make([]byte, dx) - for y := 0; y < dy; y++ { - min := y*stride + 0 - max := y*stride + dx - off := 0 - var v0 uint8 - for i := min; i < max; i++ { - v1 := pix[i] - buf[off] = v1 - v0 - v0 = v1 - off++ - } - if _, err := w.Write(buf); err != nil { - return err - } - } - return nil -} - -func encodeGray16(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { - buf := make([]byte, dx*2) - for y := 0; y < dy; y++ { - min := y*stride + 0 - max := y*stride + dx*2 - off := 0 - var v0 uint16 - for i := min; i < max; i += 2 { - // An image.Gray16's Pix is in big-endian order. - v1 := uint16(pix[i])<<8 | uint16(pix[i+1]) - if predictor { - v0, v1 = v1, v1-v0 - } - // We only write little-endian TIFF files. - buf[off+0] = byte(v1) - buf[off+1] = byte(v1 >> 8) - off += 2 - } - if _, err := w.Write(buf); err != nil { - return err - } - } - return nil -} - -func encodeRGBA(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { - if !predictor { - return writePix(w, pix, dy, dx*4, stride) - } - buf := make([]byte, dx*4) - for y := 0; y < dy; y++ { - min := y*stride + 0 - max := y*stride + dx*4 - off := 0 - var r0, g0, b0, a0 uint8 - for i := min; i < max; i += 4 { - r1, g1, b1, a1 := pix[i+0], pix[i+1], pix[i+2], pix[i+3] - buf[off+0] = r1 - r0 - buf[off+1] = g1 - g0 - buf[off+2] = b1 - b0 - buf[off+3] = a1 - a0 - off += 4 - r0, g0, b0, a0 = r1, g1, b1, a1 - } - if _, err := w.Write(buf); err != nil { - return err - } - } - return nil -} - -func encodeRGBA64(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { - buf := make([]byte, dx*8) - for y := 0; y < dy; y++ { - min := y*stride + 0 - max := y*stride + dx*8 - off := 0 - var r0, g0, b0, a0 uint16 - for i := min; i < max; i += 8 { - // An image.RGBA64's Pix is in big-endian order. - r1 := uint16(pix[i+0])<<8 | uint16(pix[i+1]) - g1 := uint16(pix[i+2])<<8 | uint16(pix[i+3]) - b1 := uint16(pix[i+4])<<8 | uint16(pix[i+5]) - a1 := uint16(pix[i+6])<<8 | uint16(pix[i+7]) - if predictor { - r0, r1 = r1, r1-r0 - g0, g1 = g1, g1-g0 - b0, b1 = b1, b1-b0 - a0, a1 = a1, a1-a0 - } - // We only write little-endian TIFF files. - buf[off+0] = byte(r1) - buf[off+1] = byte(r1 >> 8) - buf[off+2] = byte(g1) - buf[off+3] = byte(g1 >> 8) - buf[off+4] = byte(b1) - buf[off+5] = byte(b1 >> 8) - buf[off+6] = byte(a1) - buf[off+7] = byte(a1 >> 8) - off += 8 - } - if _, err := w.Write(buf); err != nil { - return err - } - } - return nil -} - -func encode(w io.Writer, m image.Image, predictor bool) error { - bounds := m.Bounds() - buf := make([]byte, 4*bounds.Dx()) - for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - off := 0 - if predictor { - var r0, g0, b0, a0 uint8 - for x := bounds.Min.X; x < bounds.Max.X; x++ { - r, g, b, a := m.At(x, y).RGBA() - r1 := uint8(r >> 8) - g1 := uint8(g >> 8) - b1 := uint8(b >> 8) - a1 := uint8(a >> 8) - buf[off+0] = r1 - r0 - buf[off+1] = g1 - g0 - buf[off+2] = b1 - b0 - buf[off+3] = a1 - a0 - off += 4 - r0, g0, b0, a0 = r1, g1, b1, a1 - } - } else { - for x := bounds.Min.X; x < bounds.Max.X; x++ { - r, g, b, a := m.At(x, y).RGBA() - buf[off+0] = uint8(r >> 8) - buf[off+1] = uint8(g >> 8) - buf[off+2] = uint8(b >> 8) - buf[off+3] = uint8(a >> 8) - off += 4 - } - } - if _, err := w.Write(buf); err != nil { - return err - } - } - return nil -} - -// writePix writes the internal byte array of an image to w. It is less general -// but much faster then encode. writePix is used when pix directly -// corresponds to one of the TIFF image types. -func writePix(w io.Writer, pix []byte, nrows, length, stride int) error { - if length == stride { - _, err := w.Write(pix[:nrows*length]) - return err - } - for ; nrows > 0; nrows-- { - if _, err := w.Write(pix[:length]); err != nil { - return err - } - pix = pix[stride:] - } - return nil -} - -func writeIFD(w io.Writer, ifdOffset int, d []ifdEntry) error { - var buf [ifdLen]byte - // Make space for "pointer area" containing IFD entry data - // longer than 4 bytes. - parea := make([]byte, 1024) - pstart := ifdOffset + ifdLen*len(d) + 6 - var o int // Current offset in parea. - - // The IFD has to be written with the tags in ascending order. - sort.Sort(byTag(d)) - - // Write the number of entries in this IFD. - if err := binary.Write(w, enc, uint16(len(d))); err != nil { - return err - } - for _, ent := range d { - enc.PutUint16(buf[0:2], uint16(ent.tag)) - enc.PutUint16(buf[2:4], uint16(ent.datatype)) - count := uint32(len(ent.data)) - if ent.datatype == dtRational { - count /= 2 - } - enc.PutUint32(buf[4:8], count) - datalen := int(count * lengths[ent.datatype]) - if datalen <= 4 { - ent.putData(buf[8:12]) - } else { - if (o + datalen) > len(parea) { - newlen := len(parea) + 1024 - for (o + datalen) > newlen { - newlen += 1024 - } - newarea := make([]byte, newlen) - copy(newarea, parea) - parea = newarea - } - ent.putData(parea[o : o+datalen]) - enc.PutUint32(buf[8:12], uint32(pstart+o)) - o += datalen - } - if _, err := w.Write(buf[:]); err != nil { - return err - } - } - // The IFD ends with the offset of the next IFD in the file, - // or zero if it is the last one (page 14). - if err := binary.Write(w, enc, uint32(0)); err != nil { - return err - } - _, err := w.Write(parea[:o]) - return err -} - -// Options are the encoding parameters. -type Options struct { - // Compression is the type of compression used. - Compression CompressionType - // Predictor determines whether a differencing predictor is used; - // if true, instead of each pixel's color, the color difference to the - // preceding one is saved. This improves the compression for certain - // types of images and compressors. For example, it works well for - // photos with Deflate compression. - Predictor bool -} - -// Encode writes the image m to w. opt determines the options used for -// encoding, such as the compression type. If opt is nil, an uncompressed -// image is written. -func Encode(w io.Writer, m image.Image, opt *Options) error { - d := m.Bounds().Size() - - compression := uint32(cNone) - predictor := false - if opt != nil { - compression = opt.Compression.specValue() - // The predictor field is only used with LZW. See page 64 of the spec. - predictor = opt.Predictor && compression == cLZW - } - - _, err := io.WriteString(w, leHeader) - if err != nil { - return err - } - - // Compressed data is written into a buffer first, so that we - // know the compressed size. - var buf bytes.Buffer - // dst holds the destination for the pixel data of the image -- - // either w or a writer to buf. - var dst io.Writer - // imageLen is the length of the pixel data in bytes. - // The offset of the IFD is imageLen + 8 header bytes. - var imageLen int - - switch compression { - case cNone: - dst = w - // Write IFD offset before outputting pixel data. - switch m.(type) { - case *image.Paletted: - imageLen = d.X * d.Y * 1 - case *image.Gray: - imageLen = d.X * d.Y * 1 - case *image.Gray16: - imageLen = d.X * d.Y * 2 - case *image.RGBA64: - imageLen = d.X * d.Y * 8 - case *image.NRGBA64: - imageLen = d.X * d.Y * 8 - default: - imageLen = d.X * d.Y * 4 - } - err = binary.Write(w, enc, uint32(imageLen+8)) - if err != nil { - return err - } - case cDeflate: - dst = zlib.NewWriter(&buf) - } - - pr := uint32(prNone) - photometricInterpretation := uint32(pRGB) - samplesPerPixel := uint32(4) - bitsPerSample := []uint32{8, 8, 8, 8} - extraSamples := uint32(0) - colorMap := []uint32{} - - if predictor { - pr = prHorizontal - } - switch m := m.(type) { - case *image.Paletted: - photometricInterpretation = pPaletted - samplesPerPixel = 1 - bitsPerSample = []uint32{8} - colorMap = make([]uint32, 256*3) - for i := 0; i < 256 && i < len(m.Palette); i++ { - r, g, b, _ := m.Palette[i].RGBA() - colorMap[i+0*256] = uint32(r) - colorMap[i+1*256] = uint32(g) - colorMap[i+2*256] = uint32(b) - } - err = encodeGray(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.Gray: - photometricInterpretation = pBlackIsZero - samplesPerPixel = 1 - bitsPerSample = []uint32{8} - err = encodeGray(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.Gray16: - photometricInterpretation = pBlackIsZero - samplesPerPixel = 1 - bitsPerSample = []uint32{16} - err = encodeGray16(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.NRGBA: - extraSamples = 2 // Unassociated alpha. - err = encodeRGBA(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.NRGBA64: - extraSamples = 2 // Unassociated alpha. - bitsPerSample = []uint32{16, 16, 16, 16} - err = encodeRGBA64(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.RGBA: - extraSamples = 1 // Associated alpha. - err = encodeRGBA(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - case *image.RGBA64: - extraSamples = 1 // Associated alpha. - bitsPerSample = []uint32{16, 16, 16, 16} - err = encodeRGBA64(dst, m.Pix, d.X, d.Y, m.Stride, predictor) - default: - extraSamples = 1 // Associated alpha. - err = encode(dst, m, predictor) - } - if err != nil { - return err - } - - if compression != cNone { - if err = dst.(io.Closer).Close(); err != nil { - return err - } - imageLen = buf.Len() - if err = binary.Write(w, enc, uint32(imageLen+8)); err != nil { - return err - } - if _, err = buf.WriteTo(w); err != nil { - return err - } - } - - ifd := []ifdEntry{ - {tImageWidth, dtShort, []uint32{uint32(d.X)}}, - {tImageLength, dtShort, []uint32{uint32(d.Y)}}, - {tBitsPerSample, dtShort, bitsPerSample}, - {tCompression, dtShort, []uint32{compression}}, - {tPhotometricInterpretation, dtShort, []uint32{photometricInterpretation}}, - {tStripOffsets, dtLong, []uint32{8}}, - {tSamplesPerPixel, dtShort, []uint32{samplesPerPixel}}, - {tRowsPerStrip, dtShort, []uint32{uint32(d.Y)}}, - {tStripByteCounts, dtLong, []uint32{uint32(imageLen)}}, - // There is currently no support for storing the image - // resolution, so give a bogus value of 72x72 dpi. - {tXResolution, dtRational, []uint32{72, 1}}, - {tYResolution, dtRational, []uint32{72, 1}}, - {tResolutionUnit, dtShort, []uint32{resPerInch}}, - } - if pr != prNone { - ifd = append(ifd, ifdEntry{tPredictor, dtShort, []uint32{pr}}) - } - if len(colorMap) != 0 { - ifd = append(ifd, ifdEntry{tColorMap, dtShort, colorMap}) - } - if extraSamples > 0 { - ifd = append(ifd, ifdEntry{tExtraSamples, dtShort, []uint32{extraSamples}}) - } - - return writeIFD(w, imageLen+8, ifd) -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 9f60395f77..5094fb19a7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -261,11 +261,6 @@ golang.org/x/crypto/ssh/terminal golang.org/x/crypto/tea golang.org/x/crypto/twofish golang.org/x/crypto/xtea -# golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d -## explicit -golang.org/x/image/ccitt -golang.org/x/image/tiff -golang.org/x/image/tiff/lzw # golang.org/x/mod v0.4.2 golang.org/x/mod/semver # golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 @@ -292,6 +287,7 @@ golang.org/x/sys/windows/registry ## explicit golang.org/x/term # golang.org/x/text v0.3.6 +## explicit golang.org/x/text/transform golang.org/x/text/unicode/norm # golang.org/x/tools v0.1.2