LinkCareServices / cairotft

python lib for drawing gui on tft screens via framebuffer interface using cairo
BSD 3-Clause "New" or "Revised" License
4 stars 2 forks source link

Doesn't work on virtual framebuffers #2

Open hadess opened 8 years ago

hadess commented 8 years ago

I eventually want to use this on a Raspberry Pi with the new "fbtft" drivers, but I'm currently trying to set up a development environment on my desktop system.

So I created a virtual framebuffer, and set it up to look like my small TFT:

# modprobe vfb vfb_enable=1
# chown `id -u`:`id -u` /dev/fb1
# fbset -fb /dev/fb1 -xres 128 -yres 64 -depth 32

To test that it worked I copied garbage to it: cat /dev/urandom > /dev/fb1 And checked with fbgrab that it did indeed add garbage: fbgrab -d /dev/fb1 foo.png

That worked, I can now clear the framebuffer: cat /dev/zero > /dev/fb1 (checking the result again gives us a black screen)

Now, using this stripped down version of the example:

from cairotft import tft 
import cairocffi

class MyDisplay(tft.TftDisplay):

    def __init__(self):
        super(MyDisplay, self).__init__(interface='/dev/fb1', cairo_format=cairocffi.FORMAT_ARGB32)

    def draw_interface(self, ctx):
        self.blank_screen(ctx=ctx,
                          color=(1.0, 0.0, 0.0, 1.0),
                          blit=True)

if __name__ == '__main__':
    disp = MyDisplay()
    disp.run()

Gives me the attached output, instead of a red screen. Any ideas?

foo

hadess commented 5 years ago

Success :)

foo

hadess commented 5 years ago

Note that my test changed slightly.

I used a 16bpp framebuffer:

fbset -fb /dev/fb1 -xres 128 -yres 64 -depth 16

And changed the format to match:

from cairotft import tft 
import cairocffi

class MyDisplay(tft.TftDisplay):

    def __init__(self):
        super(MyDisplay, self).__init__(interface='/dev/fb1', cairo_format=cairocffi.FORMAT_RGB16_565)

    def draw_interface(self, ctx):
        self.blank_screen(ctx=ctx,
                          color=(1.0, 0.0, 0.0),
                          blit=True)

if __name__ == '__main__':
    disp = MyDisplay()
    disp.run()