Author: Tim Felgentreff <timfelgentr...@gmail.com>
Branch: 
Changeset: r529:5e5665fee98c
Date: 2013-12-17 15:50 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/5e5665fee98c/

Log:    etoys uses display scaling and calls bitblt stuff before BE_DISPLAY
        - we need to convert the Form to an SDL Bitmap from there, too

diff --git a/spyvm/interpreter_proxy.py b/spyvm/interpreter_proxy.py
--- a/spyvm/interpreter_proxy.py
+++ b/spyvm/interpreter_proxy.py
@@ -567,9 +567,17 @@
     space = IProxy.space
     if w_dest_form.is_same_object(space.objtable['w_display']):
         w_bitmap = w_dest_form.fetch(space, 0)
-        assert isinstance(w_bitmap, model.W_DisplayBitmap)
-        w_bitmap.update_from_buffer()
-        w_bitmap.flush_to_screen()
+        if not isinstance(w_bitmap, model.W_DisplayBitmap):
+            assert isinstance(w_bitmap, model.W_WordsObject)
+            w_display_bitmap = w_bitmap.as_display_bitmap(
+                w_dest_form,
+                IProxy.interp,
+                sdldisplay=None
+            )
+        else:
+            w_display_bitmap = w_bitmap
+        w_display_bitmap.update_from_buffer()
+        w_display_bitmap.flush_to_screen()
     return 0
 
 @expose_on_virtual_machine_proxy([int], int)
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -951,6 +951,26 @@
             self.words = None
             return c_words
 
+    def as_display_bitmap(self, w_form, interp, sdldisplay=None):
+        width = space.unwrap_int(w_form.fetch(space, 1))
+        height = space.unwrap_int(w_form.fetch(space, 2))
+        depth = space.unwrap_int(w_form.fetch(space, 3))
+        if not sdldisplay:
+            from spyvm import display
+            sdldisplay = display.SDLDisplay(interp.image_name)
+            sdldisplay.set_video_mode(width, height, depth)
+        w_display_bitmap = W_DisplayBitmap.create(
+            interp.space,
+            self.getclass(interp.space),
+            self.size(),
+            depth,
+            sdldisplay
+        )
+        for idx in range(self.size()):
+            w_display_bitmap.setword(idx, self.getword(idx))
+        w_form.store(space, 0, w_display_bitmap)
+        return w_display_bitmap
+
     def __del__(self):
         if self.words is None:
             lltype.free(self.c_words, flavor='raw')
@@ -970,6 +990,8 @@
         #     return W_DisplayBitmap32Bit(space, w_class, size, depth, display)
         elif depth == 32:
             return W_DisplayBitmap32Bit(space, w_class, size, depth, display)
+        elif depth == 16:
+            return W_DisplayBitmap16Bit(space, w_class, size, depth, display)
         else:
             raise NotImplementedError("non B/W squeak")
 
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -743,19 +743,11 @@
         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),
-            w_bitmap.size(),
-            depth,
-            sdldisplay
+        w_display_bitmap = w_bitmap.as_display_bitmap(
+            w_rcvr,
+            interp,
+            sdldisplay=sdldisplay
         )
-        for idx, word in enumerate(w_bitmap.words):
-            w_display_bitmap.setword(idx, word)
-        w_rcvr.store(interp.space, 0, w_display_bitmap)
 
     w_display_bitmap.flush_to_screen()
     if interp.image:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to