1package main23import (4 "bytes"5 "strings"6 "unsafe"78 "github.com/blampe/goat/ascii"9 "github.com/blampe/goat/svg"10 "github.com/blampe/goat/utf8"11)1213var output []byte14var retainedInputs [][]byte1516// beginRender releases input buffers from the previous request while keeping17// the current request alive until render returns. The host calls this before18// each sequence of alloc calls.19//go:export beginRender20func beginRender() {21 retainedInputs = retainedInputs[:0]22}2324// alloc reserves a buffer for a UTF-8 source string.25//go:export alloc26func alloc(size uint32) uint32 {27 buf := make([]byte, size)28 retainedInputs = append(retainedInputs, buf)29 if len(buf) == 0 {30 return 031 }32 return uint32(uintptr(unsafe.Pointer(&buf[0])))33}3435// render converts the source at sourcePtr into SVG. The color strings are36// passed separately so the Worker can validate them before entering Wasm.37//go:export render38func render(sourcePtr, sourceLen, utf8Flag, lightPtr, lightLen, darkPtr, darkLen uint32) uint32 {39 source := string(unsafe.Slice((*byte)(unsafe.Pointer(uintptr(sourcePtr))), sourceLen))40 light := string(unsafe.Slice((*byte)(unsafe.Pointer(uintptr(lightPtr))), lightLen))41 dark := string(unsafe.Slice((*byte)(unsafe.Pointer(uintptr(darkPtr))), darkLen))4243 var config svg.Config44 var canvas svg.AbstractCanvas45 if utf8Flag != 0 {46 config, _ = svg.NewConfig(utf8.ReservedSet, svg.MarkBindingMap{})47 canvas = utf8.NewCanvas(&config, strings.NewReader(source))48 } else {49 config, _ = svg.NewConfig(ascii.ReservedSet, svg.MarkBindingMap{})50 canvas = ascii.NewCanvas(&config, strings.NewReader(source))51 }5253 var rendered bytes.Buffer54 svg.WriteCanvas(&config, canvas, true, svg.ColorsOnlyCssFileContent(light, dark), nil, &rendered)55 output = append(output[:0], rendered.Bytes()...)56 if len(output) == 0 {57 return 058 }59 return uint32(uintptr(unsafe.Pointer(&output[0])))60}6162// outputLen returns the byte length of the most recent render result.63//go:export outputLen64func outputLen() uint32 { return uint32(len(output)) }6566func main() {}