golang skia demo

5-04 701 views

skia build

1. 下载安装 depot_tools

git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
export PATH="${PWD}/depot_tools:${PATH}"

2. clone skia

git clone https://skia.googlesource.com/skia.git
# or
# fetch skia
cd skia
python3 tools/git-sync-deps

3. set env

source "/Users/mustodo/Documents/skia/skia/third_party/externals/emsdk/emsdk_env.sh"
third_party\externals\emsdk\emsdk_env.bat

4. build

darwin

bin/gn gen out/Static --args='
is_official_build=true
is_debug=false
skia_use_system_expat=false
skia_use_system_harfbuzz=false
skia_use_system_icu=false
skia_use_system_libjpeg_turbo=false
skia_use_system_libpng=false
skia_use_system_zlib=false
skia_use_system_libwebp=false'

ninja -C out/Static

linux

bin/gn gen out/Static --args='
is_official_build=true
is_debug=false
skia_use_system_expat=false
skia_use_system_harfbuzz=false
skia_use_system_icu=false
skia_use_system_libjpeg_turbo=false
skia_use_system_libpng=false
skia_use_system_zlib=false
skia_use_system_libwebp=false'

ninja -C out/Static

windows
需要 安装 VisualStudio-2017(140), Windows SDK 10

bin\gn gen out\static --args="is_official_build=true is_debug=false skia_use_system_expat=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_zlib=false skia_use_system_libwebp=false win_sdk=\"D:\Windows Kits\10\" win_vc=\"D:\Program_Files\VisualStudio\2017\Community\VC""

darwin

//+build darwin
package main

/*
#cgo LDFLAGS: -L/Users/mustodo/Documents/skia/skia/out/Static
#cgo LDFLAGS: -lstdc++
#cgo LDFLAGS: -lskia
#cgo LDFLAGS: -framework Cocoa

#cgo CFLAGS: -I/Users/mustodo/Documents/skia/skia
#include "include/c/sk_types.h"
#include "include/c/sk_canvas.h"
#include "include/c/sk_data.h"
#include "include/c/sk_image.h"
#include "include/c/sk_imageinfo.h"
#include "include/c/sk_paint.h"
#include "include/c/sk_path.h"
#include "include/c/sk_surface.h"
*/
import "C"

import (
    "fmt"
    "io/ioutil"
    "unsafe"
)

func main() {
    fmt.Println("hello")

    var info *C.sk_imageinfo_t = C.sk_imageinfo_new(640, 480, C.RGBA_8888_SK_COLORTYPE, C.PREMUL_SK_ALPHATYPE, nil)
    var surface *C.sk_surface_t = C.sk_surface_new_raster(info, nil)
    C.sk_imageinfo_delete(info)
    var canvas *C.sk_canvas_t = C.sk_surface_get_canvas(surface)

    var fill *C.sk_paint_t = C.sk_paint_new()
    C.sk_paint_set_color(fill, 0xFF0000FF)
    C.sk_canvas_draw_paint(canvas, fill)

    C.sk_paint_set_color(fill, 0xFF00FFFF)
    var rect C.sk_rect_t
    rect.left = 100.0
    rect.top = 100.0
    rect.right = 540.0
    rect.bottom = 380.0
    C.sk_canvas_draw_rect(canvas, &rect, fill)

    var stroke *C.sk_paint_t = C.sk_paint_new()
    C.sk_paint_set_color(stroke, 0xFFFF0000)
    C.sk_paint_set_antialias(stroke, true)
    C.sk_paint_set_stroke(stroke, true)
    C.sk_paint_set_stroke_width(stroke, 5.0)

    var path_builder *C.sk_pathbuilder_t = C.sk_pathbuilder_new()
    C.sk_pathbuilder_move_to(path_builder, 50.0, 50.0)
    C.sk_pathbuilder_line_to(path_builder, 590.0, 50.0)
    C.sk_pathbuilder_cubic_to(path_builder, -490.0, 50.0, 1130.0, 430.0, 50.0, 430.0)
    C.sk_pathbuilder_line_to(path_builder, 590.0, 430.0)

    var path *C.sk_path_t = C.sk_pathbuilder_detach_path(path_builder)
    C.sk_canvas_draw_path(canvas, path, stroke)

    C.sk_paint_set_color(fill, 0x8000FF00)
    var rect2 C.sk_rect_t
    rect2.left = 120.0
    rect2.top = 120.0
    rect2.right = 520.0
    rect2.bottom = 360.0
    C.sk_canvas_draw_oval(canvas, &rect2, fill)

    C.sk_pathbuilder_delete(path_builder)
    C.sk_path_delete(path)
    C.sk_paint_delete(stroke)
    C.sk_paint_delete(fill)

    var image *C.sk_image_t = C.sk_surface_new_image_snapshot(surface)
    var data *C.sk_data_t = C.sk_image_encode(image)
    C.sk_image_unref(image)

    fmt.Println("C.sk_data_get_size(data)= %d", C.int(C.sk_data_get_size(data)))

    skdata := C.sk_data_get_data(data)
    godata := C.GoBytes(unsafe.Pointer(skdata), C.int(C.sk_data_get_size(data)))

    err := ioutil.WriteFile("out.png", godata, 0666)
    if err != nil {
        fmt.Printf("文件打开失败=%v\n", err)
    }

    C.sk_data_unref(data)

    C.sk_surface_unref(surface)

}

linux

//+build linux
package main

/*
#cgo LDFLAGS: -L/home/nux/develop/skia/skia/out/Static
#cgo LDFLAGS: -lskia
// #cgo LDFLAGS: -lSDL2 -lGL -lGLU -lX11
#cgo LDFLAGS: -lGL
#cgo LDFLAGS: -lfreetype -lfontconfig
#cgo LDFLAGS: -lm
#cgo LDFLAGS: -lstdc++

#cgo CFLAGS: -I/home/nux/develop/skia/skia
#include "include/c/sk_types.h"
#include "include/c/sk_canvas.h"
#include "include/c/sk_data.h"
#include "include/c/sk_image.h"
#include "include/c/sk_imageinfo.h"
#include "include/c/sk_paint.h"
#include "include/c/sk_path.h"
#include "include/c/sk_surface.h"

*/
import "C"

import (
    "fmt"
    "io/ioutil"
    "unsafe"
)

func main() {
    fmt.Println("hello")

    var info *C.sk_imageinfo_t = C.sk_imageinfo_new(640, 480, C.RGBA_8888_SK_COLORTYPE, C.PREMUL_SK_ALPHATYPE, nil)
    var surface *C.sk_surface_t = C.sk_surface_new_raster(info, nil)
    C.sk_imageinfo_delete(info)
    var canvas *C.sk_canvas_t = C.sk_surface_get_canvas(surface)

    var fill *C.sk_paint_t = C.sk_paint_new()
    C.sk_paint_set_color(fill, 0xFF0000FF)
    C.sk_canvas_draw_paint(canvas, fill)

    C.sk_paint_set_color(fill, 0xFF00FFFF)
    var rect C.sk_rect_t
    rect.left = 100.0
    rect.top = 100.0
    rect.right = 540.0
    rect.bottom = 380.0
    C.sk_canvas_draw_rect(canvas, &rect, fill)

    var stroke *C.sk_paint_t = C.sk_paint_new()
    C.sk_paint_set_color(stroke, 0xFFFF0000)
    C.sk_paint_set_antialias(stroke, true)
    C.sk_paint_set_stroke(stroke, true)
    C.sk_paint_set_stroke_width(stroke, 5.0)

    var path_builder *C.sk_pathbuilder_t = C.sk_pathbuilder_new()
    C.sk_pathbuilder_move_to(path_builder, 50.0, 50.0)
    C.sk_pathbuilder_line_to(path_builder, 590.0, 50.0)
    C.sk_pathbuilder_cubic_to(path_builder, -490.0, 50.0, 1130.0, 430.0, 50.0, 430.0)
    C.sk_pathbuilder_line_to(path_builder, 590.0, 430.0)

    var path *C.sk_path_t = C.sk_pathbuilder_detach_path(path_builder)
    C.sk_canvas_draw_path(canvas, path, stroke)

    C.sk_paint_set_color(fill, 0x8000FF00)
    var rect2 C.sk_rect_t
    rect2.left = 120.0
    rect2.top = 120.0
    rect2.right = 520.0
    rect2.bottom = 360.0
    C.sk_canvas_draw_oval(canvas, &rect2, fill)

    C.sk_pathbuilder_delete(path_builder)
    C.sk_path_delete(path)
    C.sk_paint_delete(stroke)
    C.sk_paint_delete(fill)

    var image *C.sk_image_t = C.sk_surface_new_image_snapshot(surface)
    var data *C.sk_data_t = C.sk_image_encode(image)
    C.sk_image_unref(image)

    fmt.Println("C.sk_data_get_size(data)= %d", C.int(C.sk_data_get_size(data)))

    skdata := C.sk_data_get_data(data)
    godata := C.GoBytes(unsafe.Pointer(skdata), C.int(C.sk_data_get_size(data)))

    err := ioutil.WriteFile("out.png", godata, 0666)
    if err != nil {
        fmt.Printf("文件打开失败=%v\n", err)
    }

    C.sk_data_unref(data)

    C.sk_surface_unref(surface)

}

How can I host my public package on my personal domain?

<blockquote class="reddit-card" > <a href="https://www.reddit.com/r/golang/comments/mn2zsa/how_can_i_host_my_public_package_on_my_pe...

阅读全文

Go 语言编译器的 “//go:” 详解

前言 C 语言的 #include 一上来不太好说明白 Go 语言里 //go: 是什么,我们先来看下非常简单,也是几乎每个写代码的人都知道的东西:C 语言的 #include。 我...

阅读全文

go generate

https://blog.golang.org/generate https://stackoverflow.com/questions/19155038/name-of-a-constant-given-its-value https://godoc.org/golang.org/x/to...

阅读全文

欢迎留言