first cut at event-based test app



git-svn-id: http://skia.googlecode.com/svn/trunk@37 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkAutoKern.h b/include/core/SkAutoKern.h
similarity index 100%
rename from src/core/SkAutoKern.h
rename to include/core/SkAutoKern.h
diff --git a/src/core/SkBlitter.h b/include/core/SkBlitter.h
similarity index 100%
rename from src/core/SkBlitter.h
rename to include/core/SkBlitter.h
diff --git a/include/core/SkDraw.h b/include/core/SkDraw.h
index 2d775a4..8214859 100644
--- a/include/core/SkDraw.h
+++ b/include/core/SkDraw.h
@@ -92,7 +92,7 @@
 #endif
 };
 
-#include "SkGlyphCache.h"
+class SkGlyphCache;
 
 class SkTextToPathIter {
 public:
diff --git a/src/core/SkGeometry.h b/include/core/SkGeometry.h
similarity index 100%
rename from src/core/SkGeometry.h
rename to include/core/SkGeometry.h
diff --git a/src/core/SkScan.h b/include/core/SkScan.h
similarity index 100%
rename from src/core/SkScan.h
rename to include/core/SkScan.h
diff --git a/include/views/SkOSWindow_Mac.h b/include/views/SkOSWindow_Mac.h
index 1f6a1fa..0d808e1 100644
--- a/include/views/SkOSWindow_Mac.h
+++ b/include/views/SkOSWindow_Mac.h
@@ -24,13 +24,18 @@
     SkOSWindow(void* hwnd);
 
     void*   getHWND() const { return fHWND; }
+    void*   getHVIEW() const { return fHVIEW; }
     void    updateSize();
 
     static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
 
     static pascal OSStatus SkOSWindow::EventHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData );
 
+    void    doPaint(void* ctx);
+
 protected:
+    // overrides from SkEventSink
+    virtual bool onEvent(const SkEvent& evt);
     // overrides from SkWindow
     virtual void onHandleInval(const SkIRect&);
     // overrides from SkView
@@ -39,8 +44,7 @@
 
 private:
     void*   fHWND;
-
-    void    doPaint(void* ctx);
+    void*   fHVIEW;
 
     typedef SkWindow INHERITED;
 };
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 5ff8362..365f558 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -9,8 +9,12 @@
 
 #include "SampleCode.h"
 
+//#define SK_SUPPORT_GL
+
+#ifdef SK_SUPPORT_GL
 #include <AGL/agl.h>
 #include <OpenGL/gl.h>
+#endif
 
 #define ANIMATING_EVENTTYPE "nextSample"
 #define ANIMATING_DELAY     750
@@ -29,6 +33,7 @@
     gHead = this;
 }
 
+#ifdef SK_SUPPORT_GL
 static AGLContext   gAGLContext;
 
 static void init_gl(WindowRef wref) {
@@ -85,6 +90,7 @@
     glClearColor(0, 0, 0, 0);
     glClear(GL_COLOR_BUFFER_BIT);
 }
+#endif
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -187,8 +193,10 @@
 }
 
 SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
+#ifdef SK_SUPPORT_GL
     init_gl((WindowRef)hwnd);
-    
+#endif
+
     fPicture = NULL;
     fGLCanvas = NULL;
 
@@ -237,9 +245,11 @@
 }
 
 SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
+#ifdef SK_SUPPORT_GL
 #ifndef USE_OFFSCREEN
     aglSetWindowRef(gAGLContext, NULL);
 #endif
+#endif
     switch (fCanvasType) {
         case kRaster_CanvasType:
             canvas = this->INHERITED::beforeChildren(canvas);
@@ -248,6 +258,7 @@
             fPicture = new SkPicture;
             canvas = fPicture->beginRecording(9999, 9999);
             break;
+#ifdef SK_SUPPORT_GL
         case kOpenGL_CanvasType: {
             //SkGLCanvas::DeleteAllTextures();  // just for testing
             SkDevice* device = canvas->getDevice();
@@ -261,6 +272,7 @@
             canvas = fGLCanvas;
             break;
         }
+#endif
     }
 
     if (fUseClip) {
@@ -305,6 +317,7 @@
             }
             fPicture = NULL;
             break;
+#ifdef SK_SUPPORT_GL
         case kOpenGL_CanvasType:
             glFlush();
             delete fGLCanvas;
@@ -313,6 +326,7 @@
             reverseRedAndBlue(orig->getDevice()->accessBitmap(true));
 #endif
             break;
+#endif
     }
     
 //    if ((fScrollTestX | fScrollTestY) != 0)
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp
index 2e55db2..77bd332 100644
--- a/samplecode/SamplePatch.cpp
+++ b/samplecode/SamplePatch.cpp
@@ -11,7 +11,6 @@
 #include "SkShader.h"
 #include "SkUtils.h"
 #include "SkXfermode.h"
-#include "SkShaderExtras.h"
 #include "SkColorPriv.h"
 #include "SkColorFilter.h"
 #include "SkTime.h"
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index 04d006a..98f1a5b 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -10,7 +10,6 @@
 #include "SkShader.h"
 #include "SkUtils.h"
 #include "SkXfermode.h"
-#include "SkShaderExtras.h"
 #include "SkColorPriv.h"
 #include "SkColorFilter.h"
 #include "SkTime.h"
diff --git a/samplecode/SamplePathEffects.cpp b/samplecode/SamplePathEffects.cpp
index 4082288..4e964d7 100644
--- a/samplecode/SamplePathEffects.cpp
+++ b/samplecode/SamplePathEffects.cpp
@@ -6,7 +6,6 @@
 #include "SkRegion.h"
 #include "SkShader.h"
 #include "SkUtils.h"
-#include "SkShaderExtras.h"
 #include "Sk1DPathEffect.h"
 #include "SkCornerPathEffect.h"
 #include "SkPathMeasure.h"
diff --git a/src/ports/SkImageDecoder_empty.cpp b/src/ports/SkImageDecoder_empty.cpp
new file mode 100644
index 0000000..45eb346
--- /dev/null
+++ b/src/ports/SkImageDecoder_empty.cpp
@@ -0,0 +1,110 @@
+/* libs/graphics/ports/SkImageDecoder_Factory.cpp
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License"); 
+** you may not use this file except in compliance with the License. 
+** You may obtain a copy of the License at 
+**
+**     http://www.apache.org/licenses/LICENSE-2.0 
+**
+** Unless required by applicable law or agreed to in writing, software 
+** distributed under the License is distributed on an "AS IS" BASIS, 
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+** See the License for the specific language governing permissions and 
+** limitations under the License.
+*/
+
+#include "SkImageDecoder.h"
+#include "SkMovie.h"
+#include "SkStream.h"
+
+extern SkImageDecoder* SkImageDecoder_GIF_Factory(SkStream*);
+extern SkImageDecoder* SkImageDecoder_BMP_Factory(SkStream*);
+extern SkImageDecoder* SkImageDecoder_ICO_Factory(SkStream*);
+extern SkImageDecoder* SkImageDecoder_PNG_Factory(SkStream*);
+extern SkImageDecoder* SkImageDecoder_WBMP_Factory(SkStream*);
+extern SkImageDecoder* SkImageDecoder_JPEG_Factory(SkStream*);
+
+typedef SkImageDecoder* (*SkImageDecoderFactoryProc)(SkStream*);
+
+struct CodecFormat {
+    SkImageDecoderFactoryProc   fProc;
+    SkImageDecoder::Format      fFormat;
+};
+
+static const CodecFormat gPairs[] = {
+#if 0
+    { SkImageDecoder_GIF_Factory,   SkImageDecoder::kGIF_Format },
+    { SkImageDecoder_PNG_Factory,   SkImageDecoder::kPNG_Format },
+    { SkImageDecoder_ICO_Factory,   SkImageDecoder::kICO_Format },
+    { SkImageDecoder_WBMP_Factory,  SkImageDecoder::kWBMP_Format },
+    { SkImageDecoder_BMP_Factory,   SkImageDecoder::kBMP_Format },
+    { SkImageDecoder_JPEG_Factory,  SkImageDecoder::kJPEG_Format }
+#endif
+};
+
+SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) {
+    for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
+        SkImageDecoder* codec = gPairs[i].fProc(stream);
+        stream->rewind();
+        if (NULL != codec) {
+            return codec;
+        }
+    }
+    return NULL;
+}
+
+bool SkImageDecoder::SupportsFormat(Format format) {
+    for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
+        if (gPairs[i].fFormat == format) {
+            return true;
+        }
+    }
+    return false;
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+typedef SkMovie* (*SkMovieFactoryProc)(SkStream*);
+
+extern SkMovie* SkMovie_GIF_Factory(SkStream*);
+
+static const SkMovieFactoryProc gMovieProcs[] = {
+#if 0
+    SkMovie_GIF_Factory
+#endif
+};
+
+SkMovie* SkMovie::DecodeStream(SkStream* stream) {
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(gMovieProcs); i++) {
+        SkMovie* movie = gMovieProcs[i](stream);
+        if (NULL != movie) {
+            return movie;
+        }
+        stream->rewind();
+    }
+    return NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+#ifdef SK_SUPPORT_IMAGE_ENCODE
+
+extern SkImageEncoder* SkImageEncoder_JPEG_Factory();
+extern SkImageEncoder* SkImageEncoder_PNG_Factory();
+
+SkImageEncoder* SkImageEncoder::Create(Type t) {
+    switch (t) {
+#if 0
+        case kJPEG_Type:
+            return SkImageEncoder_JPEG_Factory();
+        case kPNG_Type:
+            return SkImageEncoder_PNG_Factory();
+#endif
+        default:
+            return NULL;
+    }
+}
+
+#endif
diff --git a/src/utils/mac/SkBitmap_Mac.cpp b/src/utils/mac/SkBitmap_Mac.cpp
new file mode 100644
index 0000000..06c2b27
--- /dev/null
+++ b/src/utils/mac/SkBitmap_Mac.cpp
@@ -0,0 +1,142 @@
+#include "SkBitmap.h"
+#include "SkColorPriv.h"
+#include "SkMath.h"
+
+#if defined(SK_BUILD_FOR_MAC) && !defined(SK_USE_WXWIDGETS)
+
+#include <ApplicationServices/ApplicationServices.h>
+
+#ifndef __ppc__
+    #define SWAP_16BIT
+#endif
+
+static void convertGL32_to_Mac32(uint32_t dst[], const SkBitmap& bm) {
+    memcpy(dst, bm.getPixels(), bm.getSize());
+    return;
+    
+    uint32_t* stop = dst + (bm.getSize() >> 2);
+    const uint8_t* src = (const uint8_t*)bm.getPixels();
+    while (dst < stop) {
+        *dst++ = src[2] << 24 | src[1] << 16 | src[0] << 8 | src[3] << 0;
+        src += sizeof(uint32_t);
+    }
+}
+
+static void convert565_to_32(uint32_t dst[], const SkBitmap& bm) {
+    for (int y = 0; y < bm.height(); y++) {
+        const uint16_t* src = bm.getAddr16(0, y);
+        const uint16_t* stop = src + bm.width();
+        while (src < stop) {
+            unsigned c = *src++;
+            unsigned r = SkPacked16ToR32(c);
+            unsigned g = SkPacked16ToG32(c);
+            unsigned b = SkPacked16ToB32(c);
+        
+            *dst++ = (b << 24) | (g << 16) | (r << 8) | 0xFF;
+        }
+    }
+}
+
+static void convert4444_to_555(uint16_t dst[], const uint16_t src[], int count)
+{
+    const uint16_t* stop = src + count;
+    
+    while (src < stop)
+    {
+        unsigned c = *src++;
+        
+        unsigned r = SkGetPackedR4444(c);
+        unsigned g = SkGetPackedG4444(c);
+        unsigned b = SkGetPackedB4444(c);
+        // convert to 5 bits
+        r = (r << 1) | (r >> 3);
+        g = (g << 1) | (g >> 3);
+        b = (b << 1) | (b >> 3);
+        // build the 555
+        c = (r << 10) | (g << 5) | b;
+        
+#ifdef SWAP_16BIT
+        c = (c >> 8) | (c << 8);
+#endif
+        *dst++ = c;
+    }
+}
+
+#include "SkTemplates.h"
+
+static CGImageRef bitmap2imageref(const SkBitmap& bm) {
+    size_t  bitsPerComp;
+    size_t  bitsPerPixel;
+    CGBitmapInfo info;
+    CGColorSpaceRef cs = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
+    CGDataProviderRef data = CGDataProviderCreateWithData(NULL,
+                                                           bm.getPixels(),
+                                                           bm.getSize(),
+                                                           NULL);
+    SkAutoTCallVProc<CGDataProvider, CGDataProviderRelease> acp(data);
+    SkAutoTCallVProc<CGColorSpace, CGColorSpaceRelease> acp2(cs);
+
+    switch (bm.config()) {
+        case SkBitmap::kARGB_8888_Config:
+            bitsPerComp = 8;
+            bitsPerPixel = 32;
+            info = kCGImageAlphaPremultipliedLast;
+            break;
+        case SkBitmap::kARGB_4444_Config:
+            bitsPerComp = 4;
+            bitsPerPixel = 16;
+            info = kCGImageAlphaPremultipliedLast |  kCGBitmapByteOrder16Little;
+            break;
+#if 0   // not supported by quartz !!!
+        case SkBitmap::kRGB_565_Config:
+            bitsPerComp = 5;
+            bitsPerPixel = 16;
+            info = kCGImageAlphaNone | kCGBitmapByteOrder16Little;
+            break;
+#endif
+        default:
+            return NULL;
+    }
+
+    return CGImageCreate(bm.width(), bm.height(), bitsPerComp, bitsPerPixel,
+                         bm.rowBytes(), cs, info, data,
+                         NULL, false, kCGRenderingIntentDefault);
+}
+
+void SkBitmap::drawToPort(WindowRef wind, CGContextRef cg) const {
+	if (fPixels == NULL || fWidth == 0 || fHeight == 0) {
+		return;
+    }
+    
+    bool useQD = false;
+    if (NULL == cg) {
+        SetPortWindowPort(wind);
+        QDBeginCGContext(GetWindowPort(wind), &cg);
+        useQD = true;
+    }
+
+    SkBitmap bm;
+    if (this->config() == kRGB_565_Config) {
+        this->copyTo(&bm, kARGB_8888_Config);
+    } else {
+        bm = *this;
+    }
+    bm.lockPixels();
+
+    CGImageRef image = bitmap2imageref(bm);
+    if (image) {
+        CGRect rect;
+        rect.origin.x = rect.origin.y = 0;
+        rect.size.width = bm.width();
+        rect.size.height = bm.height();
+        
+        CGContextDrawImage(cg, rect, image);
+        CGImageRelease(image);
+    }
+
+    if (useQD) {
+        QDEndCGContext(GetWindowPort(wind), &cg);
+    }
+}
+
+#endif
diff --git a/src/utils/mac/SkOSWindow_Mac.cpp b/src/utils/mac/SkOSWindow_Mac.cpp
new file mode 100644
index 0000000..2c93721
--- /dev/null
+++ b/src/utils/mac/SkOSWindow_Mac.cpp
@@ -0,0 +1,451 @@
+#include "SkTypes.h"
+
+#if defined(SK_BUILD_FOR_MAC) && !defined(SK_USE_WXWIDGETS)
+
+#include <Carbon/Carbon.h>
+#include "SkCGUtils.h"
+
+#include "SkWindow.h"
+#include "SkCanvas.h"
+#include "SkOSMenu.h"
+#include "SkTime.h"
+
+#include "SkGraphics.h"
+#include <new.h>
+
+static void (*gPrevNewHandler)();
+
+extern "C" {
+	static void sk_new_handler()
+	{
+		if (SkGraphics::SetFontCacheUsed(0))
+			return;
+		if (gPrevNewHandler)
+			gPrevNewHandler();
+		else
+			sk_throw();
+	}
+}
+
+static SkOSWindow* gCurrOSWin;
+static EventTargetRef gEventTarget;
+static EventQueueRef gCurrEventQ;
+
+static OSStatus MyDrawEventHandler(EventHandlerCallRef myHandler,
+                                   EventRef event, void *userData) {
+	// NOTE: GState is save/restored by the HIView system doing the callback,
+    // so the draw handler doesn't need to do it
+    
+	OSStatus status = noErr;
+	CGContextRef context;
+	HIRect		bounds;
+    
+	// Get the CGContextRef
+	status = GetEventParameter (event, kEventParamCGContextRef, 
+                                typeCGContextRef, NULL, 
+                                sizeof (CGContextRef),
+                                NULL,
+                                &context);
+    
+	if (status != noErr) {
+		SkDebugf("Got error %d getting the context!\n", status);
+		return status;
+	}		
+    
+	// Get the bounding rectangle
+	HIViewGetBounds ((HIViewRef) userData, &bounds);
+	
+    gCurrOSWin->doPaint(context);
+	return status;
+}
+
+#define SK_MacEventClass			FOUR_CHAR_CODE('SKec')
+#define SK_MacEventKind				FOUR_CHAR_CODE('SKek')
+#define SK_MacEventParamName		FOUR_CHAR_CODE('SKev')
+#define SK_MacEventSinkIDParamName	FOUR_CHAR_CODE('SKes')
+
+static void set_bindingside(HISideBinding* side, HIViewRef parent, HIBindingKind kind) {
+    side->toView = parent;
+    side->kind = kind;
+    side->offset = 0;
+}
+
+static void set_axisscale(HIAxisScale* axis, HIViewRef parent) {
+    axis->toView = parent;
+    axis->kind = kHILayoutScaleAbsolute;
+    axis->ratio = 1;
+}
+
+static void set_axisposition(HIAxisPosition* pos, HIViewRef parent, HIPositionKind kind) {
+    pos->toView = parent;
+    pos->kind = kind;
+    pos->offset = 0;
+}
+
+SkOSWindow::SkOSWindow(void* hWnd) : fHWND(hWnd)
+{
+	OSStatus    result;
+    WindowRef   wr = (WindowRef)hWnd;
+    
+    HIViewRef imageView, parent;
+    HIViewRef rootView = HIViewGetRoot(wr);
+    HIViewFindByID(rootView, kHIViewWindowContentID, &parent);
+    result = HIImageViewCreate(NULL, &imageView);
+	SkASSERT(result == noErr);
+    
+    result = HIViewAddSubview(parent, imageView);
+	SkASSERT(result == noErr);
+
+    fHVIEW = imageView;
+
+    HIViewSetVisible(imageView, true);
+    HIViewPlaceInSuperviewAt(imageView, 0, 0);
+
+    if (true) {
+        HILayoutInfo layout;
+        layout.version = kHILayoutInfoVersionZero;
+        set_bindingside(&layout.binding.left, parent, kHILayoutBindLeft);
+        set_bindingside(&layout.binding.top, parent, kHILayoutBindTop);
+        set_bindingside(&layout.binding.right, parent, kHILayoutBindRight);
+        set_bindingside(&layout.binding.bottom, parent, kHILayoutBindBottom);
+        set_axisscale(&layout.scale.x, parent);
+        set_axisscale(&layout.scale.y, parent);
+        set_axisposition(&layout.position.x, parent, kHILayoutPositionLeft);
+        set_axisposition(&layout.position.y, rootView, kHILayoutPositionTop);
+        HIViewSetLayoutInfo(imageView, &layout);
+    }
+
+    HIImageViewSetOpaque(imageView, true);
+    HIImageViewSetScaleToFit(imageView, false);
+
+	static const EventTypeSpec  gTypes[] = {
+		{ kEventClassKeyboard,  kEventRawKeyDown			},
+        { kEventClassKeyboard,  kEventRawKeyUp              },
+		{ kEventClassMouse,		kEventMouseDown				},
+		{ kEventClassMouse,		kEventMouseDragged			},
+		{ kEventClassMouse,		kEventMouseUp				},
+		{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent   },
+		{ kEventClassWindow,	kEventWindowBoundsChanged	},
+//		{ kEventClassWindow,	kEventWindowDrawContent		},
+		{ SK_MacEventClass,		SK_MacEventKind				}
+	};
+
+	EventHandlerUPP handlerUPP = NewEventHandlerUPP(SkOSWindow::EventHandler);
+	int				count = SK_ARRAY_COUNT(gTypes);
+
+	result = InstallEventHandler(GetWindowEventTarget(wr), handlerUPP,
+						count, gTypes, this, nil);
+	SkASSERT(result == noErr);
+    
+	gCurrOSWin = this;
+	gCurrEventQ = GetCurrentEventQueue();
+	gEventTarget = GetWindowEventTarget(wr);
+
+	static bool gOnce = true;
+	if (gOnce) {
+		gOnce = false;
+		gPrevNewHandler = set_new_handler(sk_new_handler);
+	}
+}
+
+void SkOSWindow::doPaint(void* ctx)
+{
+#if 0
+	this->update(NULL);
+
+    const SkBitmap& bm = this->getBitmap();
+    CGImageRef img = SkCreateCGImageRef(bm);
+
+    if (img) {
+        CGRect r = CGRectMake(0, 0, bm.width(), bm.height());
+
+        CGContextRef cg = reinterpret_cast<CGContextRef>(ctx);
+
+        CGContextSaveGState(cg);
+        CGContextTranslateCTM(cg, 0, r.size.height);
+        CGContextScaleCTM(cg, 1, -1);
+
+        CGContextDrawImage(cg, r, img);
+        
+        CGContextRestoreGState(cg);
+
+        CGImageRelease(img);
+    }
+#endif
+}
+
+void SkOSWindow::updateSize()
+{
+	Rect	r;
+	
+	GetWindowBounds((WindowRef)fHWND, kWindowContentRgn, &r);
+	this->resize(r.right - r.left, r.bottom - r.top);
+    
+#if 0
+    HIRect    frame;
+    HIViewRef imageView = (HIViewRef)getHVIEW();
+    HIViewRef parent = HIViewGetSuperview(imageView);
+  
+    HIViewGetBounds(imageView, &frame);
+    SkDebugf("------ %d bounds %g %g %g %g\n", r.right - r.left,
+             frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
+#endif
+}
+
+void SkOSWindow::onHandleInval(const SkIRect& r)
+{
+    SkEvent* evt = new SkEvent("inval-imageview");
+    evt->post(this->getSinkID());
+}
+
+bool SkOSWindow::onEvent(const SkEvent& evt) {
+    if (evt.isType("inval-imageview")) {
+        this->update(NULL);
+
+        const SkBitmap& bm = this->getBitmap();
+        SkDebugf("------ bitmap %d %d\n", bm.width(), bm.height());
+
+        CGImageRef img = SkCreateCGImageRef(bm);
+        HIImageViewSetImage((HIViewRef)getHVIEW(), img);
+        CGImageRelease(img);
+        return true;
+    }
+    return INHERITED::onEvent(evt);
+}
+
+void SkOSWindow::onSetTitle(const char title[])
+{
+    CFStringRef str = CFStringCreateWithCString(NULL, title, kCFStringEncodingUTF8);
+    SetWindowTitleWithCFString((WindowRef)fHWND, str);
+    CFRelease(str);
+}
+
+void SkOSWindow::onAddMenu(const SkOSMenu* sk_menu)
+{
+}
+
+static void getparam(EventRef inEvent, OSType name, OSType type, UInt32 size, void* data)
+{
+	EventParamType  actualType;
+	UInt32			actualSize;
+	OSStatus		status;
+
+	status = GetEventParameter(inEvent, name, type, &actualType, size, &actualSize, data);
+	SkASSERT(status == noErr);
+	SkASSERT(actualType == type);
+	SkASSERT(actualSize == size);
+}
+
+enum {
+	SK_MacReturnKey		= 36,
+	SK_MacDeleteKey		= 51,
+	SK_MacEndKey		= 119,
+	SK_MacLeftKey		= 123,
+	SK_MacRightKey		= 124,
+	SK_MacDownKey		= 125,
+	SK_MacUpKey			= 126,
+    
+    SK_Mac0Key          = 0x52,
+    SK_Mac1Key          = 0x53,
+    SK_Mac2Key          = 0x54,
+    SK_Mac3Key          = 0x55,
+    SK_Mac4Key          = 0x56,
+    SK_Mac5Key          = 0x57,
+    SK_Mac6Key          = 0x58,
+    SK_Mac7Key          = 0x59,
+    SK_Mac8Key          = 0x5b,
+    SK_Mac9Key          = 0x5c
+};
+	
+static SkKey raw2key(UInt32 raw)
+{
+	static const struct {
+		UInt32  fRaw;
+		SkKey   fKey;
+	} gKeys[] = {
+		{ SK_MacUpKey,		kUp_SkKey		},
+		{ SK_MacDownKey,	kDown_SkKey		},
+		{ SK_MacLeftKey,	kLeft_SkKey		},
+		{ SK_MacRightKey,   kRight_SkKey	},
+		{ SK_MacReturnKey,  kOK_SkKey		},
+		{ SK_MacDeleteKey,  kBack_SkKey		},
+		{ SK_MacEndKey,		kEnd_SkKey		},
+        { SK_Mac0Key,       k0_SkKey        },
+        { SK_Mac1Key,       k1_SkKey        },
+        { SK_Mac2Key,       k2_SkKey        },
+        { SK_Mac3Key,       k3_SkKey        },
+        { SK_Mac4Key,       k4_SkKey        },
+        { SK_Mac5Key,       k5_SkKey        },
+        { SK_Mac6Key,       k6_SkKey        },
+        { SK_Mac7Key,       k7_SkKey        },
+        { SK_Mac8Key,       k8_SkKey        },
+        { SK_Mac9Key,       k9_SkKey        }
+	};
+	
+	for (unsigned i = 0; i < SK_ARRAY_COUNT(gKeys); i++)
+		if (gKeys[i].fRaw == raw)
+			return gKeys[i].fKey;
+	return kNONE_SkKey;
+}
+
+static void post_skmacevent()
+{
+	EventRef	ref;
+	OSStatus	status = CreateEvent(nil, SK_MacEventClass, SK_MacEventKind, 0, 0, &ref);
+	SkASSERT(status == noErr);
+	
+#if 0
+	status = SetEventParameter(ref, SK_MacEventParamName, SK_MacEventParamName, sizeof(evt), &evt);
+	SkASSERT(status == noErr);
+	status = SetEventParameter(ref, SK_MacEventSinkIDParamName, SK_MacEventSinkIDParamName, sizeof(sinkID), &sinkID);
+	SkASSERT(status == noErr);
+#endif
+	
+	EventTargetRef target = gEventTarget;
+	SetEventParameter(ref, kEventParamPostTarget, typeEventTargetRef, sizeof(target), &target);
+	SkASSERT(status == noErr);
+	
+	status = PostEventToQueue(gCurrEventQ, ref, kEventPriorityStandard);
+	SkASSERT(status == noErr);
+
+	ReleaseEvent(ref);
+}
+
+pascal OSStatus SkOSWindow::EventHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData )
+{
+	SkOSWindow* win = (SkOSWindow*)userData;
+	OSStatus	result = eventNotHandledErr;
+	UInt32		wClass = GetEventClass(inEvent);
+	UInt32		wKind = GetEventKind(inEvent);
+
+	gCurrOSWin = win;	// will need to be in TLS. Set this so PostEvent will work
+
+	switch (wClass) {
+        case kEventClassMouse: {
+			Point   pt;
+			getparam(inEvent, kEventParamMouseLocation, typeQDPoint, sizeof(pt), &pt);
+			SetPortWindowPort((WindowRef)win->getHWND());
+			GlobalToLocal(&pt);
+
+			switch (wKind) {
+			case kEventMouseDown:
+				(void)win->handleClick(pt.h, pt.v, Click::kDown_State);
+				break;
+			case kEventMouseDragged:
+				(void)win->handleClick(pt.h, pt.v, Click::kMoved_State);
+				break;
+			case kEventMouseUp:
+				(void)win->handleClick(pt.h, pt.v, Click::kUp_State);
+				break;
+			default:
+				break;
+			}
+            break;
+		}
+        case kEventClassKeyboard:
+            if (wKind == kEventRawKeyDown) {
+                UInt32  raw;
+                getparam(inEvent, kEventParamKeyCode, typeUInt32, sizeof(raw), &raw);
+                SkKey key = raw2key(raw);
+                if (key != kNONE_SkKey)
+                    (void)win->handleKey(key);
+            } else if (wKind == kEventRawKeyUp) {
+                UInt32 raw;
+                getparam(inEvent, kEventParamKeyCode, typeUInt32, sizeof(raw), &raw);
+                SkKey key = raw2key(raw);
+                if (key != kNONE_SkKey)
+                    (void)win->handleKeyUp(key);
+            }
+            break;
+        case kEventClassTextInput:
+            if (wKind == kEventTextInputUnicodeForKeyEvent) {
+                UInt16  uni;
+                getparam(inEvent, kEventParamTextInputSendText, typeUnicodeText, sizeof(uni), &uni);
+                win->handleChar(uni);
+            }
+            break;
+        case kEventClassWindow:
+            switch (wKind) {
+                case kEventWindowBoundsChanged:
+                    win->updateSize();
+                    break;
+                case kEventWindowDrawContent: {
+                    CGContextRef cg;
+                    result = GetEventParameter(inEvent,
+                                               kEventParamCGContextRef,
+                                               typeCGContextRef,
+                                               NULL,
+                                               sizeof (CGContextRef),
+                                               NULL,
+                                               &cg);
+                    if (result != 0) {
+                        cg = NULL;
+                    }
+                    win->doPaint(cg);
+                    break;
+                }
+                default:
+                    break;
+            }
+            break;
+        case SK_MacEventClass: {
+            SkASSERT(wKind == SK_MacEventKind);
+            if (SkEvent::ProcessEvent()) {
+                    post_skmacevent();
+            }
+    #if 0
+            SkEvent*		evt;
+            SkEventSinkID	sinkID;
+            getparam(inEvent, SK_MacEventParamName, SK_MacEventParamName, sizeof(evt), &evt);
+            getparam(inEvent, SK_MacEventSinkIDParamName, SK_MacEventSinkIDParamName, sizeof(sinkID), &sinkID);
+    #endif
+            result = noErr;
+            break;
+        }
+        default:
+            break;
+	}
+	if (result == eventNotHandledErr) {
+		result = CallNextEventHandler(inHandler, inEvent);
+    }
+	return result;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void SkEvent::SignalNonEmptyQueue()
+{
+	post_skmacevent();
+//	SkDebugf("signal nonempty\n");
+}
+
+static TMTask	gTMTaskRec;
+static TMTask*	gTMTaskPtr;
+
+static void sk_timer_proc(TMTask* rec)
+{
+	SkEvent::ServiceQueueTimer();
+//	SkDebugf("timer task fired\n");
+}
+
+void SkEvent::SignalQueueTimer(SkMSec delay)
+{
+	if (gTMTaskPtr)
+	{
+		RemoveTimeTask((QElem*)gTMTaskPtr);
+		DisposeTimerUPP(gTMTaskPtr->tmAddr);
+		gTMTaskPtr = nil;
+	}
+	if (delay)
+	{
+		gTMTaskPtr = &gTMTaskRec;
+		memset(gTMTaskPtr, 0, sizeof(gTMTaskRec));
+		gTMTaskPtr->tmAddr = NewTimerUPP(sk_timer_proc);
+		OSErr err = InstallTimeTask((QElem*)gTMTaskPtr);
+//		SkDebugf("installtimetask of %d returned %d\n", delay, err);
+		PrimeTimeTask((QElem*)gTMTaskPtr, delay);
+	}
+}
+
+#endif
+
diff --git a/src/utils/mac/skia_mac.cp b/src/utils/mac/skia_mac.cp
new file mode 100644
index 0000000..f6be570
--- /dev/null
+++ b/src/utils/mac/skia_mac.cp
@@ -0,0 +1,43 @@
+#include <Carbon/Carbon.h>
+#include "SkApplication.h"
+#include "SkWindow.h"
+
+int main(int argc, char* argv[])
+{
+    IBNibRef			nibRef;
+    WindowRef			window;
+    OSStatus			err = noErr;
+
+    // Create a Nib reference passing the name of the nib file (without the .nib extension)
+    // CreateNibReference only searches into the application bundle.
+    err = CreateNibReference(CFSTR("main"), &nibRef);
+    require_noerr( err, CantGetNibRef );
+    
+    // Then create a window. "MainWindow" is the name of the window object. This name is set in 
+    // InterfaceBuilder when the nib is created.
+    err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window);
+    require_noerr( err, CantCreateWindow );
+    
+    // We don't need the nib reference anymore.
+    DisposeNibReference(nibRef);
+    
+    // if we get here, we can start our normal Skia sequence
+    {
+        application_init();
+        (void)create_sk_window(window);
+        SizeWindow(window, 640, 480, false);
+    }
+    
+    // The window was created hidden so show it.
+    ShowWindow( window );
+    
+    // Call the event loop
+    RunApplicationEventLoop();
+
+	application_term();
+
+CantCreateWindow:
+CantGetNibRef:
+	return err;
+}
+
diff --git a/src/views/SkWindow.cpp b/src/views/SkWindow.cpp
index 5d00d4f..ae03b81 100644
--- a/src/views/SkWindow.cpp
+++ b/src/views/SkWindow.cpp
@@ -62,8 +62,6 @@
 	this->resize(fBitmap.width(), fBitmap.height(), config);
 }
 
