9fans.net/go@v0.0.7/cmd/acme/internal/wind/scrl.go (about)

     1  // #include <u.h>
     2  // #include <libc.h>
     3  // #include <draw.h>
     4  // #include <thread.h>
     5  // #include <cursor.h>
     6  // #include <mouse.h>
     7  // #include <keyboard.h>
     8  // #include <frame.h>
     9  // #include <fcall.h>
    10  // #include <plumb.h>
    11  // #include <libsec.h>
    12  // #include "dat.h"
    13  // #include "fns.h"
    14  
    15  package wind
    16  
    17  import (
    18  	"9fans.net/go/cmd/acme/internal/adraw"
    19  	"9fans.net/go/cmd/acme/internal/util"
    20  	"9fans.net/go/draw"
    21  	"9fans.net/go/draw/frame"
    22  )
    23  
    24  var scrtmp *draw.Image
    25  
    26  func scrpos(r draw.Rectangle, p0 int, p1 int, tot int) draw.Rectangle {
    27  	q := r
    28  	h := q.Max.Y - q.Min.Y
    29  	if tot == 0 {
    30  		return q
    31  	}
    32  	if tot > 1024*1024 {
    33  		tot >>= 10
    34  		p0 >>= 10
    35  		p1 >>= 10
    36  	}
    37  	if p0 > 0 {
    38  		q.Min.Y += h * p0 / tot
    39  	}
    40  	if p1 < tot {
    41  		q.Max.Y -= h * (tot - p1) / tot
    42  	}
    43  	if q.Max.Y < q.Min.Y+2 {
    44  		if q.Min.Y+2 <= r.Max.Y {
    45  			q.Max.Y = q.Min.Y + 2
    46  		} else {
    47  			q.Min.Y = q.Max.Y - 2
    48  		}
    49  	}
    50  	return q
    51  }
    52  
    53  func Scrlresize() {
    54  	scrtmp.Free()
    55  	var err error
    56  	scrtmp, err = adraw.Display.AllocImage(draw.Rect(0, 0, 32, adraw.Display.ScreenImage.R.Max.Y), adraw.Display.ScreenImage.Pix, false, draw.NoFill)
    57  	if err != nil {
    58  		util.Fatal("scroll alloc")
    59  	}
    60  }
    61  
    62  func Textscrdraw(t *Text) {
    63  	if t.W == nil || t != &t.W.Body {
    64  		return
    65  	}
    66  	if scrtmp == nil {
    67  		Scrlresize()
    68  	}
    69  	r := t.ScrollR
    70  	b := scrtmp
    71  	r1 := r
    72  	r1.Min.X = 0
    73  	r1.Max.X = r.Dx()
    74  	r2 := scrpos(r1, t.Org, t.Org+t.Fr.NumChars, t.Len())
    75  	if !(r2 == t.lastsr) {
    76  		t.lastsr = r2
    77  		b.Draw(r1, t.Fr.Cols[frame.BORD], nil, draw.ZP)
    78  		b.Draw(r2, t.Fr.Cols[frame.BACK], nil, draw.ZP)
    79  		r2.Min.X = r2.Max.X - 1
    80  		b.Draw(r2, t.Fr.Cols[frame.BORD], nil, draw.ZP)
    81  		t.Fr.B.Draw(r, b, nil, draw.Pt(0, r1.Min.Y))
    82  		//flushimage(display, 1); // BUG?
    83  	}
    84  }