[bugfix] Keep png transparency (#1522)

* keep png transparency

* rewrite to switch case
This commit is contained in:
mushus 2023-02-19 00:52:15 +09:00 committed by GitHub
parent 59b2e10787
commit fe66a2aed2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -78,9 +78,29 @@ import (
"io" "io"
) )
// chunkTypeAncillaryBit is whether the first byte of a big-endian uint32 chunk const (
// type (the first of four ASCII letters) is lower-case. chunkTypeIHDR = 0x49484452
const chunkTypeAncillaryBit = 0x20000000 chunkTypePLTE = 0x504C5445
chunkTypeIDAT = 0x49444154
chunkTypeIEND = 0x49454E44
chunkTypeTRNS = 0x74524e53
)
func isNecessaryChunkType(chunkType uint32) bool {
switch chunkType {
case chunkTypeIHDR:
return true
case chunkTypePLTE:
return true
case chunkTypeIDAT:
return true
case chunkTypeIEND:
return true
case chunkTypeTRNS:
return true
}
return false
}
// pngAncillaryChunkStripper wraps another io.Reader to strip ancillary chunks, // pngAncillaryChunkStripper wraps another io.Reader to strip ancillary chunks,
// if the data is in the PNG file format. If the data isn't PNG, it is passed // if the data is in the PNG file format. If the data isn't PNG, it is passed
@ -179,7 +199,7 @@ func (r *pngAncillaryChunkStripper) Read(p []byte) (int, error) {
// byte trailer, a checksum. // byte trailer, a checksum.
r.pending = int64(binary.BigEndian.Uint32(r.buffer[:4])) + 4 r.pending = int64(binary.BigEndian.Uint32(r.buffer[:4])) + 4
chunkType := binary.BigEndian.Uint32(r.buffer[4:]) chunkType := binary.BigEndian.Uint32(r.buffer[4:])
r.discard = (chunkType & chunkTypeAncillaryBit) != 0 r.discard = !isNecessaryChunkType(chunkType)
if r.discard { if r.discard {
r.rIndex = r.wIndex r.rIndex = r.wIndex
} }