-#include "SkImageDecoder.h"
-
 void SkWindow::resize(int width, int height, SkBitmap::Config config)
 {
 	if (config == SkBitmap::kNo_Config)
@@ -78,8 +76,6 @@
 		this->setSize(SkIntToScalar(width), SkIntToScalar(height));
 		this->inval(NULL);
 	}
-
-	SkImageDecoder::SetDeviceConfig(fConfig);
 }
 
 void SkWindow::eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
diff --git a/xcode/core/core.xcodeproj/project.pbxproj b/xcode/core/core.xcodeproj/project.pbxproj
index 2ac8ec9..ce3c6c6 100644
--- a/xcode/core/core.xcodeproj/project.pbxproj
+++ b/xcode/core/core.xcodeproj/project.pbxproj
@@ -629,7 +629,12 @@
 		1DEB91F008733DB70010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				GCC_ENABLE_CPP_EXCEPTIONS = NO;
+				GCC_ENABLE_CPP_RTTI = NO;
+				GCC_MODEL_TUNING = "";
+				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = SK_DEBUG;
+				GCC_THREADSAFE_STATICS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				PREBINDING = NO;
@@ -644,7 +649,10 @@
 					ppc,
 					i386,
 				);
+				GCC_ENABLE_CPP_EXCEPTIONS = NO;
+				GCC_ENABLE_CPP_RTTI = NO;
 				GCC_PREPROCESSOR_DEFINITIONS = SK_RELEASE;
