Author: Lars Wassermann <[email protected]>
Branch:
Changeset: r251:32ca02e56ca2
Date: 2013-04-10 21:26 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/32ca02e56ca2/
Log: refactored sdl connection to avoid double blitting
diff --git a/spyvm/display.py b/spyvm/display.py
--- a/spyvm/display.py
+++ b/spyvm/display.py
@@ -1,6 +1,7 @@
from rpython.rlib.rarithmetic import r_uint
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.runicode import unicode_encode_utf_8
+from rpython.rlib import jit
from rsdl import RSDL, RSDL_helper
@@ -58,26 +59,11 @@
self.depth = d
self.screen = RSDL.SetVideoMode(w, h, 32, 0)
assert self.screen
- # self.fillwhite()
- def set_pixelbuffer(self, pixelbuffer):
- if self.has_surface:
- RSDL.FreeSurface(self.surface)
- pitch = 4 * self.width
- rmask, gmask, bmask, amask = r_uint(0x000000FF), r_uint(0x0000FF00),
r_uint(0x00FF0000), r_uint(0xFF000000)
- self.surface = RSDL.CreateRGBSurfaceFrom(rffi.cast(rffi.VOIDP,
pixelbuffer),
- self.width, self.height, 32,
pitch,
- rmask, gmask, bmask, amask)
- self.has_surface = True
+ def get_pixelbuffer(self):
+ return self.screen.c_pixels
- def fillwhite(self):
- fmt = self.screen.c_format
- color = RSDL.MapRGB(fmt, 255, 255, 255)
- RSDL.FillRect(self.screen, lltype.nullptr(RSDL.Rect), color)
- RSDL.Flip(self.screen)
-
- def blit(self):
- RSDL.BlitSurface(self.surface, lltype.nullptr(RSDL.Rect), self.screen,
lltype.nullptr(RSDL.Rect))
+ def flip(self):
RSDL.Flip(self.screen)
def get_next_event(self):
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -698,14 +698,11 @@
def __init__(self, space, w_class, size, depth, display):
W_AbstractObjectWithClassReference.__init__(self, space, w_class)
- bytelen = NATIVE_DEPTH / depth * size
- self.pixelbuffer = lltype.malloc(rffi.ULONGP.TO, bytelen, flavor='raw')
+ self._real_depth_buffer = [0] * size
+ self.pixelbuffer = display.get_pixelbuffer()
self._realsize = size
self.display = display
- def __del__(self):
- lltype.free(self.pixelbuffer, flavor='raw')
-
def at0(self, space, index0):
val = self.getword(index0)
return space.wrap_uint(val)
@@ -715,7 +712,7 @@
self.setword(index0, word)
def flush_to_screen(self):
- self.display.blit()
+ self.display.flip()
def size(self):
return self._realsize
@@ -739,28 +736,23 @@
class W_DisplayBitmap1Bit(W_DisplayBitmap):
- @jit.unroll_safe
def getword(self, n):
- word = r_uint(0)
- pos = n * NATIVE_DEPTH
- for i in xrange(32):
- word <<= 1
- pixel = self.pixelbuffer[pos]
- word |= r_uint(pixel & 0x1)
- pos += 1
- return ~word
+ return self._real_depth_buffer[n]
@jit.unroll_safe
def setword(self, n, word):
- pos = n * NATIVE_DEPTH
+ self._real_depth_buffer[n] = word
+ pos = n * NATIVE_DEPTH * 4
mask = r_uint(1)
mask <<= 31
for i in xrange(32):
bit = mask & word
- pixel = r_uint((0x00ffffff * (bit == 0)) | r_uint(0xff000000))
- self.pixelbuffer[pos] = pixel
+ self.pixelbuffer[pos] = rffi.r_uchar(0xff * (bit == 0))
+ self.pixelbuffer[pos + 1] = rffi.r_uchar(0xff * (bit == 0))
+ self.pixelbuffer[pos + 2] = rffi.r_uchar(0xff * (bit == 0))
+ self.pixelbuffer[pos + 3] = rffi.r_uchar(0xff)
mask >>= 1
- pos += 1
+ pos += 4
# XXX Shouldn't compiledmethod have class reference for subclassed compiled
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -1,5 +1,6 @@
from spyvm import constants, model, shadow, wrapper
from spyvm.error import UnwrappingError, WrappingError, PrimitiveFailedError
+from rpython.rlib import jit
from rpython.rlib.objectmodel import instantiate, specialize
from rpython.rlib.rarithmetic import intmask, r_uint, int_between
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -592,15 +592,18 @@
w_prev_bitmap = w_prev_display.fetch(interp.space, 0)
if isinstance(w_prev_bitmap, model.W_DisplayBitmap):
sdldisplay = w_prev_bitmap.display
+ sdldisplay.set_video_mode(width, height, depth)
if isinstance(w_bitmap, model.W_DisplayBitmap):
assert (sdldisplay is None) or (sdldisplay is w_bitmap.display)
sdldisplay = w_bitmap.display
+ sdldisplay.set_video_mode(width, height, depth)
w_display_bitmap = w_bitmap
else:
assert isinstance(w_bitmap, model.W_WordsObject)
if not sdldisplay:
sdldisplay = display.SDLDisplay(interp.image_name)
+ sdldisplay.set_video_mode(width, height, depth)
w_display_bitmap = model.W_DisplayBitmap.create(
interp.space,
w_bitmap.getclass(interp.space),
@@ -612,9 +615,7 @@
w_display_bitmap.setword(idx, word)
w_rcvr.store(interp.space, 0, w_display_bitmap)
- sdldisplay.set_video_mode(width, height, depth)
- sdldisplay.set_pixelbuffer(w_display_bitmap.pixelbuffer)
- sdldisplay.blit()
+ w_display_bitmap.flush_to_screen()
interp.space.objtable['w_display'] = w_rcvr
return w_rcvr
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit