void SVGResourceFilter::applyFilter(GraphicsContext*& context, const RenderObject*) { if (!m_savedContext) return; context = m_savedContext; m_savedContext = 0; #if !PLATFORM(CG) m_sourceGraphicBuffer->transformColorSpace(DeviceRGB, LinearRGB); #endif FilterEffect* lastEffect = m_filterBuilder->lastEffect(); if (lastEffect && !m_filterBBox.isEmpty() && !lastEffect->subRegion().isEmpty()) { m_filter->setSourceImage(m_sourceGraphicBuffer.release()); lastEffect->apply(m_filter.get()); ImageBuffer* resultImage = lastEffect->resultImage(); if (resultImage) { #if !PLATFORM(CG) resultImage->transformColorSpace(LinearRGB, DeviceRGB); #endif context->drawImage(resultImage->image(), lastEffect->subRegion()); } } m_sourceGraphicBuffer.clear(); }
void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsContext*& context, unsigned short resourceMode) { ASSERT(object); ASSERT(context); #ifndef NDEBUG ASSERT(resourceMode == ApplyToDefaultMode); #else UNUSED_PARAM(resourceMode); #endif if (!m_filter.contains(object)) return; FilterData* filterData = m_filter.get(object); if (!filterData->builded) { if (!filterData->savedContext) { removeClientFromCache(object); return; } context = filterData->savedContext; filterData->savedContext = 0; #if !PLATFORM(CG) filterData->sourceGraphicBuffer->transformColorSpace(DeviceRGB, LinearRGB); #endif } FilterEffect* lastEffect = filterData->builder->lastEffect(); if (lastEffect && !filterData->boundaries.isEmpty() && !lastEffect->subRegion().isEmpty()) { // This is the real filtering of the object. It just needs to be called on the // initial filtering process. We just take the stored filter result on a // second drawing. if (!filterData->builded) { filterData->filter->setSourceImage(filterData->sourceGraphicBuffer.release()); lastEffect->apply(filterData->filter.get()); #if !PLATFORM(CG) ImageBuffer* resultImage = lastEffect->resultImage(); if (resultImage) resultImage->transformColorSpace(LinearRGB, DeviceRGB); #endif filterData->builded = true; } ImageBuffer* resultImage = lastEffect->resultImage(); if (resultImage) context->drawImageBuffer(resultImage, object->style()->colorSpace(), lastEffect->subRegion()); } filterData->sourceGraphicBuffer.clear(); }