+				GCC_THREADSAFE_STATICS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				PREBINDING = NO;
diff --git a/xcode/effects/effects.xcodeproj/project.pbxproj b/xcode/effects/effects.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..5b3773a
--- /dev/null
+++ b/xcode/effects/effects.xcodeproj/project.pbxproj
@@ -0,0 +1,337 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 44;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		0028867A0EFAE7500083E387 /* Sk1DPathEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886620EFAE7500083E387 /* Sk1DPathEffect.cpp */; };
+		0028867B0EFAE7500083E387 /* Sk2DPathEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886630EFAE7500083E387 /* Sk2DPathEffect.cpp */; };
+		0028867C0EFAE7500083E387 /* SkAvoidXfermode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886640EFAE7500083E387 /* SkAvoidXfermode.cpp */; };
+		0028867D0EFAE7500083E387 /* SkBlurDrawLooper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886650EFAE7500083E387 /* SkBlurDrawLooper.cpp */; };
+		0028867E0EFAE7500083E387 /* SkBlurMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886660EFAE7500083E387 /* SkBlurMask.cpp */; };
+		0028867F0EFAE7500083E387 /* SkBlurMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 002886670EFAE7500083E387 /* SkBlurMask.h */; };
+		002886800EFAE7500083E387 /* SkBlurMaskFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886680EFAE7500083E387 /* SkBlurMaskFilter.cpp */; };
+		002886810EFAE7500083E387 /* SkColorFilters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886690EFAE7500083E387 /* SkColorFilters.cpp */; };
+		002886820EFAE7500083E387 /* SkColorMatrixFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0028866A0EFAE7500083E387 /* SkColorMatrixFilter.cpp */; };
+		002886830EFAE7500083E387 /* SkCornerPathEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0028866B0EFAE7500083E387 /* SkCornerPathEffect.cpp */; };
+		002886840EFAE7500083E387 /* SkDashPathEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0028866C0EFAE7500083E387 /* SkDashPathEffect.cpp */; };
+		002886850EFAE7500083E387 /* SkDiscretePathEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0028866D0EFAE7500083E387 /* SkDiscretePathEffect.cpp */; };
+		002886860EFAE7500083E387 /* SkEmbossMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0028866E0EFAE7500083E387 /* SkEmbossMask.cpp */; };
+		002886870EFAE7500083E387 /* SkEmbossMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 0028866F0EFAE7500083E387 /* SkEmbossMask.h */; };
+		002886880EFAE7500083E387 /* SkEmbossMask_Table.h in Headers */ = {isa = PBXBuildFile; fileRef = 002886700EFAE7500083E387 /* SkEmbossMask_Table.h */; };
+		002886890EFAE7500083E387 /* SkEmbossMaskFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886710EFAE7500083E387 /* SkEmbossMaskFilter.cpp */; };
+		0028868A0EFAE7500083E387 /* SkGradientShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886720EFAE7500083E387 /* SkGradientShader.cpp */; };
+		0028868B0EFAE7500083E387 /* SkKernel33MaskFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886730EFAE7500083E387 /* SkKernel33MaskFilter.cpp */; };
+		0028868C0EFAE7500083E387 /* SkLayerDrawLooper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886740EFAE7500083E387 /* SkLayerDrawLooper.cpp */; };
+		0028868D0EFAE7500083E387 /* SkLayerRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886750EFAE7500083E387 /* SkLayerRasterizer.cpp */; };
+		0028868E0EFAE7500083E387 /* SkPaintFlagsDrawFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886760EFAE7500083E387 /* SkPaintFlagsDrawFilter.cpp */; };
+		0028868F0EFAE7500083E387 /* SkPixelXorXfermode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886770EFAE7500083E387 /* SkPixelXorXfermode.cpp */; };
+		002886900EFAE7500083E387 /* SkRadialGradient_Table.h in Headers */ = {isa = PBXBuildFile; fileRef = 002886780EFAE7500083E387 /* SkRadialGradient_Table.h */; };
+		002886910EFAE7500083E387 /* SkTransparentShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886790EFAE7500083E387 /* SkTransparentShader.cpp */; };
+		002886CD0EFAEA260083E387 /* SkCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886C50EFAEA260083E387 /* SkCamera.cpp */; };
+		002886CE0EFAEA260083E387 /* SkColorMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886C60EFAEA260083E387 /* SkColorMatrix.cpp */; };
+		002886CF0EFAEA260083E387 /* SkCullPoints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886C70EFAEA260083E387 /* SkCullPoints.cpp */; };
+		002886D00EFAEA260083E387 /* SkDumpCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886C80EFAEA260083E387 /* SkDumpCanvas.cpp */; };
+		002886D10EFAEA260083E387 /* SkInterpolator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886C90EFAEA260083E387 /* SkInterpolator.cpp */; };
+		002886D20EFAEA260083E387 /* SkNinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CA0EFAEA260083E387 /* SkNinePatch.cpp */; };
+		002886D30EFAEA260083E387 /* SkProxyCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CB0EFAEA260083E387 /* SkProxyCanvas.cpp */; };
+		002886D40EFAEA260083E387 /* SkUnitMappers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CC0EFAEA260083E387 /* SkUnitMappers.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		002886620EFAE7500083E387 /* Sk1DPathEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Sk1DPathEffect.cpp; path = ../../src/effects/Sk1DPathEffect.cpp; sourceTree = SOURCE_ROOT; };
+		002886630EFAE7500083E387 /* Sk2DPathEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Sk2DPathEffect.cpp; path = ../../src/effects/Sk2DPathEffect.cpp; sourceTree = SOURCE_ROOT; };
+		002886640EFAE7500083E387 /* SkAvoidXfermode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkAvoidXfermode.cpp; path = ../../src/effects/SkAvoidXfermode.cpp; sourceTree = SOURCE_ROOT; };
+		002886650EFAE7500083E387 /* SkBlurDrawLooper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkBlurDrawLooper.cpp; path = ../../src/effects/SkBlurDrawLooper.cpp; sourceTree = SOURCE_ROOT; };
+		002886660EFAE7500083E387 /* SkBlurMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkBlurMask.cpp; path = ../../src/effects/SkBlurMask.cpp; sourceTree = SOURCE_ROOT; };
+		002886670EFAE7500083E387 /* SkBlurMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkBlurMask.h; path = ../../src/effects/SkBlurMask.h; sourceTree = SOURCE_ROOT; };
+		002886680EFAE7500083E387 /* SkBlurMaskFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkBlurMaskFilter.cpp; path = ../../src/effects/SkBlurMaskFilter.cpp; sourceTree = SOURCE_ROOT; };
+		002886690EFAE7500083E387 /* SkColorFilters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkColorFilters.cpp; path = ../../src/effects/SkColorFilters.cpp; sourceTree = SOURCE_ROOT; };
+		0028866A0EFAE7500083E387 /* SkColorMatrixFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkColorMatrixFilter.cpp; path = ../../src/effects/SkColorMatrixFilter.cpp; sourceTree = SOURCE_ROOT; };
+		0028866B0EFAE7500083E387 /* SkCornerPathEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkCornerPathEffect.cpp; path = ../../src/effects/SkCornerPathEffect.cpp; sourceTree = SOURCE_ROOT; };
+		0028866C0EFAE7500083E387 /* SkDashPathEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkDashPathEffect.cpp; path = ../../src/effects/SkDashPathEffect.cpp; sourceTree = SOURCE_ROOT; };
+		0028866D0EFAE7500083E387 /* SkDiscretePathEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkDiscretePathEffect.cpp; path = ../../src/effects/SkDiscretePathEffect.cpp; sourceTree = SOURCE_ROOT; };
+		0028866E0EFAE7500083E387 /* SkEmbossMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkEmbossMask.cpp; path = ../../src/effects/SkEmbossMask.cpp; sourceTree = SOURCE_ROOT; };
+		0028866F0EFAE7500083E387 /* SkEmbossMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkEmbossMask.h; path = ../../src/effects/SkEmbossMask.h; sourceTree = SOURCE_ROOT; };
+		002886700EFAE7500083E387 /* SkEmbossMask_Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkEmbossMask_Table.h; path = ../../src/effects/SkEmbossMask_Table.h; sourceTree = SOURCE_ROOT; };
+		002886710EFAE7500083E387 /* SkEmbossMaskFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkEmbossMaskFilter.cpp; path = ../../src/effects/SkEmbossMaskFilter.cpp; sourceTree = SOURCE_ROOT; };
+		002886720EFAE7500083E387 /* SkGradientShader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkGradientShader.cpp; path = ../../src/effects/SkGradientShader.cpp; sourceTree = SOURCE_ROOT; };
+		002886730EFAE7500083E387 /* SkKernel33MaskFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkKernel33MaskFilter.cpp; path = ../../src/effects/SkKernel33MaskFilter.cpp; sourceTree = SOURCE_ROOT; };
+		002886740EFAE7500083E387 /* SkLayerDrawLooper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkLayerDrawLooper.cpp; path = ../../src/effects/SkLayerDrawLooper.cpp; sourceTree = SOURCE_ROOT; };
+		002886750EFAE7500083E387 /* SkLayerRasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkLayerRasterizer.cpp; path = ../../src/effects/SkLayerRasterizer.cpp; sourceTree = SOURCE_ROOT; };
+		002886760EFAE7500083E387 /* SkPaintFlagsDrawFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkPaintFlagsDrawFilter.cpp; path = ../../src/effects/SkPaintFlagsDrawFilter.cpp; sourceTree = SOURCE_ROOT; };
+		002886770EFAE7500083E387 /* SkPixelXorXfermode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkPixelXorXfermode.cpp; path = ../../src/effects/SkPixelXorXfermode.cpp; sourceTree = SOURCE_ROOT; };
+		002886780EFAE7500083E387 /* SkRadialGradient_Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkRadialGradient_Table.h; path = ../../src/effects/SkRadialGradient_Table.h; sourceTree = SOURCE_ROOT; };
+		002886790EFAE7500083E387 /* SkTransparentShader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkTransparentShader.cpp; path = ../../src/effects/SkTransparentShader.cpp; sourceTree = SOURCE_ROOT; };
+		002886C50EFAEA260083E387 /* SkCamera.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkCamera.cpp; path = ../../src/utils/SkCamera.cpp; sourceTree = SOURCE_ROOT; };
+		002886C60EFAEA260083E387 /* SkColorMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkColorMatrix.cpp; path = ../../src/utils/SkColorMatrix.cpp; sourceTree = SOURCE_ROOT; };
+		002886C70EFAEA260083E387 /* SkCullPoints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkCullPoints.cpp; path = ../../src/utils/SkCullPoints.cpp; sourceTree = SOURCE_ROOT; };
+		002886C80EFAEA260083E387 /* SkDumpCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkDumpCanvas.cpp; path = ../../src/utils/SkDumpCanvas.cpp; sourceTree = SOURCE_ROOT; };
+		002886C90EFAEA260083E387 /* SkInterpolator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkInterpolator.cpp; path = ../../src/utils/SkInterpolator.cpp; sourceTree = SOURCE_ROOT; };
+		002886CA0EFAEA260083E387 /* SkNinePatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkNinePatch.cpp; path = ../../src/utils/SkNinePatch.cpp; sourceTree = SOURCE_ROOT; };
+		002886CB0EFAEA260083E387 /* SkProxyCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkProxyCanvas.cpp; path = ../../src/utils/SkProxyCanvas.cpp; sourceTree = SOURCE_ROOT; };
+		002886CC0EFAEA260083E387 /* SkUnitMappers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkUnitMappers.cpp; path = ../../src/utils/SkUnitMappers.cpp; sourceTree = SOURCE_ROOT; };
+		D2AAC046055464E500DB518D /* libeffects.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libeffects.a; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		D289987405E68DCB004EDB86 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		002886D50EFAEA350083E387 /* utils */ = {
+			isa = PBXGroup;
+			children = (
+				002886C50EFAEA260083E387 /* SkCamera.cpp */,
+				002886C60EFAEA260083E387 /* SkColorMatrix.cpp */,
+				002886C70EFAEA260083E387 /* SkCullPoints.cpp */,
+				002886C80EFAEA260083E387 /* SkDumpCanvas.cpp */,
+				002886C90EFAEA260083E387 /* SkInterpolator.cpp */,
+				002886CA0EFAEA260083E387 /* SkNinePatch.cpp */,
+				002886CB0EFAEA260083E387 /* SkProxyCanvas.cpp */,
+				002886CC0EFAEA260083E387 /* SkUnitMappers.cpp */,
+			);
+			name = utils;
+			sourceTree = "<group>";
+		};
+		08FB7794FE84155DC02AAC07 /* effects */ = {
+			isa = PBXGroup;
+			children = (
+				002886D50EFAEA350083E387 /* utils */,
+				08FB7795FE84155DC02AAC07 /* effects */,
+				C6A0FF2B0290797F04C91782 /* Documentation */,
+				1AB674ADFE9D54B511CA2CBB /* Products */,
+			);
+			name = effects;
+			sourceTree = "<group>";
+		};
+		08FB7795FE84155DC02AAC07 /* effects */ = {
+			isa = PBXGroup;
+			children = (
+				002886620EFAE7500083E387 /* Sk1DPathEffect.cpp */,
+				002886630EFAE7500083E387 /* Sk2DPathEffect.cpp */,
+				002886640EFAE7500083E387 /* SkAvoidXfermode.cpp */,
+				002886650EFAE7500083E387 /* SkBlurDrawLooper.cpp */,
+				002886660EFAE7500083E387 /* SkBlurMask.cpp */,
+				002886670EFAE7500083E387 /* SkBlurMask.h */,
+				002886680EFAE7500083E387 /* SkBlurMaskFilter.cpp */,
+				002886690EFAE7500083E387 /* SkColorFilters.cpp */,
+				0028866A0EFAE7500083E387 /* SkColorMatrixFilter.cpp */,
+				0028866B0EFAE7500083E387 /* SkCornerPathEffect.cpp */,
+				0028866C0EFAE7500083E387 /* SkDashPathEffect.cpp */,
+				0028866D0EFAE7500083E387 /* SkDiscretePathEffect.cpp */,
+				0028866E0EFAE7500083E387 /* SkEmbossMask.cpp */,
+				0028866F0EFAE7500083E387 /* SkEmbossMask.h */,
+				002886700EFAE7500083E387 /* SkEmbossMask_Table.h */,
+				002886710EFAE7500083E387 /* SkEmbossMaskFilter.cpp */,
+				002886720EFAE7500083E387 /* SkGradientShader.cpp */,
+				002886730EFAE7500083E387 /* SkKernel33MaskFilter.cpp */,
+				002886740EFAE7500083E387 /* SkLayerDrawLooper.cpp */,
+				002886750EFAE7500083E387 /* SkLayerRasterizer.cpp */,
+				002886760EFAE7500083E387 /* SkPaintFlagsDrawFilter.cpp */,
+				002886770EFAE7500083E387 /* SkPixelXorXfermode.cpp */,
+				002886780EFAE7500083E387 /* SkRadialGradient_Table.h */,
+				002886790EFAE7500083E387 /* SkTransparentShader.cpp */,
+			);
+			name = effects;
+			sourceTree = "<group>";
+		};
+		1AB674ADFE9D54B511CA2CBB /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				D2AAC046055464E500DB518D /* libeffects.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		C6A0FF2B0290797F04C91782 /* Documentation */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = Documentation;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		D2AAC043055464E500DB518D /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				0028867F0EFAE7500083E387 /* SkBlurMask.h in Headers */,
+				002886870EFAE7500083E387 /* SkEmbossMask.h in Headers */,
+				002886880EFAE7500083E387 /* SkEmbossMask_Table.h in Headers */,
+				002886900EFAE7500083E387 /* SkRadialGradient_Table.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		D2AAC045055464E500DB518D /* effects */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "effects" */;
+			buildPhases = (
+				D2AAC043055464E500DB518D /* Headers */,
+				D2AAC044055464E500DB518D /* Sources */,
+				D289987405E68DCB004EDB86 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = effects;
+			productName = effects;
+			productReference = D2AAC046055464E500DB518D /* libeffects.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		08FB7793FE84155DC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "effects" */;
+			compatibilityVersion = "Xcode 3.0";
+			hasScannedForEncodings = 1;
+			mainGroup = 08FB7794FE84155DC02AAC07 /* effects */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				D2AAC045055464E500DB518D /* effects */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		D2AAC044055464E500DB518D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				0028867A0EFAE7500083E387 /* Sk1DPathEffect.cpp in Sources */,
+				0028867B0EFAE7500083E387 /* Sk2DPathEffect.cpp in Sources */,
+				0028867C0EFAE7500083E387 /* SkAvoidXfermode.cpp in Sources */,
+				0028867D0EFAE7500083E387 /* SkBlurDrawLooper.cpp in Sources */,
+				0028867E0EFAE7500083E387 /* SkBlurMask.cpp in Sources */,
+				002886800EFAE7500083E387 /* SkBlurMaskFilter.cpp in Sources */,
+				002886810EFAE7500083E387 /* SkColorFilters.cpp in Sources */,
+				002886820EFAE7500083E387 /* SkColorMatrixFilter.cpp in Sources */,
+				002886830EFAE7500083E387 /* SkCornerPathEffect.cpp in Sources */,
+				002886840EFAE7500083E387 /* SkDashPathEffect.cpp in Sources */,
+				002886850EFAE7500083E387 /* SkDiscretePathEffect.cpp in Sources */,
+				002886860EFAE7500083E387 /* SkEmbossMask.cpp in Sources */,
+				002886890EFAE7500083E387 /* SkEmbossMaskFilter.cpp in Sources */,
+				0028868A0EFAE7500083E387 /* SkGradientShader.cpp in Sources */,
+				0028868B0EFAE7500083E387 /* SkKernel33MaskFilter.cpp in Sources */,
+				0028868C0EFAE7500083E387 /* SkLayerDrawLooper.cpp in Sources */,
+				0028868D0EFAE7500083E387 /* SkLayerRasterizer.cpp in Sources */,
+				0028868E0EFAE7500083E387 /* SkPaintFlagsDrawFilter.cpp in Sources */,
+				0028868F0EFAE7500083E387 /* SkPixelXorXfermode.cpp in Sources */,
+				002886910EFAE7500083E387 /* SkTransparentShader.cpp in Sources */,
+				002886CD0EFAEA260083E387 /* SkCamera.cpp in Sources */,
+				002886CE0EFAEA260083E387 /* SkColorMatrix.cpp in Sources */,
+				002886CF0EFAEA260083E387 /* SkCullPoints.cpp in Sources */,
+				002886D00EFAEA260083E387 /* SkDumpCanvas.cpp in Sources */,
+				002886D10EFAEA260083E387 /* SkInterpolator.cpp in Sources */,
+				002886D20EFAEA260083E387 /* SkNinePatch.cpp in Sources */,
+				002886D30EFAEA260083E387 /* SkProxyCanvas.cpp in Sources */,
+				002886D40EFAEA260083E387 /* SkUnitMappers.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		1DEB91EC08733DB70010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				INSTALL_PATH = /usr/local/lib;
+				PRODUCT_NAME = effects;
+				ZERO_LINK = YES;
+			};
+			name = Debug;
+		};
+		1DEB91ED08733DB70010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_MODEL_TUNING = G5;
+				INSTALL_PATH = /usr/local/lib;
+				PRODUCT_NAME = effects;
+			};
+			name = Release;
+		};
+		1DEB91F008733DB70010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_ENABLE_CPP_EXCEPTIONS = NO;
+				GCC_ENABLE_CPP_RTTI = NO;
+				GCC_MODEL_TUNING = "";
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = SK_DEBUG;
+				GCC_THREADSAFE_STATICS = NO;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				PREBINDING = NO;
+				SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
+				USER_HEADER_SEARCH_PATHS = "../../include/**";
+			};
+			name = Debug;
+		};
+		1DEB91F108733DB70010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = (
+					ppc,
+					i386,
+				);
+				GCC_ENABLE_CPP_EXCEPTIONS = NO;
+				GCC_ENABLE_CPP_RTTI = NO;
+				GCC_PREPROCESSOR_DEFINITIONS = SK_RELEASE;
+				GCC_THREADSAFE_STATICS = NO;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				PREBINDING = NO;
+				SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
+				USER_HEADER_SEARCH_PATHS = "../../include/**";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "effects" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB91EC08733DB70010E9CD /* Debug */,
+				1DEB91ED08733DB70010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "effects" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB91F008733DB70010E9CD /* Debug */,
+				1DEB91F108733DB70010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/xcode/hostapp/CICarbonSample.xcodeproj/project.pbxproj b/xcode/hostapp/CICarbonSample.xcodeproj/project.pbxproj
index 3065934..7c7c0cd 100644
--- a/xcode/hostapp/CICarbonSample.xcodeproj/project.pbxproj
+++ b/xcode/hostapp/CICarbonSample.xcodeproj/project.pbxproj
@@ -11,6 +11,7 @@
 		0028847B0EFAB46A0083E387 /* libcore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 002884510EFAA35C0083E387 /* libcore.a */; };
 		002884BD0EFAB6A30083E387 /* libmaccore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 002884BC0EFAB69F0083E387 /* libmaccore.a */; };
 		002884D90EFABFE60083E387 /* SkFontHost_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002884D80EFABFE60083E387 /* SkFontHost_none.cpp */; };
