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

Reply via email to