Can now use images on OSX

This commit is contained in:
Skyler Lehmkuhl 2013-01-04 12:19:07 -05:00
parent b0368e7c73
commit ec6a5ec494
5 changed files with 52 additions and 11 deletions

View File

@ -3,7 +3,7 @@
# #
from array import array from array import array
from Foundation import NSPoint, NSMakeRect, NSString from Foundation import NSPoint, NSMakeRect, NSString, NSRect, NSZeroRect
from AppKit import NSGraphicsContext, NSBezierPath, NSEvenOddWindingRule, \ from AppKit import NSGraphicsContext, NSBezierPath, NSEvenOddWindingRule, \
NSFontAttributeName, NSForegroundColorAttributeName, \ NSFontAttributeName, NSForegroundColorAttributeName, \
NSCompositeCopy, NSCompositeSourceOver, NSAffineTransform NSCompositeCopy, NSCompositeSourceOver, NSAffineTransform
@ -11,6 +11,7 @@ from GUI import export
from GUI.StdColors import black, white from GUI.StdColors import black, white
from GUI.GCanvases import Canvas as GCanvas from GUI.GCanvases import Canvas as GCanvas
import math import math
import sys
class Canvas(GCanvas): class Canvas(GCanvas):
@ -67,6 +68,10 @@ class Canvas(GCanvas):
def newpath(self): def newpath(self):
self._ns_path.removeAllPoints() self._ns_path.removeAllPoints()
self.minx = sys.maxint
self.miny = sys.maxint
self.maxx = -sys.maxint/2
self.maxy = -sys.maxint/2
#for i in range(len(self.transformstack)): #for i in range(len(self.transformstack)):
#j = self.transformstack.pop() #j = self.transformstack.pop()
#transforms = {"translate":self.translate,"rotate":self.rotate,"scale":self.scale} #transforms = {"translate":self.translate,"rotate":self.rotate,"scale":self.scale}
@ -74,6 +79,10 @@ class Canvas(GCanvas):
def moveto(self, x, y): def moveto(self, x, y):
x, y = self._transform(x, y) x, y = self._transform(x, y)
self.minx = min(self.minx, x)
self.miny = min(self.miny, y)
self.maxx = max(self.maxx, x)
self.maxy = max(self.maxy, y)
self._ns_path.moveToPoint_((x, y)) self._ns_path.moveToPoint_((x, y))
def rmoveto(self, dx, dy): def rmoveto(self, dx, dy):
@ -81,6 +90,10 @@ class Canvas(GCanvas):
def lineto(self, x, y): def lineto(self, x, y):
x, y = self._transform(x, y) x, y = self._transform(x, y)
self.minx = min(self.minx, x)
self.miny = min(self.miny, y)
self.maxx = max(self.maxx, x)
self.maxy = max(self.maxy, y)
self._ns_path.lineToPoint_((x, y)) self._ns_path.lineToPoint_((x, y))
def rlineto(self, dx, dy): def rlineto(self, dx, dy):
@ -90,6 +103,10 @@ class Canvas(GCanvas):
cp1 = self._transform(*cp1) cp1 = self._transform(*cp1)
cp2 = self._transform(*cp2) cp2 = self._transform(*cp2)
ep = self._transform(*ep) ep = self._transform(*ep)
self.minx = min(self.minx, cp1[0], cp2[0], ep[0])
self.miny = min(self.miny, cp1[1], cp2[1], ep[1])
self.maxx = max(self.maxx, cp1[0], cp2[0], ep[0])
self.maxy = max(self.maxy, cp1[1], cp2[1], ep[1])
self._ns_path.curveToPoint_controlPoint1_controlPoint2_( self._ns_path.curveToPoint_controlPoint1_controlPoint2_(
ep, cp1, cp2) ep, cp1, cp2)
@ -171,7 +188,12 @@ class Canvas(GCanvas):
def fill(self): def fill(self):
ns = self._ns_path ns = self._ns_path
self._fillcolor._ns_color.set() # self._fillcolor._ns_color.set()
if self._fillcolor.image:
ns.addClip()
self._fillcolor._ns_color.drawInRect_fromRect_operation_fraction_(NSRect((self.minx,self.miny),(self.maxx-self.minx,self.maxy-self.miny)),NSZeroRect,NSCompositeSourceOver,1.0)
else:
self._fillcolor._ns_color.setFill()
ns.fill() ns.fill()
def erase(self): def erase(self):
@ -186,7 +208,12 @@ class Canvas(GCanvas):
ns = self._ns_path ns = self._ns_path
self._pencolor._ns_color.set() self._pencolor._ns_color.set()
ns.stroke() ns.stroke()
self._fillcolor._ns_color.set() # self._fillcolor._ns_color.set()
if self._fillcolor.image:
ns.addClip()
self._fillcolor._ns_color.drawInRect_fromRect_operation_fraction_(NSRect((self.minx,self.miny),(self.maxx-self.minx,self.maxy-self.miny)),NSZeroRect,NSCompositeSourceOver,1.0)
else:
self._fillcolor._ns_color.setFill()
ns.fill() ns.fill()
def show_text(self, text): def show_text(self, text):

