summaryrefslogtreecommitdiff
path: root/unrpyc/renpy/display/pgrender.py
diff options
context:
space:
mode:
Diffstat (limited to 'unrpyc/renpy/display/pgrender.py')
-rw-r--r--unrpyc/renpy/display/pgrender.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/unrpyc/renpy/display/pgrender.py b/unrpyc/renpy/display/pgrender.py
new file mode 100644
index 0000000..32d1df8
--- /dev/null
+++ b/unrpyc/renpy/display/pgrender.py
@@ -0,0 +1,167 @@
+# Copyright 2004-2013 Tom Rothamel <pytom@bishoujo.us>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# This module wraps the pygame surface class (and associated functions). It
+# ensures that returned surfaces have a 2px border around them.
+
+import sys
+import pygame
+import renpy.display
+
+# Sample surfaces, with and without alpha.
+sample_alpha = None
+sample_noalpha = None
+
+def set_rgba_masks():
+ """
+ This rebuilds the sample surfaces, to ones that use the given
+ masks.
+ """
+
+ # Annoyingly, the value for the big mask seems to vary from
+ # platform to platform. So we read it out of a surface.
+
+ global sample_alpha
+ global sample_noalpha
+
+ # Create a sample surface.
+ s = pygame.Surface((10, 10), 0, 32)
+ sample_alpha = s.convert_alpha()
+
+ # Sort the components by absolute value.
+ masks = list(sample_alpha.get_masks())
+ masks.sort(key=lambda a : abs(a))
+
+ # Choose the masks.
+ if sys.byteorder == 'big':
+ masks = ( masks[3], masks[2], masks[1], masks[0] )
+ else:
+ masks = ( masks[0], masks[1], masks[2], masks[3] )
+
+ # Create the sample surface.
+ sample_alpha = pygame.Surface((10, 10), 0, 32, masks)
+ sample_noalpha = pygame.Surface((10, 10), 0, 32, masks[:3] + (0,))
+
+
+class Surface(pygame.Surface):
+ """
+ This allows us to wrap around pygame's surface, to change
+ its mode, as necessary.
+ """
+
+ opaque = False
+
+ def is_opaque(self):
+ return self.opaque
+
+ def convert_alpha(self, surface=None):
+ return copy_surface_unscaled(self, True)
+
+ def convert(self, surface=None):
+ return copy_surface(self, False)
+
+ def copy(self):
+ return copy_surface(self, self)
+
+ def subsurface(self, rect):
+ rv = pygame.Surface.subsurface(self, rect)
+ return rv
+
+def surface(xxx_todo_changeme, alpha):
+ """
+ Constructs a new surface. The allocated surface is actually a subsurface
+ of a surface that has a 2 pixel border in all directions.
+
+ `alpha` - True if the new surface should have an alpha channel.
+ """
+ (width, height) = xxx_todo_changeme
+ if isinstance(alpha, pygame.Surface):
+ alpha = alpha.get_masks()[3]
+
+ if alpha:
+ sample = sample_alpha
+ else:
+ sample = sample_noalpha
+
+ # We might not have initialized properly yet. This is enough
+ # to get us underway.
+ if sample is None:
+ sample = pygame.Surface((4, 4), pygame.SRCALPHA, 32)
+
+ surf = Surface((width + 4, height + 4), 0, sample)
+ return surf.subsurface((2, 2, width, height)) # E1101
+
+surface_unscaled = surface
+
+def copy_surface(surf, alpha=True):
+ """
+ Creates a copy of the surface.
+ """
+
+ rv = surface_unscaled(surf.get_size(), alpha)
+ renpy.display.accelerator.nogil_copy(surf, rv) # @UndefinedVariable
+ return rv
+
+copy_surface_unscaled = copy_surface
+
+
+# Wrapper around image loading.
+
+def load_image(f, filename):
+ surf = pygame.image.load(f, renpy.exports.fsencode(filename))
+ rv = copy_surface_unscaled(surf)
+ return rv
+
+load_image_unscaled = load_image
+
+
+# Wrapper around functions we use from pygame.surface.
+
+def flip(surf, horizontal, vertical):
+ surf = pygame.transform.flip(surf, horizontal, vertical)
+ return copy_surface_unscaled(surf)
+
+flip_unscaled = flip
+
+
+def rotozoom(surf, angle, zoom):
+
+ surf = pygame.transform.rotozoom(surf, angle, zoom)
+ return copy_surface_unscaled(surf)
+
+rotozoom_unscaled = rotozoom
+
+
+def transform_scale(surf, size):
+ surf = pygame.transform.scale(surf, size)
+ return copy_surface_unscaled(surf, surf)
+
+transform_scale_unscaled = transform_scale
+
+
+def transform_rotate(surf, angle):
+ surf = pygame.transform.rotate(surf, angle)
+ return copy_surface(surf)
+
+transform_rotate_unscaled = transform_rotate
+
+
+