mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 02:52:26 -05:00 
			
		
		
		
	[bugfix] Keep png transparency (#1522)
* keep png transparency * rewrite to switch case
This commit is contained in:
		
					parent
					
						
							
								59b2e10787
							
						
					
				
			
			
				commit
				
					
						fe66a2aed2
					
				
			
		
					 1 changed files with 24 additions and 4 deletions
				
			
		|  | @ -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 | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue