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