Author: Anton Gulenko <[email protected]>
Branch: storage-display-refactoring
Changeset: r929:2dac2e226121
Date: 2014-07-21 18:08 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/2dac2e226121/

Log:    Extracted Display classes from model into a seperate module
        model_display.

diff --git a/spyvm/constants.py b/spyvm/constants.py
--- a/spyvm/constants.py
+++ b/spyvm/constants.py
@@ -54,6 +54,11 @@
 BLKCLSR_NUMARGS = 2
 BLKCLSR_SIZE = 3
 
+FORM_BITS = 0
+FORM_WIDTH = 1
+FORM_HEIGHT = 2
+FORM_DEPTH = 3
+
 # ___________________________________________________________________________
 # Miscellaneous constants
 
diff --git a/spyvm/interpreter_proxy.py b/spyvm/interpreter_proxy.py
--- a/spyvm/interpreter_proxy.py
+++ b/spyvm/interpreter_proxy.py
@@ -17,7 +17,7 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rlib.unroll import unrolling_iterable
 
-from spyvm import error, model, objspace
+from spyvm import error, model, model_display, objspace
 
 sqInt = rffi.INT
 sqLong = rffi.LONG
@@ -242,7 +242,7 @@
         return w_object.convert_to_c_layout()
     elif isinstance(w_object, model.W_BytesObject):
         return rffi.cast(sqIntArrayPtr, w_object.convert_to_c_layout())
-    elif isinstance(w_object, model.W_DisplayBitmap):
+    elif isinstance(w_object, model_display.W_DisplayBitmap):
         return rffi.cast(sqIntArrayPtr, w_object.convert_to_c_layout())
     else:
         raise ProxyFunctionFailed
@@ -529,7 +529,7 @@
 @expose_on_virtual_machine_proxy([], int)
 def fullDisplayUpdate():
     w_display = IProxy.space.objtable['w_display']
-    if isinstance(w_display, model.W_DisplayBitmap):
+    if isinstance(w_display, model_display.W_DisplayBitmap):
         w_display.update_from_buffer()
         w_display.flush_to_screen()
         return 0
@@ -559,16 +559,7 @@
     # display memory
     space = IProxy.space
     if w_dest_form.is_same_object(space.objtable['w_display']):
-        w_bitmap = w_dest_form.fetch(space, 0)
-        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 = model_display.get_display_bitmap(IProxy.interp, 
w_dest_form)
         w_display_bitmap.update_from_buffer()
         w_display_bitmap.flush_to_screen()
     return 0
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -987,26 +987,6 @@
                 c_words[i] = intmask(old_words[i])
             self.words = None
             return c_words