+		004447A20EFC1DB400116F7C /* SkCreateCGImageRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 004447A10EFC1DB400116F7C /* SkCreateCGImageRef.cpp */; };
 		0156F80407C56A3000C6122B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0156F80307C56A3000C6122B /* Foundation.framework */; };
 		01FC44D507BD3BB800D228F4 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01FC44D407BD3BB800D228F4 /* Quartz.framework */; };
 		8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; };
@@ -24,28 +25,28 @@
 			isa = PBXContainerItemProxy;
 			containerPortal = 002884490EFAA35C0083E387 /* core.xcodeproj */;
 			proxyType = 2;
-			remoteGlobalIDString = D2AAC046055464E500DB518D /* libcore.a */;
+			remoteGlobalIDString = D2AAC046055464E500DB518D;
 			remoteInfo = core;
 		};
 		002884540EFAA3770083E387 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 002884490EFAA35C0083E387 /* core.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = D2AAC045055464E500DB518D /* core */;
+			remoteGlobalIDString = D2AAC045055464E500DB518D;
 			remoteInfo = core;
 		};
 		002884BB0EFAB69F0083E387 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 002884B40EFAB69F0083E387 /* maccore.xcodeproj */;
 			proxyType = 2;
-			remoteGlobalIDString = D2AAC046055464E500DB518D /* libmaccore.a */;
+			remoteGlobalIDString = D2AAC046055464E500DB518D;
 			remoteInfo = maccore;
 		};
 		002884BE0EFAB6B00083E387 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 002884B40EFAB69F0083E387 /* maccore.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = D2AAC045055464E500DB518D /* maccore */;
