| 120 | } |
| 121 | |
| 122 | ImageTargetFileQuartz::ImageTargetFileQuartz( DataTargetRef dataTarget, ImageSourceRef imageSource, ImageTarget::Options options, const std::string &extensionData ) |
| 123 | : cocoa::ImageTargetCgImage( imageSource, options ) |
| 124 | { |
| 125 | cocoa::SafeCfString uti = cocoa::createSafeCfString( extensionData ); |
| 126 | |
| 127 | mImageDest = NULL; |
| 128 | if( dataTarget->providesFilePath() ) { |
| 129 | cocoa::SafeCfString pathString = cocoa::createSafeCfString( dataTarget->getFilePath().string() ); |
| 130 | const std::shared_ptr<__CFURL> urlRef( (__CFURL*)::CFURLCreateWithFileSystemPath( kCFAllocatorDefault, pathString.get(), kCFURLPOSIXPathStyle, false ), cocoa::safeCfRelease ); |
| 131 | mImageDest = ::CGImageDestinationCreateWithURL( urlRef.get(), uti.get(), 1, NULL ); |
| 132 | } |
| 133 | else if( dataTarget->providesUrl() ) { |
| 134 | std::shared_ptr<__CFURL> urlRef( (__CFURL*)cocoa::createCfUrl( dataTarget->getUrl() ), cocoa::safeCfRelease ); |
| 135 | mImageDest = ::CGImageDestinationCreateWithURL( urlRef.get(), uti.get(), 1, NULL ); |
| 136 | |
| 137 | } |
| 138 | else { // we'll wrap a cinder::OStream in a CGDataConsumer for output |
| 139 | OStreamRef *ostreamRef = new OStreamRef( dataTarget->getStream() ); |
| 140 | ::CGDataConsumerCallbacks callbacks; |
| 141 | callbacks.putBytes = cgDataConsumerPutBytes; |
| 142 | callbacks.releaseConsumer = cgDataConsumerRelease; |
| 143 | std::shared_ptr<CGDataConsumer> consumer( ::CGDataConsumerCreate( ostreamRef, &callbacks ), ::CGDataConsumerRelease ); |
| 144 | mImageDest = ::CGImageDestinationCreateWithDataConsumer( consumer.get(), uti.get(), 1, NULL ); |
| 145 | } |
| 146 | |
| 147 | if( ! mImageDest ) |
| 148 | throw ImageIoExceptionFailedWrite( "Failed to write CGImageDestinationRef." ); |
| 149 | |
| 150 | setupImageDestOptions( options ); |
| 151 | } |
| 152 | |
| 153 | void ImageTargetFileQuartz::finalize() |
| 154 | { |