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