From a0293643b318c5e28d8429f0fe1dab02ec521d11 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Mon, 15 Apr 2024 22:12:14 +0200 Subject: [PATCH] ssd1306: add DrawBitmap() function to complete Displayer interface Signed-off-by: deadprogram --- ssd1306/ssd1306.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/ssd1306/ssd1306.go b/ssd1306/ssd1306.go index 53b38ba..fdf168f 100644 --- a/ssd1306/ssd1306.go +++ b/ssd1306/ssd1306.go @@ -11,6 +11,12 @@ import ( "tinygo.org/x/drivers" "tinygo.org/x/drivers/internal/legacy" + "tinygo.org/x/drivers/pixel" +) + +var ( + errBufferSize = errors.New("invalid size buffer") + errOutOfRange = errors.New("out of screen range") ) type ResetValue [2]byte @@ -245,8 +251,7 @@ func (d *Device) GetPixel(x int16, y int16) bool { // SetBuffer changes the whole buffer at once func (d *Device) SetBuffer(buffer []byte) error { if int16(len(buffer)) != d.bufferSize { - //return ErrBuffer - return errors.New("wrong size buffer") + return errBufferSize } for i := int16(0); i < d.bufferSize; i++ { d.buffer[i] = buffer[i] @@ -338,3 +343,19 @@ func (b *SPIBus) tx(data []byte, isCommand bool) error { func (d *Device) Size() (w, h int16) { return d.width, d.height } + +// DrawBitmap copies the bitmap to the screen at the given coordinates. +func (d *Device) DrawBitmap(x, y int16, bitmap pixel.Image[pixel.Monochrome]) error { + width, height := bitmap.Size() + if x < 0 || x+int16(width) > d.width || y < 0 || y+int16(height) > d.height { + return errOutOfRange + } + + for i := 0; i < width; i++ { + for j := 0; j < height; j++ { + d.SetPixel(x+int16(i), y+int16(j), bitmap.Get(i, j).RGBA()) + } + } + + return nil +}