+			remoteGlobalIDString = D2AAC045055464E500DB518D;
 			remoteInfo = maccore;
 		};
 /* End PBXContainerItemProxy section */
@@ -55,6 +56,7 @@
 		002884490EFAA35C0083E387 /* core.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = core.xcodeproj; path = ../core/core.xcodeproj; sourceTree = SOURCE_ROOT; };
 		002884B40EFAB69F0083E387 /* maccore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = maccore.xcodeproj; path = ../maccore/maccore.xcodeproj; sourceTree = SOURCE_ROOT; };
 		002884D80EFABFE60083E387 /* SkFontHost_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkFontHost_none.cpp; path = ../../src/ports/SkFontHost_none.cpp; sourceTree = SOURCE_ROOT; };
+		004447A10EFC1DB400116F7C /* SkCreateCGImageRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkCreateCGImageRef.cpp; path = ../../src/utils/mac/SkCreateCGImageRef.cpp; sourceTree = SOURCE_ROOT; };
 		0156F80307C56A3000C6122B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
 		01FC44D407BD3BB800D228F4 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = "<absolute>"; };
 		0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -111,6 +113,7 @@
 		20286C29FDCF999611CA2CEA /* CICarbonSample */ = {
 			isa = PBXGroup;
 			children = (
+				004447A10EFC1DB400116F7C /* SkCreateCGImageRef.cpp */,
 				002884D80EFABFE60083E387 /* SkFontHost_none.cpp */,
 				20286C2AFDCF999611CA2CEA /* Sources */,
 				20286C2CFDCF999611CA2CEA /* Resources */,
@@ -241,6 +244,7 @@
 				8D0C4E900486CD37000505A6 /* main.c in Sources */,
 				002884150EFA97F80083E387 /* test.cpp in Sources */,
 				002884D90EFABFE60083E387 /* SkFontHost_none.cpp in Sources */,
+				004447A20EFC1DB400116F7C /* SkCreateCGImageRef.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/xcode/maccore/maccore.xcodeproj/project.pbxproj b/xcode/maccore/maccore.xcodeproj/project.pbxproj
index 9068a70..f5bba1b 100644
--- a/xcode/maccore/maccore.xcodeproj/project.pbxproj
+++ b/xcode/maccore/maccore.xcodeproj/project.pbxproj
@@ -11,7 +11,6 @@
 		002884A60EFAB5DE0083E387 /* SkThread_pthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002884A30EFAB5DE0083E387 /* SkThread_pthread.cpp */; };
 		002884A70EFAB5DE0083E387 /* SkTime_Unix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002884A40EFAB5DE0083E387 /* SkTime_Unix.cpp */; };
 		002884E10EFABFFC0083E387 /* SkGlobals_global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002884E00EFABFFC0083E387 /* SkGlobals_global.cpp */; };
