00001 /* 00002 Copyright (c) 2010, The Barbarian Group 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that 00006 the following conditions are met: 00007 00008 * Redistributions of source code must retain the above copyright notice, this list of conditions and 00009 the following disclaimer. 00010 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 00011 the following disclaimer in the documentation and/or other materials provided with the distribution. 00012 00013 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 00014 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00015 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 00016 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00017 TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00018 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00019 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00020 POSSIBILITY OF SUCH DAMAGE. 00021 */ 00022 00023 #pragma once 00024 00025 #include "cinder/Cinder.h" 00026 #include "cinder/Surface.h" 00027 #include "cinder/Shape2d.h" 00028 #include "cinder/Color.h" 00029 #include "cinder/Buffer.h" 00030 #include "cinder/ImageIo.h" 00031 namespace cinder { 00032 class Url; 00033 class Font; 00034 } 00035 00036 #if defined( CINDER_COCOA_TOUCH ) 00037 #include <CoreGraphics/CoreGraphics.h> 00038 #else 00039 #include <ApplicationServices/ApplicationServices.h> 00040 #endif 00041 #include <CoreFoundation/CoreFoundation.h> 00042 #if defined( __OBJC__ ) 00043 @class NSBitmapImageRep; 00044 @class NSString; 00045 @class NSData; 00046 #else 00047 class NSBitmapImageRep; 00048 class NSString; 00049 class NSData; 00050 #endif 00051 00052 namespace cinder { namespace cocoa { 00053 00054 typedef shared_ptr<const struct __CFString> SafeCfString; 00055 00057 class SafeNsString { 00058 public: 00059 SafeNsString() {} 00061 SafeNsString( const NSString *str ); 00063 SafeNsString( const std::string &str ); 00064 00065 operator NSString* const() { if( mPtr ) return mPtr.get(); else return 0; } 00066 operator std::string() const; 00067 00068 private: 00069 static void safeRelease( const NSString *ptr ); 00070 00071 shared_ptr<NSString> mPtr; 00072 }; 00073 00075 class SafeNsData { 00076 public: 00077 SafeNsData() {} 00079 SafeNsData( const Buffer &buffer ); 00080 00081 operator NSData* const() { if( mPtr ) return mPtr.get(); else return 0; } 00082 00083 private: 00084 static void safeRelease( const NSData *ptr ); 00085 00086 shared_ptr<NSData> mPtr; 00087 const Buffer mBuffer; 00088 }; 00089 00091 class SafeNsAutoreleasePool { 00092 public: 00093 SafeNsAutoreleasePool(); 00094 ~SafeNsAutoreleasePool(); 00095 00096 private: 00097 void *mPool; 00098 }; 00099 00101 void safeCfRelease( const CFTypeRef cfRef ); 00102 00104 void safeCocoaRelease( void *nsObject ); 00105 00108 CGContextRef createCgBitmapContext( const Surface8u &surface ); 00109 00110 #if defined( CINDER_MAC ) 00111 00114 Surface8u convertNsBitmapDataRep( const NSBitmapImageRep *rep, bool assumeOwnership = false ); 00115 #endif 00116 00118 std::string convertCfString( CFStringRef str ); 00120 CFStringRef createCfString( const std::string &str ); 00122 SafeCfString createSafeCfString( const std::string &str ); 00124 std::string convertNsString( NSString *str ); 00126 CFURLRef createCfUrl( const cinder::Url &url ); 00127 00128 #if defined( CINDER_MAC ) 00129 00130 CFAttributedStringRef createCfAttributedString( const std::string &str, const cinder::Font &font, const ColorA &color ); 00131 #endif 00132 00134 CGColorRef createCgColor( const Color &color ); 00136 CGColorRef createCgColor( const ColorA &color ); 00137 00139 CGRect createCgRect( const Area &area ); 00141 Area CgRectToArea( const CGRect &rect ); 00142 00144 inline CGSize createCgSize( const Vec2i &s ) { CGSize result; result.width = s.x; result.height = s.y; return result; } 00146 inline CGSize createCgSize( const Vec2f &s ) { CGSize result; result.width = s.x; result.height = s.y; return result; } 00147 00149 void convertCgPath( CGPathRef cgPath, Shape2d *resultShape, bool flipVertical = true ); 00150 00151 #if defined( CINDER_MAC ) 00152 00154 int getCvPixelFormatTypeFromSurfaceChannelOrder( const SurfaceChannelOrder &sco ); 00155 #endif 00156 00158 CFDataRef createCfDataRef( const cinder::Buffer &buffer ); 00159 00160 00161 typedef shared_ptr<class ImageSourceCgImage> ImageSourceCgImageRef; 00162 00163 class ImageSourceCgImage : public ImageSource { 00164 public: 00166 static ImageSourceCgImageRef createRef( ::CGImageRef imageRef ); 00167 virtual ~ImageSourceCgImage() {} 00168 00169 virtual void load( ImageTargetRef target ); 00170 00171 protected: 00173 ImageSourceCgImage( ::CGImageRef imageRef ); 00174 00175 bool mIsIndexed; 00176 Color8u mColorTable[256]; 00177 shared_ptr<CGImage> mImageRef; 00178 }; 00179 00180 ImageSourceCgImageRef createImageSource( ::CGImageRef imageRef ); 00181 00182 00183 typedef shared_ptr<class ImageTargetCgImage> ImageTargetCgImageRef; 00184 00185 class ImageTargetCgImage : public ImageTarget { 00186 public: 00187 static ImageTargetCgImageRef createRef( ImageSourceRef imageSource ); 00188 ~ImageTargetCgImage(); 00189 00190 virtual void* getRowPointer( int32_t row ); 00191 virtual void finalize(); 00192 00193 ::CGImageRef getCgImage() const { return mImageRef; } 00194 00195 protected: 00196 ImageTargetCgImage( ImageSourceRef imageSource ); 00197 00198 ::CGImageRef mImageRef; 00199 size_t mBitsPerComponent, mBitsPerPixel, mRowBytes; 00200 ::CGBitmapInfo mBitmapInfo; 00201 ::CFMutableDataRef mDataRef; 00202 uint8_t *mDataPtr; 00203 }; 00204 00206 ::CGImageRef createCgImage( ImageSourceRef imageSource ); 00207 00208 00209 } } // namespace cinder::cocoa 00210 00211 namespace cinder { 00212 00214 class SurfaceConstraintsCgBitmapContext : public cinder::SurfaceConstraints { 00215 public: 00216 virtual SurfaceChannelOrder getChannelOrder( bool alpha ) const; 00217 virtual int32_t getRowBytes( int requestedWidth, const SurfaceChannelOrder &sco, int elementSize ) const; 00218 }; 00220 00221 } // namespace cinder