diff --git a/waveshare2in13v2/drawing.go b/waveshare2in13v2/drawing.go index 7f8f963..ffdbfe9 100644 --- a/waveshare2in13v2/drawing.go +++ b/waveshare2in13v2/drawing.go @@ -73,24 +73,23 @@ func (o *drawOpts) spec() drawSpec { } // sendImage sends an image to the controller after setting up the registers. -// The area is in bytes on the horizontal axis. -func sendImage(ctrl controller, cmd byte, area image.Rectangle, img *image1bit.VerticalLSB) { - if area.Empty() { +func (o *drawOpts) sendImage(ctrl controller, cmd byte, spec *drawSpec) { + if spec.MemRect.Empty() { return } - setMemoryArea(ctrl, area) + setMemoryArea(ctrl, spec.MemRect) ctrl.sendCommand(cmd) - rowData := make([]byte, area.Dx()) + rowData := make([]byte, spec.MemRect.Dx()) - for y := area.Min.Y; y < area.Max.Y; y++ { + for y := spec.MemRect.Min.Y; y < spec.MemRect.Max.Y; y++ { for x := 0; x < len(rowData); x++ { rowData[x] = 0 for bit := 0; bit < 8; bit++ { - if img.BitAt(((area.Min.X+x)*8)+bit, y) { + if o.buffer.BitAt(((spec.MemRect.Min.X+x)*8)+bit, y) { rowData[x] |= 0x80 >> bit } } @@ -117,6 +116,6 @@ func drawImage(ctrl controller, opts *drawOpts) { // Keep the two buffers in sync. for _, cmd := range commands { - sendImage(ctrl, cmd, s.MemRect, opts.buffer) + opts.sendImage(ctrl, cmd, &s) } } diff --git a/waveshare2in13v2/drawing_test.go b/waveshare2in13v2/drawing_test.go index 30feb32..da0051c 100644 --- a/waveshare2in13v2/drawing_test.go +++ b/waveshare2in13v2/drawing_test.go @@ -63,18 +63,23 @@ func TestSendImage(t *testing.T) { for _, tc := range []struct { name string cmd byte - area image.Rectangle - img *image1bit.VerticalLSB + opts drawOpts want []record }{ { name: "empty", + opts: drawOpts{ + buffer: image1bit.NewVerticalLSB(image.Rectangle{}), + }, }, { name: "partial", cmd: writeRAMBW, - area: image.Rect(2, 20, 4, 40), - img: image1bit.NewVerticalLSB(image.Rect(0, 0, 64, 64)), + opts: drawOpts{ + devSize: image.Pt(64, 64), + dstRect: image.Rect(16, 20, 32, 40), + buffer: image1bit.NewVerticalLSB(image.Rect(0, 0, 64, 64)), + }, want: []record{ {cmd: dataEntryModeSetting, data: []byte{0x3}}, {cmd: setRAMXAddressStartEndPosition, data: []byte{2, 4 - 1}}, @@ -90,12 +95,15 @@ func TestSendImage(t *testing.T) { { name: "partial non-aligned", cmd: writeRAMRed, - area: image.Rect(2, 4, 6, 8), - img: func() *image1bit.VerticalLSB { - img := image1bit.NewVerticalLSB(image.Rect(0, 0, 64, 64)) - draw.Src.Draw(img, image.Rect(17, 4, 41, 8), &image.Uniform{image1bit.On}, image.Point{}) - return img - }(), + opts: drawOpts{ + devSize: image.Pt(100, 64), + dstRect: image.Rect(17, 4, 41, 8), + buffer: func() *image1bit.VerticalLSB { + img := image1bit.NewVerticalLSB(image.Rect(0, 0, 64, 64)) + draw.Src.Draw(img, image.Rect(17, 4, 41, 8), &image.Uniform{image1bit.On}, image.Point{}) + return img + }(), + }, want: []record{ {cmd: dataEntryModeSetting, data: []byte{0x3}}, {cmd: setRAMXAddressStartEndPosition, data: []byte{2, 6 - 1}}, @@ -111,12 +119,15 @@ func TestSendImage(t *testing.T) { { name: "full", cmd: writeRAMBW, - area: image.Rect(0, 0, 10, 120), - img: func() *image1bit.VerticalLSB { - img := image1bit.NewVerticalLSB(image.Rect(0, 0, 80, 120)) - draw.Src.Draw(img, image.Rect(0, 0, 80, 120), &image.Uniform{image1bit.On}, image.Point{}) - return img - }(), + opts: drawOpts{ + devSize: image.Pt(80, 120), + dstRect: image.Rect(0, 0, 80, 120), + buffer: func() *image1bit.VerticalLSB { + img := image1bit.NewVerticalLSB(image.Rect(0, 0, 80, 120)) + draw.Src.Draw(img, image.Rect(0, 0, 80, 120), &image.Uniform{image1bit.On}, image.Point{}) + return img + }(), + }, want: []record{ {cmd: dataEntryModeSetting, data: []byte{0x3}}, {cmd: setRAMXAddressStartEndPosition, data: []byte{0, 10 - 1}}, @@ -133,7 +144,9 @@ func TestSendImage(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var got fakeController - sendImage(&got, tc.cmd, tc.area, tc.img) + spec := tc.opts.spec() + + tc.opts.sendImage(&got, tc.cmd, &spec) if diff := cmp.Diff([]record(got), tc.want, cmpopts.EquateEmpty(), cmp.AllowUnexported(record{})); diff != "" { t.Errorf("sendImage() difference (-got +want):\n%s", diff)