NativeImagePtr ImageBuffer::copyNativeImage(BackingStoreCopy copyBehavior) const { CGImageRef image = 0; if (!m_context->isAcceleratedContext()) { switch (copyBehavior) { case DontCopyBackingStore: image = CGImageCreate(internalSize().width(), internalSize().height(), 8, 32, m_data.m_bytesPerRow.unsafeGet(), m_data.m_colorSpace, m_data.m_bitmapInfo, m_data.m_dataProvider.get(), 0, true, kCGRenderingIntentDefault); break; case CopyBackingStore: image = CGBitmapContextCreateImage(context()->platformContext()); break; default: ASSERT_NOT_REACHED(); break; } } #if USE(IOSURFACE_CANVAS_BACKING_STORE) else { image = wkIOSurfaceContextCreateImage(context()->platformContext()); #if defined(BUILDING_ON_LION) m_data.m_lastFlushTime = currentTimeMS(); #endif } #endif return image; }
PassRefPtr<Image> ImageBuffer::copyImage() const { // BitmapImage will release the passed in CGImage on destruction CGImageRef ctxImage = 0; if (!m_accelerateRendering) ctxImage = CGBitmapContextCreateImage(context()->platformContext()); #if USE(IOSURFACE_CANVAS_BACKING_STORE) else ctxImage = wkIOSurfaceContextCreateImage(context()->platformContext()); #endif return BitmapImage::create(ctxImage); }
void ImageBuffer::clip(GraphicsContext* context, const FloatRect& rect) const { CGContextRef platformContext = context->platformContext(); RetainPtr<CGImageRef> image; if (!m_accelerateRendering) image.adoptCF(cgImage(m_size, m_data)); #if USE(IOSURFACE_CANVAS_BACKING_STORE) else image.adoptCF(wkIOSurfaceContextCreateImage(platformContext)); #endif CGContextTranslateCTM(platformContext, rect.x(), rect.y() + rect.height()); CGContextScaleCTM(platformContext, 1, -1); CGContextClipToMask(platformContext, FloatRect(FloatPoint(), rect.size()), image.get()); CGContextScaleCTM(platformContext, 1, -1); CGContextTranslateCTM(platformContext, -rect.x(), -rect.y() - rect.height()); }
String ImageBuffer::toDataURL(const String& mimeType, const double* quality) const { ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType)); RetainPtr<CGImageRef> image; if (!m_accelerateRendering) image.adoptCF(CGBitmapContextCreateImage(context()->platformContext())); #if USE(IOSURFACE_CANVAS_BACKING_STORE) else image.adoptCF(wkIOSurfaceContextCreateImage(context()->platformContext())); #endif if (!image) return "data:,"; RetainPtr<CFMutableDataRef> data(AdoptCF, CFDataCreateMutable(kCFAllocatorDefault, 0)); if (!data) return "data:,"; RetainPtr<CFStringRef> uti = utiFromMIMEType(mimeType); ASSERT(uti); RetainPtr<CGImageDestinationRef> destination(AdoptCF, CGImageDestinationCreateWithData(data.get(), uti.get(), 1, 0)); if (!destination) return "data:,"; RetainPtr<CFDictionaryRef> imageProperties = 0; if (CFEqual(uti.get(), jpegUTI()) && quality && *quality >= 0.0 && *quality <= 1.0) { // Apply the compression quality to the image destination. RetainPtr<CFNumberRef> compressionQuality(AdoptCF, CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, quality)); const void* key = kCGImageDestinationLossyCompressionQuality; const void* value = compressionQuality.get(); imageProperties.adoptCF(CFDictionaryCreate(0, &key, &value, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); } CGImageDestinationAddImage(destination.get(), image.get(), imageProperties.get()); CGImageDestinationFinalize(destination.get()); Vector<char> out; base64Encode(reinterpret_cast<const char*>(CFDataGetBytePtr(data.get())), CFDataGetLength(data.get()), out); return makeString("data:", mimeType, ";base64,", out); }
NativeImagePtr ImageBuffer::copyNativeImage(BackingStoreCopy copyBehavior) const { CGImageRef image = 0; if (!m_accelerateRendering) { switch (copyBehavior) { case DontCopyBackingStore: image = CGImageCreate(m_size.width(), m_size.height(), 8, 32, m_data.m_bytesPerRow.unsafeGet(), m_data.m_colorSpace, m_data.m_bitmapInfo, m_data.m_dataProvider.get(), 0, true, kCGRenderingIntentDefault); break; case CopyBackingStore: image = CGBitmapContextCreateImage(context()->platformContext()); break; default: ASSERT_NOT_REACHED(); break; } } #if USE(IOSURFACE_CANVAS_BACKING_STORE) else image = wkIOSurfaceContextCreateImage(context()->platformContext()); #endif return image; }