// GetSnapshotCustom runs asynchronously, taking a snapshot of the WebView. // Upon completion, resultCallback will be called with a copy of the underlying // bitmap backing store for the frame, or with an error encountered during // execution. // // See also: webkit_web_view_get_snapshot at // http://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebView.html#webkit-web-view-get-snapshot func (v *WebView) GetSnapshotCustom(region SnapshotRegion, options SnapshotOptions, resultCallback func(result *image.RGBA, err error)) { var cCallback C.GAsyncReadyCallback var userData C.gpointer var err error if resultCallback != nil { callback := func(result *C.GAsyncResult) { var snapErr *C.GError snapResult := C.webkit_web_view_get_snapshot_finish(v.webView, result, &snapErr) if snapResult == nil { defer C.g_error_free(snapErr) msg := C.GoString((*C.char)(snapErr.message)) resultCallback(nil, errors.New(msg)) return } defer C.cairo_surface_destroy(snapResult) if C.cairo_surface_get_type(snapResult) != cairoSurfaceTypeImage || C.cairo_image_surface_get_format(snapResult) != cairoImageSurfaceFormatARGB32 { panic("Snapshot in unexpected format") } w := int(C.cairo_image_surface_get_width(snapResult)) h := int(C.cairo_image_surface_get_height(snapResult)) stride := int(C.cairo_image_surface_get_stride(snapResult)) C.cairo_surface_flush(snapResult) data := unsafe.Pointer(C.cairo_image_surface_get_data(snapResult)) //(miha) fix endianes depended byte order, and copy to go slice at the same time. data_fixed := make([]byte, stride*h) C.gowk2_cairo_endian_depended_ARGB32_to_RGBA((*C.uchar)(data), (*C.uchar)(&data_fixed[0]), C.uint(stride*h)) rgba := &image.RGBA{data_fixed, stride, image.Rect(0, 0, w, h)} // slower but doesn't use Go pointers inside C. See https://github.com/golang/go/issues/8310 !!!!!!! //C.gowk2_cairo_endian_depended_ARGB32_to_RGBA((*C.uchar)(data), C.uint(stride*h)) //rgba := &image.RGBA{C.GoBytes(data, C.int(stride*h)), stride, image.Rect(0, 0, w, h)} resultCallback(rgba, nil) } cCallback, userData, err = newGAsyncReadyCallback(callback) if err != nil { panic(err) } } C.webkit_web_view_get_snapshot(v.webView, (C.WebKitSnapshotRegion)(region), (C.WebKitSnapshotOptions)(options), nil, cCallback, userData) }
func CairoEndianDependedARGB32ToRGBA(data []byte, out []byte) { C.gowk2_cairo_endian_depended_ARGB32_to_RGBA((*C.uchar)(unsafe.Pointer(&data[0])), (*C.uchar)(unsafe.Pointer(&out[0])), (C.uint)(len(data))) }