diff options
| -rw-r--r-- | fpdf.go | 183 | 
1 files changed, 0 insertions, 183 deletions
| @@ -2900,189 +2900,6 @@ func (f *Fpdf) readByte(buf *bytes.Buffer) (val byte) {  	return  } -func (f *Fpdf) parsepngstream(buf *bytes.Buffer, readdpi bool) (info *ImageInfoType) { -	info = f.newImageInfo() -	// 	Check signature -	if string(buf.Next(8)) != "\x89PNG\x0d\x0a\x1a\x0a" { -		f.err = fmt.Errorf("not a PNG buffer") -		return -	} -	// Read header chunk -	_ = buf.Next(4) -	if string(buf.Next(4)) != "IHDR" { -		f.err = fmt.Errorf("incorrect PNG buffer") -		return -	} -	w := f.readBeInt32(buf) -	h := f.readBeInt32(buf) -	bpc := f.readByte(buf) -	if bpc > 8 { -		f.err = fmt.Errorf("16-bit depth not supported in PNG file") -	} -	ct := f.readByte(buf) -	var colspace string -	colorVal := 1 -	switch ct { -	case 0, 4: -		colspace = "DeviceGray" -	case 2, 6: -		colspace = "DeviceRGB" -		colorVal = 3 -	case 3: -		colspace = "Indexed" -	default: -		f.err = fmt.Errorf("unknown color type in PNG buffer: %d", ct) -	} -	if f.err != nil { -		return -	} -	if f.readByte(buf) != 0 { -		f.err = fmt.Errorf("'unknown compression method in PNG buffer") -		return -	} -	if f.readByte(buf) != 0 { -		f.err = fmt.Errorf("'unknown filter method in PNG buffer") -		return -	} -	if f.readByte(buf) != 0 { -		f.err = fmt.Errorf("interlacing not supported in PNG buffer") -		return -	} -	_ = buf.Next(4) -	dp := sprintf("/Predictor 15 /Colors %d /BitsPerComponent %d /Columns %d", colorVal, bpc, w) -	// Scan chunks looking for palette, transparency and image data -	pal := make([]byte, 0, 32) -	var trns []int -	data := make([]byte, 0, 32) -	loop := true -	for loop { -		n := int(f.readBeInt32(buf)) -		// dbg("Loop [%d]", n) -		switch string(buf.Next(4)) { -		case "PLTE": -			// dbg("PLTE") -			// Read palette -			pal = buf.Next(n) -			_ = buf.Next(4) -		case "tRNS": -			// dbg("tRNS") -			// Read transparency info -			t := buf.Next(n) -			if ct == 0 { -				trns = []int{int(t[1])} // ord(substr($t,1,1))); -			} else if ct == 2 { -				trns = []int{int(t[1]), int(t[3]), int(t[5])} // array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); -			} else { -				pos := strings.Index(string(t), "\x00") -				if pos >= 0 { -					trns = []int{pos} // array($pos); -				} -			} -			_ = buf.Next(4) -		case "IDAT": -			// dbg("IDAT") -			// Read image data block -			data = append(data, buf.Next(n)...) -			_ = buf.Next(4) -		case "IEND": -			// dbg("IEND") -			loop = false -		case "pHYs": -			// dbg("pHYs") -			// png files theoretically support different x/y dpi -			// but we ignore files like this -			// but if they're the same then we can stamp our info -			// object with it -			x := int(f.readBeInt32(buf)) -			y := int(f.readBeInt32(buf)) -			units := buf.Next(1)[0] -			// fmt.Printf("got a pHYs block, x=%d, y=%d, u=%d, readdpi=%t\n", -			// x, y, int(units), readdpi) -			// only modify the info block if the user wants us to -			if x == y && readdpi { -				switch units { -				// if units is 1 then measurement is px/meter -				case 1: -					info.dpi = float64(x) / 39.3701 // inches per meter -				default: -					info.dpi = float64(x) -				} -			} -			_ = buf.Next(4) -		default: -			// dbg("default") -			_ = buf.Next(n + 4) -		} -		if loop { -			loop = n > 0 -		} -	} -	if colspace == "Indexed" && len(pal) == 0 { -		f.err = fmt.Errorf("missing palette in PNG buffer") -	} -	info.w = float64(w) -	info.h = float64(h) -	info.cs = colspace -	info.bpc = int(bpc) -	info.f = "FlateDecode" -	info.dp = dp -	info.pal = pal -	info.trns = trns -	// dbg("ct [%d]", ct) -	if ct >= 4 { -		// Separate alpha and color channels -		var err error -		data, err = sliceUncompress(data) -		if err != nil { -			f.err = err -			return -		} -		var color, alpha bytes.Buffer -		if ct == 4 { -			// Gray image -			width := int(w) -			height := int(h) -			length := 2 * width -			var pos, elPos int -			for i := 0; i < height; i++ { -				pos = (1 + length) * i -				color.WriteByte(data[pos]) -				alpha.WriteByte(data[pos]) -				elPos = pos + 1 -				for k := 0; k < width; k++ { -					color.WriteByte(data[elPos]) -					alpha.WriteByte(data[elPos+1]) -					elPos += 2 -				} -			} -		} else { -			// RGB image -			width := int(w) -			height := int(h) -			length := 4 * width -			var pos, elPos int -			for i := 0; i < height; i++ { -				pos = (1 + length) * i -				color.WriteByte(data[pos]) -				alpha.WriteByte(data[pos]) -				elPos = pos + 1 -				for k := 0; k < width; k++ { -					color.Write(data[elPos : elPos+3]) -					alpha.WriteByte(data[elPos+3]) -					elPos += 4 -				} -			} -		} -		data = sliceCompress(color.Bytes()) -		info.smask = sliceCompress(alpha.Bytes()) -		if f.pdfVersion < "1.4" { -			f.pdfVersion = "1.4" -		} -	} -	info.data = data -	return -} -  // Extract info from a GIF data (via PNG conversion)  func (f *Fpdf) parsegif(r io.Reader) (info *ImageInfoType) {  	data, err := bufferFromReader(r) | 
