1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CC_OUTPUT_FILTER_OPERATION_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CC_OUTPUT_FILTER_OPERATION_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h"
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/scoped_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/base/cc_export.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "skia/ext/refptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/skia/include/core/SkColor.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/skia/include/core/SkRegion.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/skia/include/core/SkScalar.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/point.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace base {
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Value;
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace cc {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CC_EXPORT FilterOperation {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum FilterType {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GRAYSCALE,
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SEPIA,
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SATURATE,
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HUE_ROTATE,
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    INVERT,
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BRIGHTNESS,
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CONTRAST,
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OPACITY,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BLUR,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DROP_SHADOW,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    COLOR_MATRIX,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ZOOM,
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    REFERENCE,
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SATURATING_BRIGHTNESS,  // Not used in CSS/SVG.
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ALPHA_THRESHOLD,  // Not used in CSS/SVG.
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    FILTER_TYPE_LAST = ALPHA_THRESHOLD
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperation(const FilterOperation& other);
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ~FilterOperation();
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterType type() const { return type_; }
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  float amount() const {
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_NE(type_, COLOR_MATRIX);
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DCHECK_NE(type_, REFERENCE);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return amount_;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  float outer_threshold() const {
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DCHECK_EQ(type_, ALPHA_THRESHOLD);
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return outer_threshold_;
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Point drop_shadow_offset() const {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, DROP_SHADOW);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return drop_shadow_offset_;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SkColor drop_shadow_color() const {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, DROP_SHADOW);
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return drop_shadow_color_;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  skia::RefPtr<SkImageFilter> image_filter() const {
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DCHECK_EQ(type_, REFERENCE);
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return image_filter_;
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const SkScalar* matrix() const {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, COLOR_MATRIX);
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return matrix_;
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int zoom_inset() const {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, ZOOM);
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return zoom_inset_;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const SkRegion& region() const {
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DCHECK_EQ(type_, ALPHA_THRESHOLD);
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return region_;
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateGrayscaleFilter(float amount) {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(GRAYSCALE, amount);
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateSepiaFilter(float amount) {
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(SEPIA, amount);
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateSaturateFilter(float amount) {
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(SATURATE, amount);
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateHueRotateFilter(float amount) {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(HUE_ROTATE, amount);
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateInvertFilter(float amount) {
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(INVERT, amount);
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateBrightnessFilter(float amount) {
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(BRIGHTNESS, amount);
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateContrastFilter(float amount) {
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(CONTRAST, amount);
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateOpacityFilter(float amount) {
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(OPACITY, amount);
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateBlurFilter(float amount) {
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(BLUR, amount);
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static FilterOperation CreateDropShadowFilter(const gfx::Point& offset,
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                float std_deviation,
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                SkColor color) {
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(DROP_SHADOW, offset, std_deviation, color);
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateColorMatrixFilter(SkScalar matrix[20]) {
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(COLOR_MATRIX, matrix);
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateZoomFilter(float amount, int inset) {
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(ZOOM, amount, inset);
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static FilterOperation CreateReferenceFilter(
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const skia::RefPtr<SkImageFilter>& image_filter) {
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return FilterOperation(REFERENCE, image_filter);
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateSaturatingBrightnessFilter(float amount) {
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(SATURATING_BRIGHTNESS, amount);
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static FilterOperation CreateAlphaThresholdFilter(const SkRegion& region,
1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                    float inner_threshold,
1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                    float outer_threshold) {
1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return FilterOperation(ALPHA_THRESHOLD, region,
1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           inner_threshold, outer_threshold);
1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool operator==(const FilterOperation& other) const;
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool operator!=(const FilterOperation& other) const {
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return !(*this == other);
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Methods for restoring a FilterOperation.
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static FilterOperation CreateEmptyFilter() {
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FilterOperation(GRAYSCALE, 0.f);
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_type(FilterType type) { type_ = type; }
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_amount(float amount) {
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_NE(type_, COLOR_MATRIX);
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DCHECK_NE(type_, REFERENCE);
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    amount_ = amount;
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_outer_threshold(float outer_threshold) {
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DCHECK_EQ(type_, ALPHA_THRESHOLD);
1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    outer_threshold_ = outer_threshold;
1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_drop_shadow_offset(const gfx::Point& offset) {
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, DROP_SHADOW);
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    drop_shadow_offset_ = offset;
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_drop_shadow_color(SkColor color) {
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, DROP_SHADOW);
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    drop_shadow_color_ = color;
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void set_image_filter(const skia::RefPtr<SkImageFilter>& image_filter) {
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DCHECK_EQ(type_, REFERENCE);
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    image_filter_ = image_filter;
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_matrix(const SkScalar matrix[20]) {
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, COLOR_MATRIX);
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (unsigned i = 0; i < 20; ++i)
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      matrix_[i] = matrix[i];
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_zoom_inset(int inset) {
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK_EQ(type_, ZOOM);
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    zoom_inset_ = inset;
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_region(const SkRegion& region) {
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DCHECK_EQ(type_, ALPHA_THRESHOLD);
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    region_ = region;
2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Given two filters of the same type, returns a filter operation created by
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // linearly interpolating a |progress| fraction from |from| to |to|. If either
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |from| or |to| (but not both) is null, it is treated as a no-op filter of
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // the same type as the other given filter. If both |from| and |to| are null,
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // or if |from| and |to| are non-null but of different types, returns a
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // no-op filter.
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static FilterOperation Blend(const FilterOperation* from,
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const FilterOperation* to,
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               double progress);
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<base::Value> AsValue() const;
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperation(FilterType type, float amount);
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperation(FilterType type,
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  const gfx::Point& offset,
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  float stdDeviation,
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  SkColor color);
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperation(FilterType, SkScalar matrix[20]);
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperation(FilterType type, float amount, int inset);
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperation(FilterType type,
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  const skia::RefPtr<SkImageFilter>& image_filter);
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  FilterOperation(FilterType type,
2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                  const SkRegion& region,
2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                  float inner_threshold,
2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                  float outer_threshold);
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterType type_;
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  float amount_;
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  float outer_threshold_;
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Point drop_shadow_offset_;
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SkColor drop_shadow_color_;
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  skia::RefPtr<SkImageFilter> image_filter_;
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SkScalar matrix_[20];
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int zoom_inset_;
2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SkRegion region_;
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace cc
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CC_OUTPUT_FILTER_OPERATION_H_
259