Author: Tim Felgentreff <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit