github.com/as/frame (go): Package frame provides plan9-like editable text images on a raster display. This implementation preserves NUL bytes, and uses a set of replacement characters for unrenderable text glyphs generated with a smaller sized font (hexadecimal or ascii representation).  A frame's text is not addressable. Once the characters are written to the frame, there is no mechanism to retrieve their position from within the frame. Use a buffer to store text for reading and the range addresses of the frame to access bytes from that buffer.  See github.com/as/ui/win for an example.  A frame is created using the New function  A frame supports these common operations  Frames supports two operations for rendering text: Insert and Delete. Insert inserts text at the given index and moves existing characters after the index to the right. Delete deletes text in the given range (a range is a pair of indices) and moves existing character after the index to the left.  The two operations are inverses of each other.  Insert and delete return the number of characters inserted or deleted.  To delete the last insertion:  To execute a traditional "write" operation:  Frames can translate between coordinates of the mouse and character offsets in the frame itself using IndexOf and PointOf.  Frames support selecting ranges of text along with returning those selected ranges.  A more complicated facility exists for making a live selection. See example/basic for an example of how to use it.  No special operations are needed after a call to Insert, Delete, or Select. The frame's bitmap is updated. However, there are four functions that will redraw the frame on the bitmap if this is necessary.  Recolor(pt image.Point, p0, p1 int64, cols Palette)  Redraw(pt image.Point, p0, p1 int64, issel bool)  RedrawAt(pt image.Point, text, back image.Image)  Refresh()  After any operation that alters the frame, one can be sure that the changes can be written to the frame's bitmap. However, the same can not be said for the exp/shiny window. There currently exists an optimization (see github.com/as/drawcache) that caches rectangles that need to be redrawn to the screen. This is because shiny (or the native drivers for it) are too slow to refresh the entire window is that window's resolution is very high.  This rendering pipeline is bottlenecked, so an optimization is located between the |*|  insert | frame | shiny buffer |*| shiny window
Keywords: box|edit|frame|golang|graphics|libframe|native|plan9|text