void FEGaussianBlur::platformApplySoftware() { FilterEffect* in = inputEffect(0); Uint8ClampedArray* srcPixelArray = createPremultipliedImageResult(); if (!srcPixelArray) return; setIsAlphaImage(in->isAlphaImage()); IntRect effectDrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect()); in->copyPremultipliedImage(srcPixelArray, effectDrawingRect); if (!m_stdX && !m_stdY) return; unsigned kernelSizeX = 0; unsigned kernelSizeY = 0; calculateKernelSize(filter(), kernelSizeX, kernelSizeY, m_stdX, m_stdY); IntSize paintSize = absolutePaintRect().size(); RefPtr<Uint8ClampedArray> tmpImageData = Uint8ClampedArray::createUninitialized(paintSize.width() * paintSize.height() * 4); Uint8ClampedArray* tmpPixelArray = tmpImageData.get(); platformApply(srcPixelArray, tmpPixelArray, kernelSizeX, kernelSizeY, paintSize); }
void FEGaussianBlur::platformApplySoftware() { FilterEffect* in = inputEffect(0); Uint8ClampedArray* srcPixelArray = createPremultipliedImageResult(); if (!srcPixelArray) return; setIsAlphaImage(in->isAlphaImage()); IntRect effectDrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect()); in->copyPremultipliedImage(srcPixelArray, effectDrawingRect); if (!m_stdX && !m_stdY) return; IntSize kernelSize = calculateKernelSize(filter(), FloatPoint(m_stdX, m_stdY)); kernelSize.scale(filter().filterScale()); IntSize paintSize = absolutePaintRect().size(); paintSize.scale(filter().filterScale()); RefPtr<Uint8ClampedArray> tmpImageData = Uint8ClampedArray::createUninitialized((paintSize.area() * 4).unsafeGet()); if (!tmpImageData) { WTFLogAlways("FEGaussianBlur::platformApplySoftware Unable to create buffer. Requested size was %d x %d\n", paintSize.width(), paintSize.height()); return; } platformApply(srcPixelArray, tmpImageData.get(), kernelSize.width(), kernelSize.height(), paintSize); }
FloatRect FEGaussianBlur::mapRect(const FloatRect& rect, bool) { FloatRect result = rect; IntSize kernelSize = calculateKernelSize(filter(), FloatPoint(m_stdX, m_stdY)); // We take the half kernel size and multiply it with three, because we run box blur three times. result.inflateX(3 * kernelSize.width() * 0.5f); result.inflateY(3 * kernelSize.height() * 0.5f); return result; }
void FEGaussianBlur::determineAbsolutePaintRect() { FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect(); absolutePaintRect.intersect(maxEffectRect()); unsigned kernelSizeX = 0; unsigned kernelSizeY = 0; calculateKernelSize(filter(), kernelSizeX, kernelSizeY, m_stdX, m_stdY); // We take the half kernel size and multiply it with three, because we run box blur three times. absolutePaintRect.inflateX(3 * kernelSizeX * 0.5f); absolutePaintRect.inflateY(3 * kernelSizeY * 0.5f); setAbsolutePaintRect(enclosingIntRect(absolutePaintRect)); }
void FEGaussianBlur::determineAbsolutePaintRect() { IntSize kernelSize = calculateKernelSize(filter(), FloatPoint(m_stdX, m_stdY)); FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect(); // Edge modes other than 'none' do not inflate the affected paint rect. if (m_edgeMode != EDGEMODE_NONE) { setAbsolutePaintRect(enclosingIntRect(absolutePaintRect)); return; } // We take the half kernel size and multiply it with three, because we run box blur three times. absolutePaintRect.inflateX(3 * kernelSize.width() * 0.5f); absolutePaintRect.inflateY(3 * kernelSize.height() * 0.5f); if (clipsToBounds()) absolutePaintRect.intersect(maxEffectRect()); else absolutePaintRect.unite(maxEffectRect()); setAbsolutePaintRect(enclosingIntRect(absolutePaintRect)); }
> void ImageKernel<PixelType,InclusionTestType>::calculateKernelSkipData(const I4 & _parentImageWidth){ if(parentImageWidth==_parentImageWidth){return;} parentImageWidth=_parentImageWidth; kernelSize = calculateKernelSize(kernel); if(kernelSkipDataPtr!=nullptr){ Data::DataManager::release(kernelSkipDataPtr); kernelSkipDataPtr=nullptr; } kernelSkipDataPtrEnd=nullptr; kernelSkipDataPtr = static_cast<I4*>(Data::DataManager::getMemory(sizeof(I4) * (kernelSize+2))); kernelSkipDataPtrEnd=kernelSkipDataPtr+kernelSize+1; auto kernelSkipDataPtrTemp = const_cast<I4 *>(kernelSkipDataPtr); I4 kernelDataSkipNum = 0; I4 kernelDataCount = 0; auto dataPtr = kernel.getDataPtr(); for(I4 y=0; y<kernel.getHeight(); ++y){ //TODO: make this faster for(I4 x=0; x<kernel.getWidth(); ++x){ if(InclusionTestType::isIncluded(*dataPtr)==true){ kernelSkipDataPtrTemp[kernelDataCount] = kernelDataSkipNum; ++kernelDataCount; kernelDataSkipNum=1; }else{ ++kernelDataSkipNum; } ++dataPtr; } kernelDataSkipNum+=parentImageWidth-kernel.getWidth(); } kernelSkipDataPtrTemp[kernelDataCount] = 1; //TODO: assert(kernelDataCount==kernelSize); }