//Unmap uploads the content of the image to the target surface. //Afterwards, the image is destroyed. // //Originally cairo_surface_unmap. func (m MappedImageSurface) Unmap() error { err := m.Err() mismux.Lock() defer mismux.Unlock() from := mis[m.id()] C.cairo_surface_unmap_image(from, m.s) m.s = nil return err }
// pdf, ps, and svg surfaces use the current surface (page) func (g *Graphic) Image() (image.Image, error) { var surface *C.cairo_surface_t switch g.format { case "eps", "pdf", "ps", "svg": // map vector surfaces to an image surface surface = C.cairo_surface_map_to_image(g.surface, nil) defer C.cairo_surface_unmap_image(g.surface, surface) status := C.cairo_surface_status(surface) err := statusToError(status) if err != nil { return nil, err } case "png", "jpeg": // no conversion needed surface = g.surface } width := int(C.cairo_image_surface_get_width(surface)) height := int(C.cairo_image_surface_get_height(surface)) stride := int(C.cairo_image_surface_get_stride(surface)) format := C.cairo_image_surface_get_format(surface) dataPtr := C.cairo_image_surface_get_data(surface) data := C.GoBytes(unsafe.Pointer(dataPtr), C.int(stride*height)) var img image.Image switch format { case C.CAIRO_FORMAT_ARGB32: img = &extimage.ARGB{ Pix: data, Stride: stride, Rect: image.Rect(0, 0, width, height), } case C.CAIRO_FORMAT_RGB24: img = &extimage.RGB{ Pix: data, Stride: stride, Rect: image.Rect(0, 0, width, height), } case C.CAIRO_FORMAT_A8: img = &image.Alpha{ Pix: data, Stride: stride, Rect: image.Rect(0, 0, width, height), } default: // known unsupported formats: // CAIRO_FORMAT_INVALID = -1, // CAIRO_FORMAT_A1 = 3, // CAIRO_FORMAT_RGB16_565 = 4, // CAIRO_FORMAT_RGB30 = 5 panic(fmt.Sprintf("unsupported cairo image surface format: %d", int(format))) } return img, nil }