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