15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
22a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/SourceAlpha.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/Color.h"
25a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
26a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/Filter.h"
27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/graphics/filters/SourceGraphic.h"
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextStream.h"
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/StdLibExtras.h"
337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/WTFString.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SourceAlpha> SourceAlpha::create(Filter* filter)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new SourceAlpha(filter));
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& SourceAlpha::effectName()
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(const AtomicString, s_effectName, ("SourceAlpha", AtomicString::ConstructFromLiteral));
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return s_effectName;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)FloatRect SourceAlpha::determineAbsolutePaintRect(const FloatRect& requestedRect)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatRect srcRect = filter()->sourceImageRect();
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    srcRect.intersect(requestedRect);
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    addAbsolutePaintRect(srcRect);
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return srcRect;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void SourceAlpha::applySoftware()
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ImageBuffer* resultImage = createImageBufferResult();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Filter* filter = this->filter();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resultImage || !filter->sourceImage())
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setIsAlphaImage(true);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect imageRect(FloatPoint(), absolutePaintRect().size());
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GraphicsContext* filterContext = resultImage->context();
675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    filterContext->fillRect(imageRect, Color::black);
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    IntRect srcRect = filter->sourceImageRect();
70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (ImageBuffer* sourceImageBuffer = filter->sourceImage()) {
71f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        filterContext->drawImageBuffer(sourceImageBuffer,
72f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            FloatRect(IntPoint(srcRect.location() - absolutePaintRect().location()), sourceImageBuffer->size()),
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            0, CompositeDestinationIn);
74f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<SkImageFilter> SourceAlpha::createImageFilter(SkiaImageFilterBuilder* builder)
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<SkImageFilter> sourceGraphic(builder->build(builder->sourceGraphic(), operatingColorSpace()));
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SkScalar matrix[20] = {
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        0, 0, 0, 0, 0,
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        0, 0, 0, 0, 0,
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        0, 0, 0, 0, 0,
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        0, 0, 0, SK_Scalar1, 0
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    };
8610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    RefPtr<SkColorFilter> colorFilter(adoptRef(SkColorMatrixFilter::Create(matrix)));
87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return adoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), sourceGraphic.get()));
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TextStream& SourceAlpha::externalRepresentation(TextStream& ts, int indent) const
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    writeIndent(ts, indent);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ts << "[SourceAlpha]\n";
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ts;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
98