我目前有一些使用pycairo绘制的代码,并通过PyGame渲染到SDL表面。这在Linux和Windows上运行良好,但Mac让我感到头痛。一切都是蓝色或粉红色字节顺序似乎是BGRA而不是ARGB,我尝试使用pygame.Surface.set_masks和set_shifts无济于事。这只能在mac(osx 10.6)上打破:
import cairo
import pygame
width = 300
height = 200
pygame.init()
pygame.fastevent.init()
clock = pygame.time.Clock()
sdl_surface = pygame.display.set_mode((width, height))
c_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(c_surface)
while True:
pygame.fastevent.get()
clock.tick(30)
ctx.rectangle(10, 10, 50, 50)
ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0)
ctx.fill_preserve()
dest = pygame.surfarray.pixels2d(sdl_surface)
dest.data[:] = c_surface.get_data()
pygame.display.flip()
我可以使用数组切片或使用PIL修复它,但这会导致我的帧速率下降。有没有办法在现场或设置中执行此操作?
答案 0 :(得分:2)
经过大量的头发撕裂后,我有一个解决方法,只需反转阵列就不会太多损害我的帧速率:
import cairo
import pygame
width = 300
height = 200
pygame.init()
pygame.fastevent.init()
clock = pygame.time.Clock()
sdl_surface = pygame.display.set_mode((width, height))
c_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(c_surface)
while True:
pygame.fastevent.get()
clock.tick(30)
ctx.rectangle(10, 10, 50, 50)
ctx.set_source_rgba(1.0, 0.0, 0.0, 1.0)
ctx.fill_preserve()
dest = pygame.surfarray.pixels2d(sdl_surface)
dest.data[:] = c_surface.get_data()[::-1]
tmp = pygame.transform.flip(sdl_surface, True, True)
sdl_surface.fill((0,0,0)) #workaround to clear the display
del dest #this is needed to unlock the display surface
sdl_surface.blit(tmp, (0,0))
pygame.display.flip()
我必须从临时Surface中删除数组和blit的事实似乎并不正确,但这是翻转显示的唯一方法。如果有人在这里有更清晰的建议,请发表评论。