summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp59
1 files changed, 31 insertions, 28 deletions
diff --git a/chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp b/chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp
index c5545830712..2ef679ccc9c 100644
--- a/chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp
+++ b/chromium/third_party/WebKit/Source/platform/graphics/filters/FEComponentTransfer.cpp
@@ -153,48 +153,51 @@ static void gamma(unsigned char* values, const ComponentTransferFunction& transf
void FEComponentTransfer::applySoftware()
{
FilterEffect* in = inputEffect(0);
-
- Uint8ClampedArray* pixelArray = createUnmultipliedImageResult();
- if (!pixelArray)
- return;
-
- unsigned char rValues[256], gValues[256], bValues[256], aValues[256];
- getValues(rValues, gValues, bValues, aValues);
- unsigned char* tables[] = { rValues, gValues, bValues, aValues };
-
- IntRect drawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
- in->copyUnmultipliedImage(pixelArray, drawingRect);
-
- unsigned pixelArrayLength = pixelArray->length();
- for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
- for (unsigned channel = 0; channel < 4; ++channel) {
- unsigned char c = pixelArray->item(pixelOffset + channel);
- pixelArray->set(pixelOffset + channel, tables[channel][c]);
- }
- }
-}
-
-bool FEComponentTransfer::applySkia()
-{
- FilterEffect* in = inputEffect(0);
ImageBuffer* resultImage = createImageBufferResult();
if (!resultImage)
- return false;
+ return;
RefPtr<Image> image = in->asImageBuffer()->copyImage(DontCopyBackingStore);
RefPtr<NativeImageSkia> nativeImage = image->nativeImageForCurrentFrame();
if (!nativeImage)
- return false;
+ return;
unsigned char rValues[256], gValues[256], bValues[256], aValues[256];
getValues(rValues, gValues, bValues, aValues);
+ IntRect destRect = drawingRegionOfInputImage(in->absolutePaintRect());
SkPaint paint;
paint.setColorFilter(SkTableColorFilter::CreateARGB(aValues, rValues, gValues, bValues))->unref();
paint.setXfermodeMode(SkXfermode::kSrc_Mode);
- resultImage->context()->drawBitmap(nativeImage->bitmap(), 0, 0, &paint);
+ resultImage->context()->drawBitmap(nativeImage->bitmap(), destRect.x(), destRect.y(), &paint);
- return true;
+ if (affectsTransparentPixels()) {
+ IntRect fullRect = IntRect(IntPoint(), absolutePaintRect().size());
+ resultImage->context()->clipOut(destRect);
+ resultImage->context()->fillRect(fullRect, Color(rValues[0], gValues[0], bValues[0], aValues[0]));
+ }
+}
+
+bool FEComponentTransfer::affectsTransparentPixels()
+{
+ double intercept = 0;
+ switch (m_alphaFunc.type) {
+ case FECOMPONENTTRANSFER_TYPE_UNKNOWN:
+ case FECOMPONENTTRANSFER_TYPE_IDENTITY:
+ break;
+ case FECOMPONENTTRANSFER_TYPE_TABLE:
+ case FECOMPONENTTRANSFER_TYPE_DISCRETE:
+ if (m_alphaFunc.tableValues.size() > 0)
+ intercept = m_alphaFunc.tableValues[0];
+ break;
+ case FECOMPONENTTRANSFER_TYPE_LINEAR:
+ intercept = m_alphaFunc.intercept;
+ break;
+ case FECOMPONENTTRANSFER_TYPE_GAMMA:
+ intercept = m_alphaFunc.offset;
+ break;
+ }
+ return 255 * intercept >= 1;
}
PassRefPtr<SkImageFilter> FEComponentTransfer::createImageFilter(SkiaImageFilterBuilder* builder)