View File

@ -18,9 +18,14 @@ class Color(GColor):
_from_ns_color = classmethod(_from_ns_color) _from_ns_color = classmethod(_from_ns_color)
def __init__(self, red, green, blue, alpha = 1.0): def __init__(self, red, green, blue, alpha = 1.0, image = False, im = ''):
self._ns_color = NSColor.colorWithCalibratedRed_green_blue_alpha_( self.image = image
red, green, blue, alpha) if image:
# self._ns_color = NSColor.colorWithPatternImage_(im._ns_image)
self._ns_color = im._ns_image
else:
self._ns_color = NSColor.colorWithCalibratedRed_green_blue_alpha_(
red, green, blue, alpha)
def get_red(self): def get_red(self):
return self._ns_color.redComponent() return self._ns_color.redComponent()

View File

@ -20,12 +20,14 @@ class Image(GImage):
if not ns_rep: if not ns_rep:
raise ValueError("Unrecognised image file type: %s" % file) raise ValueError("Unrecognised image file type: %s" % file)
ns_rep.setSize_((ns_rep.pixelsWide(), ns_rep.pixelsHigh())) ns_rep.setSize_((ns_rep.pixelsWide(), ns_rep.pixelsHigh()))
self._ns_image = NSImage.alloc().initWithContentsOfFile_(file)
# self.ns_image.addRepresentation_(ns_rep)
self._init_from_ns_rep(ns_rep) self._init_from_ns_rep(ns_rep)
def _init_from_ns_rep(self, ns_rep): def _init_from_ns_rep(self, ns_rep):
ns_image = NSImage.alloc().init() self._ns_image = NSImage.alloc().init()
ns_image.addRepresentation_(ns_rep) self._ns_image.addRepresentation_(ns_rep)
self._ns_bitmap_image_rep = ns_rep self._ns_bitmap_image_rep = ns_rep
self._init_with_ns_image(ns_image, flipped = True) self._init_with_ns_image(self._ns_image, flipped = True)
export(Image) export(Image)

View File

@ -574,7 +574,9 @@ def import_to_stage(widget=None):
thefile = svlgui.file_dialog("open",None,["jpg","png","bmp","wav"]).path thefile = svlgui.file_dialog("open",None,["jpg","png","bmp","wav"]).path
for i in ("jpg","png","bmp"): for i in ("jpg","png","bmp"):
if thefile.endswith(i): if thefile.endswith(i):
im = svlgui.Image(thefile) # im = svlgui.Image(thefile)
im = box(100,100,200,200,svlgui.Color(thefile))
print im.filled
im.onMouseDown = onMouseDownObj im.onMouseDown = onMouseDownObj
im.onMouseMove = onMouseMoveObj im.onMouseMove = onMouseMoveObj
im.onMouseDrag = onMouseDragObj im.onMouseDrag = onMouseDragObj

View File

@ -81,13 +81,15 @@ class Color (object):
if type(val)==type([]): if type(val)==type([]):
self.type = "RGB" self.type = "RGB"
self.val = val self.val = val
elif type(val)==type(""): elif isinstance(val, basestring):
if val.startswith("#"): if val.startswith("#"):
self.type = "RGB" self.type = "RGB"
self.val = hex2rgb(val) self.val = hex2rgb(val)
else: else:
self.type = "Image" self.type = "Image"
self.val = val self.val = val
if SYSTEM=="osx":
self.image = GUI.Image(file=val)
def _getcairo(self): def _getcairo(self):
if self.type=="RGB": if self.type=="RGB":
return cairo.SolidPattern(*self.val) return cairo.SolidPattern(*self.val)
@ -98,6 +100,9 @@ class Color (object):
def _getpygui(self): def _getpygui(self):
if self.type=="RGB": if self.type=="RGB":
return Colors.rgb(*self.val) return Colors.rgb(*self.val)
elif self.type=="Image":
a = Colors.rgb(0,0,0,1,image=True,im=self.image)
return a
def _getrgb(self): def _getrgb(self):
if self.type=="RGB": if self.type=="RGB":
return rgb2hex(*self.val) return rgb2hex(*self.val)