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 }
static void quartz_format(GVJ_t *job) { /* image destination -> data consumer -> job's gvdevice */ /* data provider <- job's imagedata */ CGDataConsumerRef data_consumer = CGDataConsumerCreate(job, &device_data_consumer_callbacks); CGImageDestinationRef image_destination = CGImageDestinationCreateWithDataConsumer(data_consumer, format_uti[job->device.id], 1, NULL); CGDataProviderRef data_provider = CGDataProviderCreateDirect(job->imagedata, BYTES_PER_PIXEL * job->width * job->height, &memory_data_provider_callbacks); /* add the bitmap image to the destination and save it */ CGColorSpaceRef color_space = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); CGImageRef image = CGImageCreate ( job->width, /* width in pixels */ job->height, /* height in pixels */ BITS_PER_COMPONENT, /* bits per component */ BYTES_PER_PIXEL * 8, /* bits per pixel */ BYTES_PER_PIXEL * job->width, /* bytes per row: exactly width # of pixels */ color_space, /* color space: sRGB */ kCGImageAlphaPremultipliedFirst, /* bitmap info: corresponds to CAIRO_FORMAT_ARGB32 */ data_provider, /* data provider: from imagedata */ NULL, /* decode: don't remap colors */ FALSE, /* don't interpolate */ kCGRenderingIntentDefault /* rendering intent (what to do with out-of-gamut colors): default */ ); CGImageDestinationAddImage(image_destination, image, NULL); CGImageDestinationFinalize(image_destination); /* clean up */ CGImageRelease(image); CGColorSpaceRelease(color_space); CGDataProviderRelease(data_provider); if (image_destination) CFRelease(image_destination); CGDataConsumerRelease(data_consumer); }
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 }
bool PDFDocumentImage::dataChanged(bool allDataReceived) { if (allDataReceived && !m_document) { #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> data(AdoptCF, this->data()->createCFData()); RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(data.get())); #else // Create a CGDataProvider to wrap the SharedBuffer. // 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, 0 }; RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateDirect(this->data(), this->data()->size(), &providerCallbacks)); #endif m_document = CGPDFDocumentCreateWithProvider(dataProvider.get()); setCurrentPage(0); } return m_document; // return true if size is available }