Home | History | Annotate | Download | only in filters
      1 /*
      2  * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann (at) kde.org>
      3  * Copyright (C) 2004, 2005 Rob Buis <buis (at) kde.org>
      4  * Copyright (C) 2005 Eric Seidel <eric (at) webkit.org>
      5  * Copyright (C) 2013 Google Inc. All rights reserved.
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Library General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Library General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Library General Public License
     18  * along with this library; see the file COPYING.LIB.  If not, write to
     19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     20  * Boston, MA 02110-1301, USA.
     21  */
     22 
     23 #include "config.h"
     24 #include "platform/graphics/filters/FEMerge.h"
     25 
     26 #include "SkMergeImageFilter.h"
     27 #include "platform/graphics/GraphicsContext.h"
     28 #include "platform/graphics/filters/SkiaImageFilterBuilder.h"
     29 #include "platform/text/TextStream.h"
     30 #include "wtf/OwnPtr.h"
     31 
     32 namespace blink {
     33 
     34 FEMerge::FEMerge(Filter* filter)
     35     : FilterEffect(filter)
     36 {
     37 }
     38 
     39 PassRefPtr<FEMerge> FEMerge::create(Filter* filter)
     40 {
     41     return adoptRef(new FEMerge(filter));
     42 }
     43 
     44 void FEMerge::applySoftware()
     45 {
     46     unsigned size = numberOfEffectInputs();
     47     ASSERT(size > 0);
     48 
     49     ImageBuffer* resultImage = createImageBufferResult();
     50     if (!resultImage)
     51         return;
     52 
     53     GraphicsContext* filterContext = resultImage->context();
     54     for (unsigned i = 0; i < size; ++i) {
     55         FilterEffect* in = inputEffect(i);
     56         filterContext->drawImageBuffer(in->asImageBuffer(), drawingRegionOfInputImage(in->absolutePaintRect()));
     57     }
     58 }
     59 
     60 PassRefPtr<SkImageFilter> FEMerge::createImageFilter(SkiaImageFilterBuilder* builder)
     61 {
     62     unsigned size = numberOfEffectInputs();
     63 
     64     OwnPtr<RefPtr<SkImageFilter>[]> inputRefs = adoptArrayPtr(new RefPtr<SkImageFilter>[size]);
     65     OwnPtr<SkImageFilter*[]> inputs = adoptArrayPtr(new SkImageFilter*[size]);
     66     for (unsigned i = 0; i < size; ++i) {
     67         inputRefs[i] = builder->build(inputEffect(i), operatingColorSpace());
     68         inputs[i] = inputRefs[i].get();
     69     }
     70     SkImageFilter::CropRect rect = getCropRect(builder->cropOffset());
     71     return adoptRef(SkMergeImageFilter::Create(inputs.get(), size, 0, &rect));
     72 }
     73 
     74 TextStream& FEMerge::externalRepresentation(TextStream& ts, int indent) const
     75 {
     76     writeIndent(ts, indent);
     77     ts << "[feMerge";
     78     FilterEffect::externalRepresentation(ts);
     79     unsigned size = numberOfEffectInputs();
     80     ASSERT(size > 0);
     81     ts << " mergeNodes=\"" << size << "\"]\n";
     82     for (unsigned i = 0; i < size; ++i)
     83         inputEffect(i)->externalRepresentation(ts, indent + 1);
     84     return ts;
     85 }
     86 
     87 } // namespace blink
     88