Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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 std::shared_ptr<const struct __CFString> SafeCfString;
00055
00057 class SafeNsString {
00058 public:
00059 SafeNsString() {}
00061 SafeNsString( 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( NSString *ptr );
00070
00071 std::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 std::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
00129 CFAttributedStringRef createCfAttributedString( const std::string &str, const cinder::Font &font, const ColorA &color );
00131 CFAttributedStringRef createCfAttributedString( const std::string &str, const cinder::Font &font, const ColorA &color, bool ligate );
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 std::shared_ptr<class ImageSourceCgImage> ImageSourceCgImageRef;
00162
00163 class ImageSourceCgImage : public ImageSource {
00164 public:
00166 static ImageSourceCgImageRef createRef( ::CGImageRef imageRef, ImageSource::Options options = ImageSource::Options() );
00167 virtual ~ImageSourceCgImage() {}
00168
00169 virtual void load( ImageTargetRef target );
00170
00171 protected:
00173 ImageSourceCgImage( ::CGImageRef imageRef, ImageSource::Options options );
00174
00175 bool mIsIndexed, mIs16BitPacked;
00176 Color8u mColorTable[256];
00177 std::shared_ptr<CGImage> mImageRef;
00178
00179 uint16_t m16BitPackedRedOffset, m16BitPackedGreenOffset, m16BitPackedBlueOffset;
00180 };
00181
00182 ImageSourceCgImageRef createImageSource( ::CGImageRef imageRef, ImageSource::Options = ImageSource::Options() );
00183
00184
00185 typedef std::shared_ptr<class ImageTargetCgImage> ImageTargetCgImageRef;
00186
00187 class ImageTargetCgImage : public ImageTarget {
00188 public:
00189 static ImageTargetCgImageRef createRef( ImageSourceRef imageSource, ImageTarget::Options options );
00190 ~ImageTargetCgImage();
00191
00192 virtual void* getRowPointer( int32_t row );
00193 virtual void finalize();
00194
00195 ::CGImageRef getCgImage() const { return mImageRef; }
00196
00197 protected:
00198 ImageTargetCgImage( ImageSourceRef imageSource, ImageTarget::Options options );
00199
00200 ::CGImageRef mImageRef;
00201 size_t mBitsPerComponent, mBitsPerPixel, mRowBytes;
00202 ::CGBitmapInfo mBitmapInfo;
00203 ::CFMutableDataRef mDataRef;
00204 uint8_t *mDataPtr;
00205 };
00206
00208 ::CGImageRef createCgImage( ImageSourceRef imageSource, ImageTarget::Options = ImageTarget::Options() );
00209
00210
00211 } }
00212
00213 namespace cinder {
00214
00216 class SurfaceConstraintsCgBitmapContext : public cinder::SurfaceConstraints {
00217 public:
00218 virtual SurfaceChannelOrder getChannelOrder( bool alpha ) const;
00219 virtual int32_t getRowBytes( int requestedWidth, const SurfaceChannelOrder &sco, int elementSize ) const;
00220 };
00222
00223 }