diff --git a/font/opentype/opentype.go b/font/opentype/opentype.go index 8f522be1..b46fdd4f 100644 --- a/font/opentype/opentype.go +++ b/font/opentype/opentype.go @@ -119,7 +119,7 @@ func (f *Font) Layout(ppem fixed.Int26_6, maxWidth int, txt io.Reader) ([]text.L return layoutText(&buf, ppem, maxWidth, fonts, glyphs) } -func (f *Font) Shape(ppem fixed.Int26_6, str text.Layout) op.CallOp { +func (f *Font) Shape(ppem fixed.Int26_6, str text.Layout) clip.Op { var buf sfnt.Buffer return textPath(&buf, ppem, []*opentype{{Font: f.font, Hinting: font.HintingFull}}, str) } @@ -139,7 +139,7 @@ func (c *Collection) Layout(ppem fixed.Int26_6, maxWidth int, txt io.Reader) ([] return layoutText(&buf, ppem, maxWidth, c.fonts, glyphs) } -func (c *Collection) Shape(ppem fixed.Int26_6, str text.Layout) op.CallOp { +func (c *Collection) Shape(ppem fixed.Int26_6, str text.Layout) clip.Op { var buf sfnt.Buffer return textPath(&buf, ppem, c.fonts, str) } @@ -261,11 +261,10 @@ func toLayout(glyphs []glyph) text.Layout { return text.Layout{Text: buf.String(), Advances: advs} } -func textPath(buf *sfnt.Buffer, ppem fixed.Int26_6, fonts []*opentype, str text.Layout) op.CallOp { +func textPath(buf *sfnt.Buffer, ppem fixed.Int26_6, fonts []*opentype, str text.Layout) clip.Op { var lastPos f32.Point var builder clip.Path ops := new(op.Ops) - m := op.Record(ops) var x fixed.Int26_6 builder.Begin(ops) rune := 0 @@ -324,10 +323,9 @@ func textPath(buf *sfnt.Buffer, ppem fixed.Int26_6, fonts []*opentype, str text. x += str.Advances[rune] rune++ } - clip.Outline{ + return clip.Outline{ Path: builder.End(), - }.Op().Add(ops) - return m.Stop() + }.Op() } func readGlyphs(r io.Reader) ([]glyph, error) { diff --git a/font/opentype/opentype_test.go b/font/opentype/opentype_test.go index fd3091de..a58b19e6 100644 --- a/font/opentype/opentype_test.go +++ b/font/opentype/opentype_test.go @@ -17,6 +17,7 @@ import ( "gioui.org/internal/ops" "gioui.org/op" + "gioui.org/op/clip" "gioui.org/text" ) @@ -69,7 +70,7 @@ func TestCollectionAsFace(t *testing.T) { // All shapes from the original fonts should be distinct because the glyphs are distinct, including the replacement // glyphs. - distinctShapes := []op.CallOp{shapeValid1, shapeInvalid1, shapeValid2, shapeInvalid2} + distinctShapes := []clip.Op{shapeValid1, shapeInvalid1, shapeValid2, shapeInvalid2} for i := 0; i < len(distinctShapes); i++ { for j := i + 1; j < len(distinctShapes); j++ { if areShapesEqual(distinctShapes[i], distinctShapes[j]) { @@ -173,20 +174,20 @@ func mergeFonts(ttf1, ttf2 []byte) []byte { } // shapeRune uses a given Face to shape exactly one rune at a fixed size, then returns the resulting shape data. -func shapeRune(f text.Face, r rune) (op.CallOp, error) { +func shapeRune(f text.Face, r rune) (clip.Op, error) { ppem := fixed.I(200) lines, err := f.Layout(ppem, 2000, strings.NewReader(string(r))) if err != nil { - return op.CallOp{}, err + return clip.Op{}, err } if len(lines) != 1 { - return op.CallOp{}, fmt.Errorf("unexpected rendering for \"U+%08X\": got %d lines (expected: 1)", r, len(lines)) + return clip.Op{}, fmt.Errorf("unexpected rendering for \"U+%08X\": got %d lines (expected: 1)", r, len(lines)) } return f.Shape(ppem, lines[0].Layout), nil } // areShapesEqual returns true iff both given text shapes are produced with identical operations. -func areShapesEqual(shape1, shape2 op.CallOp) bool { +func areShapesEqual(shape1, shape2 clip.Op) bool { var ops1, ops2 op.Ops shape1.Add(&ops1) shape2.Add(&ops2) diff --git a/text/lru.go b/text/lru.go index ada028ab..8cc56fc7 100644 --- a/text/lru.go +++ b/text/lru.go @@ -3,9 +3,8 @@ package text import ( + "gioui.org/op/clip" "golang.org/x/image/math/fixed" - - "gioui.org/op" ) type layoutCache struct { @@ -27,7 +26,7 @@ type layoutElem struct { type path struct { next, prev *path key pathKey - val op.CallOp + val clip.Op } type layoutKey struct { @@ -82,16 +81,16 @@ func (l *layoutCache) insert(lt *layoutElem) { lt.next.prev = lt } -func (c *pathCache) Get(k pathKey) (op.CallOp, bool) { +func (c *pathCache) Get(k pathKey) (clip.Op, bool) { if v, ok := c.m[k]; ok { c.remove(v) c.insert(v) return v.val, true } - return op.CallOp{}, false + return clip.Op{}, false } -func (c *pathCache) Put(k pathKey, v op.CallOp) { +func (c *pathCache) Put(k pathKey, v clip.Op) { if c.m == nil { c.m = make(map[pathKey]*path) c.head = new(path) diff --git a/text/lru_test.go b/text/lru_test.go index fa5e50bf..192f6392 100644 --- a/text/lru_test.go +++ b/text/lru_test.go @@ -6,7 +6,7 @@ import ( "strconv" "testing" - "gioui.org/op" + "gioui.org/op/clip" ) func TestLayoutLRU(t *testing.T) { @@ -24,7 +24,7 @@ func TestLayoutLRU(t *testing.T) { func TestPathLRU(t *testing.T) { c := new(pathCache) put := func(i int) { - c.Put(pathKey{str: strconv.Itoa(i)}, op.CallOp{}) + c.Put(pathKey{str: strconv.Itoa(i)}, clip.Op{}) } get := func(i int) bool { _, ok := c.Get(pathKey{str: strconv.Itoa(i)}) diff --git a/text/shaper.go b/text/shaper.go index 92af6fb5..48b08725 100644 --- a/text/shaper.go +++ b/text/shaper.go @@ -8,7 +8,7 @@ import ( "golang.org/x/image/math/fixed" - "gioui.org/op" + "gioui.org/op/clip" ) // Shaper implements layout and shaping of text. @@ -18,7 +18,7 @@ type Shaper interface { // LayoutString is Layout for strings. LayoutString(font Font, size fixed.Int26_6, maxWidth int, str string) []Line // Shape a line of text and return a clipping operation for its outline. - Shape(font Font, size fixed.Int26_6, layout Layout) op.CallOp + Shape(font Font, size fixed.Int26_6, layout Layout) clip.Op } // A FontFace is a Font and a matching Face. @@ -121,7 +121,7 @@ func (c *Cache) LayoutString(font Font, size fixed.Int26_6, maxWidth int, str st // Shape is a caching implementation of the Shaper interface. Shape assumes that the layout // argument is unchanged from a call to Layout or LayoutString. -func (c *Cache) Shape(font Font, size fixed.Int26_6, layout Layout) op.CallOp { +func (c *Cache) Shape(font Font, size fixed.Int26_6, layout Layout) clip.Op { cache := c.lookup(font) return cache.shape(size, layout) } @@ -143,9 +143,9 @@ func (f *faceCache) layout(ppem fixed.Int26_6, maxWidth int, str string) []Line return l } -func (f *faceCache) shape(ppem fixed.Int26_6, layout Layout) op.CallOp { +func (f *faceCache) shape(ppem fixed.Int26_6, layout Layout) clip.Op { if f == nil { - return op.CallOp{} + return clip.Op{} } pk := pathKey{ ppem: ppem, diff --git a/text/text.go b/text/text.go index 978ddb57..935b14d8 100644 --- a/text/text.go +++ b/text/text.go @@ -5,9 +5,8 @@ package text import ( "io" + "gioui.org/op/clip" "golang.org/x/image/math/fixed" - - "gioui.org/op" ) // A Line contains the measurements of a line of text. @@ -49,7 +48,7 @@ type Font struct { // methods must be safe for concurrent use. type Face interface { Layout(ppem fixed.Int26_6, maxWidth int, txt io.Reader) ([]Line, error) - Shape(ppem fixed.Int26_6, str Layout) op.CallOp + Shape(ppem fixed.Int26_6, str Layout) clip.Op } // Typeface identifies a particular typeface design. The empty diff --git a/widget/editor.go b/widget/editor.go index a483ee9d..5239ee4d 100644 --- a/widget/editor.go +++ b/widget/editor.go @@ -180,7 +180,7 @@ type SelectEvent struct{} type line struct { offset image.Point - clip op.CallOp + clip clip.Op selected bool selectionYOffs int selectionSize image.Point