void ImageSource::setData(SharedBuffer* data, bool allDataReceived) { #if PLATFORM(MAC) if (!m_decoder) m_decoder = CGImageSourceCreateIncremental(0); // On Mac the NSData inside the SharedBuffer can be secretly appended to without the SharedBuffer's knowledge. We use SharedBuffer's ability // to wrap itself inside CFData to get around this, ensuring that ImageIO is really looking at the SharedBuffer. RetainPtr<CFDataRef> cfData(AdoptCF, data->createCFData()); CGImageSourceUpdateData(m_decoder, cfData.get(), allDataReceived); #else if (!m_decoder) { m_decoder = CGImageSourceCreateIncremental(0); } else if (allDataReceived) { #if !PLATFORM(WIN) // 10.6 bug workaround: image sources with final=false fail to draw into PDF contexts, so re-create image source // when data is complete. <rdar://problem/7874035> (<http://openradar.appspot.com/7874035>) CFRelease(m_decoder); m_decoder = CGImageSourceCreateIncremental(0); #endif } // Create a CGDataProvider to wrap the SharedBuffer. data->ref(); // We use the GetBytesAtPosition callback rather than the GetBytePointer one because SharedBuffer // does not provide a way to lock down the byte pointer and guarantee that it won't move, which // is a requirement for using the GetBytePointer callback. CGDataProviderDirectCallbacks providerCallbacks = { 0, 0, 0, sharedBufferGetBytesAtPosition, sharedBufferRelease }; RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateDirect(data, data->size(), &providerCallbacks)); CGImageSourceUpdateDataProvider(m_decoder, dataProvider.get(), allDataReceived); #endif }
void ImageSource::setData(SharedBuffer* data, bool allDataReceived) { if (!m_decoder) m_decoder = CGImageSourceCreateIncremental(NULL); #if PLATFORM(MAC) // On Mac the NSData inside the SharedBuffer can be secretly appended to without the SharedBuffer's knowledge. We use SharedBuffer's ability // to wrap itself inside CFData to get around this, ensuring that ImageIO is really looking at the SharedBuffer. CFDataRef cfData = data->createCFData(); #else // If no NSData is available, then we know SharedBuffer will always just be a vector. That means no secret changes can occur to it behind the // scenes. We use CFDataCreateWithBytesNoCopy in that case. CFDataRef cfData = CFDataCreateWithBytesNoCopy(0, reinterpret_cast<const UInt8*>(data->data()), data->size(), kCFAllocatorNull); #endif CGImageSourceUpdateData(m_decoder, cfData, allDataReceived); CFRelease(cfData); }
void ImageSource::setData(SharedBuffer* data, bool allDataReceived) { if (!m_decoder) m_decoder = CGImageSourceCreateIncremental(NULL); #if PLATFORM(MAC) // On Mac the NSData inside the SharedBuffer can be secretly appended to without the SharedBuffer's knowledge. We use SharedBuffer's ability // to wrap itself inside CFData to get around this, ensuring that ImageIO is really looking at the SharedBuffer. RetainPtr<CFDataRef> cfData(AdoptCF, data->createCFData()); CGImageSourceUpdateData(m_decoder, cfData.get(), allDataReceived); #else // Create a CGDataProvider to wrap the SharedBuffer. data->ref(); // We use the GetBytesAtPosition callback rather than the GetBytePointer one because SharedBuffer // does not provide a way to lock down the byte pointer and guarantee that it won't move, which // is a requirement for using the GetBytePointer callback. CGDataProviderDirectCallbacks providerCallbacks = { 0, 0, 0, sharedBufferGetBytesAtPosition, sharedBufferRelease }; RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateDirect(data, data->size(), &providerCallbacks)); CGImageSourceUpdateDataProvider(m_decoder, dataProvider.get(), allDataReceived); #endif }
void ImageDecoder::setData(SharedBuffer& data, bool allDataReceived) { m_isAllDataReceived = allDataReceived; #if PLATFORM(COCOA) // On Mac the NSData inside the SharedBuffer can be secretly appended to without the SharedBuffer's knowledge. // We use SharedBuffer's ability to wrap itself inside CFData to get around this, ensuring that ImageIO is // really looking at the SharedBuffer. CGImageSourceUpdateData(m_nativeDecoder.get(), data.createCFData().get(), allDataReceived); #else // Create a CGDataProvider to wrap the SharedBuffer. data.ref(); // We use the GetBytesAtPosition callback rather than the GetBytePointer one because SharedBuffer // does not provide a way to lock down the byte pointer and guarantee that it won't move, which // is a requirement for using the GetBytePointer callback. CGDataProviderDirectCallbacks providerCallbacks = { 0, 0, 0, sharedBufferGetBytesAtPosition, sharedBufferRelease }; RetainPtr<CGDataProviderRef> dataProvider = adoptCF(CGDataProviderCreateDirect(&data, data.size(), &providerCallbacks)); CGImageSourceUpdateDataProvider(m_nativeDecoder.get(), dataProvider.get(), allDataReceived); #endif }
void ImageSource::setData(NativeBytePtr data, bool allDataReceived) { if (!m_decoder) m_decoder = CGImageSourceCreateIncremental(imageSourceOptions()); CGImageSourceUpdateData(m_decoder, data, allDataReceived); }