package chart import ( "bytes" "errors" "image" "image/png" ) // RGBACollector is a render target for a chart. type RGBACollector interface { SetRGBA(i *image.RGBA) } // ImageWriter is a special type of io.Writer that produces a final image. type ImageWriter struct { rgba *image.RGBA contents *bytes.Buffer } func (ir *ImageWriter) Write(buffer []byte) (int, error) { if ir.contents == nil { ir.contents = bytes.NewBuffer([]byte{}) } return ir.contents.Write(buffer) } // SetRGBA sets a raw version of the image. func (ir *ImageWriter) SetRGBA(i *image.RGBA) { ir.rgba = i } // Image returns an *image.Image for the result. func (ir *ImageWriter) Image() (image.Image, error) { if ir.rgba != nil { return ir.rgba, nil } if ir.contents != nil && ir.contents.Len() > 0 { return png.Decode(ir.contents) } return nil, errors.New("no valid sources for image data, cannot continue") }