-
-    def as_display_bitmap(self, w_form, interp, sdldisplay=None):
-        width = interp.space.unwrap_int(w_form.fetch(interp.space, 1))
-        height = interp.space.unwrap_int(w_form.fetch(interp.space, 2))
-        depth = interp.space.unwrap_int(w_form.fetch(interp.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(interp.space, 0, w_display_bitmap)
-        return w_display_bitmap
     
     def _become(self, w_other):
         assert isinstance(w_other, W_WordsObject)
@@ -1019,144 +999,6 @@
         if self.words is None:
             lltype.free(self.c_words, flavor='raw')
 
-class W_DisplayBitmap(W_AbstractObjectWithClassReference):
-    _attrs_ = ['pixelbuffer', '_realsize', '_real_depth_buffer', 'display', 
'_depth']
-    _immutable_fields_ = ['_realsize', 'display', '_depth']
-    repr_classname = "W_DisplayBitmap"
-    
-    pixelbuffer = None
-    
-    @staticmethod
-    def create(space, w_class, size, depth, display):
-        if depth < 8:
-            return W_MappingDisplayBitmap(space, w_class, size * (8 / depth), 
depth, display)
-        elif depth == 8:
-            return W_8BitDisplayBitmap(space, w_class, size, depth, display)
-        elif depth == 16:
-            return W_16BitDisplayBitmap(space, w_class, size, depth, display)
-        else:
-            return W_DisplayBitmap(space, w_class, size, depth, display)
-
-    def repr_content(self):
-        return "len=%d depth=%d %s" % (self.size(), self._depth, 
self.str_content())
-    
-    def __init__(self, space, w_class, size, depth, display):
-        W_AbstractObjectWithClassReference.__init__(self, space, w_class)
-        self._real_depth_buffer = lltype.malloc(rffi.CArray(rffi.UINT), size, 
flavor='raw')
-        self._realsize = size
-        self.display = display
-        self._depth = depth
-
-    def at0(self, space, index0):
-        val = self.getword(index0)
-        return space.wrap_uint(val)
-
-    def atput0(self, space, index0, w_value):
-        word = space.unwrap_uint(w_value)
-        self.setword(index0, word)
-
-    def flush_to_screen(self):
-        self.display.flip()
-
-    def size(self):
-        return self._realsize
-        
-    def invariant(self):
-        return False
-
-    def clone(self, space):
-        w_result = W_WordsObject(space, self.getclass(space), self._realsize)
-        n = 0
-        while n < self._realsize:
-            w_result.words[n] = self.getword(n)
-            n += 1
-        return w_result
-
-    def getword(self, n):
-        assert self.size() > n >= 0
-        return self._real_depth_buffer[n]
-
-    def setword(self, n, word):
-        self._real_depth_buffer[n] = word
-        self.display.get_pixelbuffer()[n] = word
-
-    def is_array_object(self):
-        return True
-
-    def update_from_buffer(self):
-        for i in range(self._realsize):
-            self.setword(i, self.getword(i))
-
-    def convert_to_c_layout(self):
-        return self._real_depth_buffer
-
-    def can_become(self, w_other):
-        # TODO - implement _become() for this class. Impossible due to 
_immutable_fields_?
-        return False
-    
-    def __del__(self):
-        lltype.free(self._real_depth_buffer, flavor='raw')
-
-
-class W_16BitDisplayBitmap(W_DisplayBitmap):
-    repr_classname = "W_16BitDisplayBitmap"
-    def setword(self, n, word):
-        self._real_depth_buffer[n] = word
-        mask = 0b11111
-        lsb = (r_uint(word) & r_uint(0xffff0000)) >> 16
-        msb = (r_uint(word) & r_uint(0x0000ffff))
-
-        lsb = (
-            ((lsb >> 10) & mask) |
-            (((lsb >> 5) & mask) << 6) |
-            ((lsb & mask) << 11)
-        )
-        msb = (
-            ((msb >> 10) & mask) |
-            (((msb >> 5) & mask) << 6) |
-            ((msb & mask) << 11)
-        )
-
-        self.display.get_pixelbuffer()[n] = r_uint(lsb | (msb << 16))
-
-
-class W_8BitDisplayBitmap(W_DisplayBitmap):
-    repr_classname = "W_8BitDisplayBitmap"
-    def setword(self, n, word):
-        self._real_depth_buffer[n] = word
-        self.display.get_pixelbuffer()[n] = r_uint(
-            (word >> 24) |
-            ((word >> 8) & 0x0000ff00) |
-            ((word << 8) & 0x00ff0000) |
-            (word << 24)
-        )
-
-NATIVE_DEPTH = 8
-class W_MappingDisplayBitmap(W_DisplayBitmap):
-    repr_classname = "W_MappingDisplayBitmap"
-    @jit.unroll_safe
-    def setword(self, n, word):
-        self._real_depth_buffer[n] = word
-        word = r_uint(word)
-        pos = self.compute_pos(n)
-        assert self._depth <= 4
-        rshift = 32 - self._depth
-        for i in xrange(8 / self._depth):
-            if pos >= self.size():
-                return
-            mapword = r_uint(0)
-            for i in xrange(4):
-                pixel = r_uint(word) >> rshift
-                mapword |= (r_uint(pixel) << (i * 8))
-                word <<= self._depth
-            self.display.get_pixelbuffer()[pos] = mapword
-            pos += 1
-
-    def compute_pos(self, n):
-        return n * (NATIVE_DEPTH / self._depth)
-        
-# XXX Shouldn't compiledmethod have class reference for subclassed compiled
-# methods?
 class W_CompiledMethod(W_AbstractObjectWithIdentityHash):
     """My instances are methods suitable for interpretation by the virtual 
machine.  This is the only class in the system whose instances intermix both 
indexable pointer fields and indexable integer fields.
 
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -1,6 +1,6 @@
 import os
 
-from spyvm import constants, model, shadow, wrapper, version
+from spyvm import constants, model, model_display, shadow, wrapper, version
 from spyvm.error import UnwrappingError, WrappingError, PrimitiveFailedError
 from rpython.rlib import jit, rpath
 from rpython.rlib.objectmodel import instantiate, specialize
@@ -237,7 +237,7 @@
         w_display = self.objtable['w_display']
         if w_display:
             w_bitmap = w_display.fetch(self, 0)
-            if isinstance(w_bitmap, model.W_DisplayBitmap):
+            if isinstance(w_bitmap, model_display.W_DisplayBitmap):
                 return w_bitmap.display
         raise PrimitiveFailedError("No display")
 
diff --git a/spyvm/plugins/bitblt.py b/spyvm/plugins/bitblt.py
--- a/spyvm/plugins/bitblt.py
+++ b/spyvm/plugins/bitblt.py
@@ -1,4 +1,4 @@
-from spyvm import model
+from spyvm import model_display, model
 from spyvm.error import PrimitiveFailedError
 from spyvm.shadow import AbstractCachingShadow
 from spyvm.plugins.plugin import Plugin
@@ -32,7 +32,7 @@
         s_frame.push(interp.space.wrap_int(s_bitblt.bitCount))
     elif 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)
+        assert isinstance(w_bitmap, model_display.W_DisplayBitmap)
         w_bitmap.flush_to_screen()
     return w_rcvr
 
@@ -741,7 +741,7 @@
         self.w_bits = self.fetch(0)
         if self.w_bits.is_nil(self.space):
             return
-        if not (isinstance(self.w_bits, model.W_WordsObject) or 
isinstance(self.w_bits, model.W_DisplayBitmap)):
+        if not (isinstance(self.w_bits, model.W_WordsObject) or 
isinstance(self.w_bits, model_display.W_DisplayBitmap)):
             return
         self.width = self.intOrIfNil(self.fetch(1), 0)
         self.height = self.intOrIfNil(self.fetch(2), 0)
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -2,7 +2,7 @@
 import inspect
 import math
 import operator
-from spyvm import model, shadow, error, constants, display
+from spyvm import model, model_display, shadow, error, constants, display
 from spyvm.error import PrimitiveFailedError, PrimitiveNotYetWrittenError
 from spyvm import wrapper
 
@@ -676,7 +676,7 @@
         w_display = interp.space.objtable['w_display']
         if w_dest_form.is_same_object(w_display):
             w_bitmap = w_display.fetch(interp.space, 0)
-            assert isinstance(w_bitmap, model.W_DisplayBitmap)
+            assert isinstance(w_bitmap, model_display.W_DisplayBitmap)
             w_bitmap.flush_to_screen()
         return w_rcvr
     except shadow.MethodNotFound:
@@ -748,23 +748,19 @@
     w_prev_display = interp.space.objtable['w_display']
     if w_prev_display:
         w_prev_bitmap = w_prev_display.fetch(interp.space, 0)
-        if isinstance(w_prev_bitmap, model.W_DisplayBitmap):
+        if isinstance(w_prev_bitmap, model_display.W_DisplayBitmap):
             sdldisplay = w_prev_bitmap.display
             sdldisplay.set_video_mode(width, height, depth)
 
-    if isinstance(w_bitmap, model.W_DisplayBitmap):
+    if isinstance(w_bitmap, model_display.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)
-        w_display_bitmap = w_bitmap.as_display_bitmap(
-            w_rcvr,
-            interp,
-            sdldisplay=sdldisplay
-        )
-
+        w_display_bitmap = model_display.get_display_bitmap(interp, w_rcvr, 
sdldisplay=sdldisplay)
+    
     w_display_bitmap.flush_to_screen()
     if interp.image:
         interp.image.lastWindowSize = (width << 16)  + height
@@ -1142,7 +1138,7 @@
             raise PrimitiveFailedError
         for i in xrange(w_arg.size()):
             w_arg.setchar(i, chr(new_value))
-    elif isinstance(w_arg, model.W_WordsObject) or isinstance(w_arg, 
model.W_DisplayBitmap):
+    elif isinstance(w_arg, model.W_WordsObject) or isinstance(w_arg, 
model_display.W_DisplayBitmap):
         for i in xrange(w_arg.size()):
             w_arg.setword(i, new_value)
     else:
diff --git a/spyvm/test/test_model.py b/spyvm/test/test_model.py
--- a/spyvm/test/test_model.py
+++ b/spyvm/test/test_model.py
@@ -1,5 +1,5 @@
 import py, math, socket
-from spyvm import model, shadow, objspace, error, display
+from spyvm import model, model_display, shadow, objspace, error, display
 from spyvm.shadow import MethodNotFound, WEAK_POINTERS
 from rpython.rlib.rarithmetic import intmask, r_uint
 from rpython.rtyper.lltypesystem import lltype, rffi
@@ -387,7 +387,7 @@
     d = display.SDLDisplay("test")
     d.set_video_mode(32, 10, 1)
 
-    target = model.W_DisplayBitmap.create(space, space.w_Array, 10, 1, d)
+    target = model_display.W_DisplayBitmap.create(space, space.w_Array, 10, 1, 
d)
     target.setword(0, r_uint(0xFF00))
     assert bin(target.getword(0)) == bin(0xFF00)
     target.setword(0, r_uint(0x00FF00FF))
@@ -411,7 +411,7 @@
     d = display.SDLDisplay("test")
     d.set_video_mode(18, 5, 1)
 
-    dbitmap = model.W_DisplayBitmap.create(space, space.w_Array, 5, 1, d)
+    dbitmap = model_display.W_DisplayBitmap.create(space, space.w_Array, 5, 1, 
d)
 
     assert dbitmap.compute_pos(0) == 0
     assert dbitmap.compute_pos(1) == 8
diff --git a/spyvm/test/test_primitives.py b/spyvm/test/test_primitives.py
--- a/spyvm/test/test_primitives.py
+++ b/spyvm/test/test_primitives.py
@@ -1,5 +1,5 @@
 import py, os, math, time
-from spyvm import model, shadow, interpreter, constants, primitives, objspace, 
wrapper, display
+from spyvm import model, model_display, shadow, interpreter, constants, 
primitives, objspace, wrapper, display
 from spyvm.primitives import prim_table, PrimitiveFailedError
 from spyvm.plugins import bitblt
 from rpython.rlib.rfloat import INFINITY, NAN, isinf, isnan
@@ -721,7 +721,7 @@
     assert space.objtable["w_display"] is mock_display
     w_bitmap = mock_display.fetch(space, 0)
     assert w_bitmap is not w_wordbmp
-    assert isinstance(w_bitmap, model.W_DisplayBitmap)
+    assert isinstance(w_bitmap, model_display.W_DisplayBitmap)
     sdldisplay = w_bitmap.display
     assert isinstance(sdldisplay, display.SDLDisplay)
 
@@ -733,7 +733,7 @@
     prim(primitives.BE_DISPLAY, [mock_display2])
     assert space.objtable["w_display"] is mock_display2
     w_bitmap2 = mock_display.fetch(space, 0)
-    assert isinstance(w_bitmap2, model.W_DisplayBitmap)
+    assert isinstance(w_bitmap2, model_display.W_DisplayBitmap)
     assert w_bitmap.display is w_bitmap2.display
     assert sdldisplay.width == 32
     assert sdldisplay.height == 10
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to