Lightningbeam/PyGUI-2.5.3/GUI/Cocoa/Pixmap.py

81 lines
2.8 KiB
Python

#
# Python GUI - Pixmaps - Cocoa
#
from Foundation import NSSize
from AppKit import NSImage, NSCachedImageRep, NSBitmapImageRep, \
NSCalibratedRGBColorSpace, NSImageCacheNever, NSGraphicsContext, \
NSAffineTransform
from GUI import export
from GUI import Canvas
from GUI.GPixmaps import Pixmap as GPixmap
class Pixmap(GPixmap):
# _ns_bitmap_image_rep NSBitmapImageRep
def __init__(self, width, height):
GPixmap.__init__(self)
#ns_size = NSSize(width, height)
#ns_image = NSImage.alloc().initWithSize_(ns_size)
ns_image = NSImage.alloc().init()
ns_image.setCacheMode_(NSImageCacheNever)
row_bytes = 4 * width
ns_bitmap = NSBitmapImageRep.alloc().\
initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel_(
None, width, height, 8, 4, True, False, NSCalibratedRGBColorSpace, row_bytes, 32)
ns_image.addRepresentation_(ns_bitmap)
ns_bitmap_context = NSGraphicsContext.graphicsContextWithBitmapImageRep_(ns_bitmap)
ns_graphics_context = FlippedNSGraphicsContext.alloc().initWithBase_(ns_bitmap_context)
ns_tr = NSAffineTransform.transform()
ns_tr.translateXBy_yBy_(0.0, height)
ns_tr.scaleXBy_yBy_(1.0, -1.0)
# Using __class__ to get +saveGraphicsState instead of -saveGraphicsState
NSGraphicsContext.__class__.saveGraphicsState()
try:
NSGraphicsContext.setCurrentContext_(ns_graphics_context)
ns_tr.concat()
finally:
NSGraphicsContext.__class__.restoreGraphicsState()
self._init_with_ns_image(ns_image, flipped = True) #False)
self._ns_bitmap_image_rep = ns_bitmap
self._ns_graphics_context = ns_graphics_context
def with_canvas(self, proc):
NSGraphicsContext.__class__.saveGraphicsState()
NSGraphicsContext.setCurrentContext_(self._ns_graphics_context)
try:
canvas = Canvas()
proc(canvas)
finally:
NSGraphicsContext.__class__.restoreGraphicsState()
class FlippedNSGraphicsContext(NSGraphicsContext):
def initWithBase_(self, base):
self.base = base
self.graphics_port = base.graphicsPort()
return self
def isFlipped(self):
return True
def graphicsPort(self):
return self.graphics_port
def isDrawingToScreen(self):
return self.base.isDrawingToScreen()
def setCompositingOperation_(self, x):
self.base.setCompositingOperation_(x)
def focusStack(self):
return self.base.focusStack()
def saveGraphicsState(self):
return self.base.saveGraphicsState()
def restoreGraphicsState(self):
return self.base.restoreGraphicsState()
export(Pixmap)