15267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/*
25267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
35267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
45267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * modification, are permitted provided that the following conditions
65267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * are met:
75267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */
245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
25c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "config.h"
26c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "SkImageFilter.h"
28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FEBlend.h"
29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FEGaussianBlur.h"
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FEMerge.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FilterOperations.h"
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/ReferenceFilter.h"
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
34aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "platform/graphics/filters/SourceGraphic.h"
355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include <gtest/gtest.h>
365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)using testing::Test;
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class ImageFilterBuilderTest : public Test {
415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)protected:
425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void colorSpaceTest()
435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Build filter tree
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        RefPtr<ReferenceFilter> referenceFilter = ReferenceFilter::create();
465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Add a dummy source graphic input
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        RefPtr<FilterEffect> sourceEffect = referenceFilter->sourceGraphic();
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        sourceEffect->setOperatingColorSpace(ColorSpaceDeviceRGB);
505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Add a blur effect (with input : source)
525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        RefPtr<FilterEffect> blurEffect =
53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            FEGaussianBlur::create(referenceFilter.get(), 3.0f, 3.0f);
545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blurEffect->setOperatingColorSpace(ColorSpaceLinearRGB);
555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blurEffect->inputEffects().append(sourceEffect);
565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Add a blend effect (with inputs : blur, source)
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        RefPtr<FilterEffect> blendEffect =
59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            FEBlend::create(referenceFilter.get(), WebBlendModeNormal);
605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blendEffect->setOperatingColorSpace(ColorSpaceDeviceRGB);
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        FilterEffectVector& blendInputs = blendEffect->inputEffects();
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blendInputs.reserveCapacity(2);
635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blendInputs.append(sourceEffect);
645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        blendInputs.append(blurEffect);
655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Add a merge effect (with inputs : blur, blend)
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        RefPtr<FilterEffect> mergeEffect = FEMerge::create(referenceFilter.get());
685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        mergeEffect->setOperatingColorSpace(ColorSpaceLinearRGB);
695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        FilterEffectVector& mergeInputs = mergeEffect->inputEffects();
705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        mergeInputs.reserveCapacity(2);
715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        mergeInputs.append(blurEffect);
725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        mergeInputs.append(blendEffect);
73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        referenceFilter->setLastEffect(mergeEffect);
745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Get SkImageFilter resulting tree
765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        SkiaImageFilterBuilder builder;
773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        RefPtr<SkImageFilter> filter = builder.build(referenceFilter->lastEffect(), ColorSpaceDeviceRGB);
785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // Let's check that the resulting tree looks like this :
805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //      ColorSpace (Linear->Device) : CS (L->D)
815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //                |
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //             Merge (L)
835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |     |
845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |    CS (D->L)
855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |          |
865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |      Blend (D)
875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |       /    |
885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |  CS (L->D) |
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //              |  /         |
905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //             Blur (L)      |
915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //                 \         |
925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //               CS (D->L)   |
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //                   \       |
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        //                 Source Graphic (D)
955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(filter->countInputs(), 1); // Should be CS (L->D)
975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        SkImageFilter* child = filter->getInput(0); // Should be Merge
985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), false);
995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 2);
1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        child = child->getInput(1); // Should be CS (D->L)
1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), true);
1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 1);
1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        child = child->getInput(0); // Should be Blend
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), false);
1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 2);
1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        child = child->getInput(0); // Should be CS (L->D)
1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), true);
1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 1);
1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        child = child->getInput(0); // Should be Blur
1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), false);
1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 1);
1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        child = child->getInput(0); // Should be CS (D->L)
1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->asColorFilter(0), true);
1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EXPECT_EQ(child->countInputs(), 1);
1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)};
1175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)namespace {
1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)TEST_F(ImageFilterBuilderTest, testColorSpace)
1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    colorSpaceTest();
1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} // namespace
126