diff options
Diffstat (limited to 'Source/WebKit2/Shared/cg')
-rw-r--r-- | Source/WebKit2/Shared/cg/ShareableBitmapCG.cpp | 44 | ||||
-rw-r--r-- | Source/WebKit2/Shared/cg/WebCoreArgumentCodersCG.cpp | 2 |
2 files changed, 41 insertions, 5 deletions
diff --git a/Source/WebKit2/Shared/cg/ShareableBitmapCG.cpp b/Source/WebKit2/Shared/cg/ShareableBitmapCG.cpp index 28ba7ea..6bcc108 100644 --- a/Source/WebKit2/Shared/cg/ShareableBitmapCG.cpp +++ b/Source/WebKit2/Shared/cg/ShareableBitmapCG.cpp @@ -34,14 +34,26 @@ using namespace WebCore; namespace WebKit { +static CGBitmapInfo bitmapInfo(ShareableBitmap::Flags flags) +{ + CGBitmapInfo info = kCGBitmapByteOrder32Host; + if (flags & ShareableBitmap::SupportsAlpha) + info |= kCGImageAlphaPremultipliedFirst; + else + info |= kCGImageAlphaNoneSkipFirst; + + return info; +} + PassOwnPtr<GraphicsContext> ShareableBitmap::createGraphicsContext() { RetainPtr<CGColorSpaceRef> colorSpace(AdoptCF, CGColorSpaceCreateDeviceRGB()); - ref(); // Balanced by deref in releaseData. + + ref(); // Balanced by deref in releaseBitmapContextData. RetainPtr<CGContextRef> bitmapContext(AdoptCF, CGBitmapContextCreateWithData(data(), m_size.width(), m_size.height(), 8, m_size.width() * 4, colorSpace.get(), - kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, releaseData, this)); + bitmapInfo(m_flags), releaseBitmapContextData, this)); // We want the origin to be in the top left corner so we flip the backing store context. CGContextTranslateCTM(bitmapContext.get(), 0, m_size.height()); @@ -52,14 +64,38 @@ PassOwnPtr<GraphicsContext> ShareableBitmap::createGraphicsContext() void ShareableBitmap::paint(WebCore::GraphicsContext& context, const IntPoint& dstPoint, const IntRect& srcRect) { - paintBitmapContext(context.platformContext(), createGraphicsContext()->platformContext(), dstPoint, srcRect); + paintImage(context.platformContext(), makeCGImageCopy().get(), dstPoint, srcRect); +} + +RetainPtr<CGImageRef> ShareableBitmap::makeCGImageCopy() +{ + OwnPtr<GraphicsContext> graphicsContext = createGraphicsContext(); + RetainPtr<CGImageRef> image(AdoptCF, CGBitmapContextCreateImage(graphicsContext->platformContext())); + return image; +} + +RetainPtr<CGImageRef> ShareableBitmap::makeCGImage() +{ + ref(); // Balanced by deref in releaseDataProviderData. + RetainPtr<CGDataProvider> dataProvider(AdoptCF, CGDataProviderCreateWithData(this, data(), sizeInBytes(), releaseDataProviderData)); + + RetainPtr<CGColorSpaceRef> colorSpace(AdoptCF, CGColorSpaceCreateDeviceRGB()); + RetainPtr<CGImageRef> image(AdoptCF, CGImageCreate(m_size.width(), m_size.height(), 8, 32, m_size.width() * 4, colorSpace.get(), bitmapInfo(m_flags), dataProvider.get(), 0, false, kCGRenderingIntentDefault)); + return image; } -void ShareableBitmap::releaseData(void* typelessBitmap, void* typelessData) +void ShareableBitmap::releaseBitmapContextData(void* typelessBitmap, void* typelessData) { ShareableBitmap* bitmap = static_cast<ShareableBitmap*>(typelessBitmap); ASSERT_UNUSED(typelessData, bitmap->data() == typelessData); bitmap->deref(); // Balanced by ref in createGraphicsContext. } +void ShareableBitmap::releaseDataProviderData(void* typelessBitmap, const void* typelessData, size_t) +{ + ShareableBitmap* bitmap = static_cast<ShareableBitmap*>(typelessBitmap); + ASSERT_UNUSED(typelessData, bitmap->data() == typelessData); + bitmap->deref(); // Balanced by ref in createCGImage. +} + } // namespace WebKit diff --git a/Source/WebKit2/Shared/cg/WebCoreArgumentCodersCG.cpp b/Source/WebKit2/Shared/cg/WebCoreArgumentCodersCG.cpp index 058cf51..fb1395f 100644 --- a/Source/WebKit2/Shared/cg/WebCoreArgumentCodersCG.cpp +++ b/Source/WebKit2/Shared/cg/WebCoreArgumentCodersCG.cpp @@ -36,7 +36,7 @@ namespace CoreIPC { RefPtr<Image> createImage(ShareableBitmap* bitmap) { - RetainPtr<CGImageRef> platformImage(AdoptCF, CGBitmapContextCreateImage(bitmap->createGraphicsContext()->platformContext())); + RetainPtr<CGImageRef> platformImage = bitmap->makeCGImage(); if (!platformImage) return 0; // BitmapImage::create adopts the CGImageRef that's passed in, which is why we need to leakRef here. |