blob: a85dfa29817648bf4c2972682c8c727e67795fae [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "core/platform/graphics/filters/FilterOperations.h"
#include <gtest/gtest.h>
#include "public/platform/WebFilterOperation.h"
#include "public/platform/WebFilterOperations.h"
using namespace WebCore;
using namespace WebKit;
namespace {
TEST(FilterOperationsTest, getOutsetsBlur)
{
FilterOperations ops;
ops.operations().append(BlurFilterOperation::create(Length(20.0, WebCore::Fixed), FilterOperation::BLUR));
EXPECT_TRUE(ops.hasOutsets());
FilterOutsets outsets = ops.outsets();
EXPECT_EQ(57, outsets.top());
EXPECT_EQ(57, outsets.right());
EXPECT_EQ(57, outsets.bottom());
EXPECT_EQ(57, outsets.left());
}
TEST(FilterOperationsTest, getOutsetsDropShadow)
{
FilterOperations ops;
ops.operations().append(DropShadowFilterOperation::create(IntPoint(3, 8), 20, Color(1, 2, 3), FilterOperation::DROP_SHADOW));
EXPECT_TRUE(ops.hasOutsets());
FilterOutsets outsets = ops.outsets();
EXPECT_EQ(49, outsets.top());
EXPECT_EQ(60, outsets.right());
EXPECT_EQ(65, outsets.bottom());
EXPECT_EQ(54, outsets.left());
}
TEST(WebFilterOperationsTest, getOutsetsBlur)
{
WebFilterOperations ops;
ops.append(WebFilterOperation::createBlurFilter(20));
int top, right, bottom, left;
top = right = bottom = left = 0;
ops.getOutsets(top, right, bottom, left);
EXPECT_EQ(57, top);
EXPECT_EQ(57, right);
EXPECT_EQ(57, bottom);
EXPECT_EQ(57, left);
}
TEST(WebFilterOperationsTest, getOutsetsDropShadow)
{
WebFilterOperations ops;
ops.append(WebFilterOperation::createDropShadowFilter(WebPoint(3, 8), 20, 0));
int top, right, bottom, left;
top = right = bottom = left = 0;
ops.getOutsets(top, right, bottom, left);
EXPECT_EQ(49, top);
EXPECT_EQ(60, right);
EXPECT_EQ(65, bottom);
EXPECT_EQ(54, left);
}
#define SAVE_RESTORE_AMOUNT(Type, a) \
{ \
WebFilterOperation op = WebFilterOperation::create##Type##Filter(a); \
EXPECT_EQ(WebFilterOperation::FilterType##Type, op.type()); \
EXPECT_EQ(a, op.amount()); \
\
WebFilterOperation op2 = WebFilterOperation::createEmptyFilter(); \
op2.setType(WebFilterOperation::FilterType##Type); \
\
EXPECT_NE(a, op2.amount()); \
\
op2.setAmount(a); \
\
EXPECT_EQ(WebFilterOperation::FilterType##Type, op2.type()); \
EXPECT_EQ(a, op2.amount()); \
}
#define SAVE_RESTORE_OFFSET_AMOUNT_COLOR(Type, a, b, c) \
{ \
WebFilterOperation op = WebFilterOperation::create##Type##Filter(a, b, c); \
EXPECT_EQ(WebFilterOperation::FilterType##Type, op.type()); \
EXPECT_EQ(a, op.dropShadowOffset()); \
EXPECT_EQ(b, op.amount()); \
EXPECT_EQ(c, op.dropShadowColor()); \
\
WebFilterOperation op2 = WebFilterOperation::createEmptyFilter(); \
op2.setType(WebFilterOperation::FilterType##Type); \
\
EXPECT_NE(a, op2.dropShadowOffset()); \
EXPECT_NE(b, op2.amount()); \
EXPECT_NE(c, op2.dropShadowColor()); \
\
op2.setDropShadowOffset(a); \
op2.setAmount(b); \
op2.setDropShadowColor(c); \
\
EXPECT_EQ(WebFilterOperation::FilterType##Type, op2.type()); \
EXPECT_EQ(a, op2.dropShadowOffset()); \
EXPECT_EQ(b, op2.amount()); \
EXPECT_EQ(c, op2.dropShadowColor()); \
}
#define SAVE_RESTORE_MATRIX(Type, a) \
{ \
WebFilterOperation op = WebFilterOperation::create##Type##Filter(a); \
EXPECT_EQ(WebFilterOperation::FilterType##Type, op.type()); \
for (unsigned i = 0; i < 20; ++i) \
EXPECT_EQ(a[i], op.matrix()[i]); \
\
WebFilterOperation op2 = WebFilterOperation::createEmptyFilter(); \
op2.setType(WebFilterOperation::FilterType##Type); \
\
for (unsigned i = 0; i < 20; ++i) \
EXPECT_NE(a[i], op2.matrix()[i]); \
\
op2.setMatrix(a); \
\
EXPECT_EQ(WebFilterOperation::FilterType##Type, op2.type()); \
for (unsigned i = 0; i < 20; ++i) \
EXPECT_EQ(a[i], op.matrix()[i]); \
}
#define SAVE_RESTORE_AMOUNT_INSET(Type, a, b) \
{ \
WebFilterOperation op = WebFilterOperation::create##Type##Filter(a, b); \
EXPECT_EQ(WebFilterOperation::FilterType##Type, op.type()); \
EXPECT_EQ(a, op.amount()); \
EXPECT_EQ(b, op.zoomInset()); \
\
WebFilterOperation op2 = WebFilterOperation::createEmptyFilter(); \
op2.setType(WebFilterOperation::FilterType##Type); \
\
EXPECT_NE(a, op2.amount()); \
EXPECT_NE(b, op2.zoomInset()); \
\
op2.setAmount(a); \
op2.setZoomInset(b); \
\
EXPECT_EQ(WebFilterOperation::FilterType##Type, op2.type()); \
EXPECT_EQ(a, op2.amount()); \
EXPECT_EQ(b, op2.zoomInset()); \
}
TEST(WebFilterOperationsTest, saveAndRestore)
{
SAVE_RESTORE_AMOUNT(Grayscale, 0.6f);
SAVE_RESTORE_AMOUNT(Sepia, 0.6f);
SAVE_RESTORE_AMOUNT(Saturate, 0.6f);
SAVE_RESTORE_AMOUNT(HueRotate, 0.6f);
SAVE_RESTORE_AMOUNT(Invert, 0.6f);
SAVE_RESTORE_AMOUNT(Brightness, 0.6f);
SAVE_RESTORE_AMOUNT(Contrast, 0.6f);
SAVE_RESTORE_AMOUNT(Opacity, 0.6f);
SAVE_RESTORE_AMOUNT(Blur, 0.6f);
SAVE_RESTORE_OFFSET_AMOUNT_COLOR(DropShadow, WebPoint(3, 4), 0.4f, 0xffffff00);
SkScalar matrix[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
SAVE_RESTORE_MATRIX(ColorMatrix, matrix);
SAVE_RESTORE_AMOUNT_INSET(Zoom, 0.5f, 32);
}
}