-		002885130EFAD89B0083E387 /* SkCreateCGImageRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002885120EFAD89B0083E387 /* SkCreateCGImageRef.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -19,7 +18,6 @@
 		002884A30EFAB5DE0083E387 /* SkThread_pthread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkThread_pthread.cpp; path = ../../src/ports/SkThread_pthread.cpp; sourceTree = SOURCE_ROOT; };
 		002884A40EFAB5DE0083E387 /* SkTime_Unix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkTime_Unix.cpp; path = ../../src/ports/SkTime_Unix.cpp; sourceTree = SOURCE_ROOT; };
 		002884E00EFABFFC0083E387 /* SkGlobals_global.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkGlobals_global.cpp; path = ../../src/ports/SkGlobals_global.cpp; sourceTree = SOURCE_ROOT; };
-		002885120EFAD89B0083E387 /* SkCreateCGImageRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkCreateCGImageRef.cpp; path = ../../src/utils/mac/SkCreateCGImageRef.cpp; sourceTree = SOURCE_ROOT; };
 		D2AAC046055464E500DB518D /* libmaccore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libmaccore.a; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -34,18 +32,9 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		002885110EFAD8840083E387 /* utils */ = {
-			isa = PBXGroup;
-			children = (
-				002885120EFAD89B0083E387 /* SkCreateCGImageRef.cpp */,
-			);
-			name = utils;
-			sourceTree = "<group>";
-		};
 		08FB7794FE84155DC02AAC07 /* maccore */ = {
 			isa = PBXGroup;
 			children = (
-				002885110EFAD8840083E387 /* utils */,
 				08FB7795FE84155DC02AAC07 /* Source */,
 				C6A0FF2B0290797F04C91782 /* Documentation */,
 				1AB674ADFE9D54B511CA2CBB /* Products */,
@@ -135,7 +124,6 @@
 				002884A60EFAB5DE0083E387 /* SkThread_pthread.cpp in Sources */,
 				002884A70EFAB5DE0083E387 /* SkTime_Unix.cpp in Sources */,
 				002884E10EFABFFC0083E387 /* SkGlobals_global.cpp in Sources */,
-				002885130EFAD89B0083E387 /* SkCreateCGImageRef.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};