Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(449)

Side by Side Diff: cc/output/filter_operations.cc

Issue 16968002: Move implementation of WebFilterOperations into cc (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <cmath>
6
7 #include "cc/output/filter_operation.h"
8 #include "cc/output/filter_operations.h"
9
10 namespace cc {
11
12 FilterOperations::FilterOperations() {}
13
14 FilterOperations::FilterOperations(const FilterOperations& other)
15 : operations_(other.operations_) {}
16
17 FilterOperations::~FilterOperations() {}
18
19 FilterOperations& FilterOperations::operator=(const FilterOperations& other) {
20 operations_ = other.operations_;
21 return *this;
22 }
23
24 bool FilterOperations::operator==(const FilterOperations& other) const {
25 if (other.size() != size())
26 return false;
27 for (size_t i = 0; i < size(); ++i) {
28 if (other.at(i) != at(i))
29 return false;
30 }
31 return true;
32 }
33
34 void FilterOperations::Append(const FilterOperation& filter) {
35 operations_.push_back(filter);
36 }
37
38 void FilterOperations::Clear() {
39 operations_.clear();
40 }
41
42 bool FilterOperations::IsEmpty() const {
43 return operations_.empty();
44 }
45
46 static int SpreadForStdDeviation(float std_deviation) {
47 // https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#feGaussianBlurE lement
48 // provides this approximation for evaluating a gaussian blur by a triple box
49 // filter.
50 float d = floorf(std_deviation * 3 * sqrt(8.f * atan(1.f)) / 4 + 0.5);
jamesr 2013/06/19 17:15:04 4.f, 0.5f
ajuma 2013/06/19 17:41:26 Done.
51 return static_cast<int>(ceilf(d * 3 / 2));
52 }
53
54 void FilterOperations::GetOutsets(int* top,
55 int* right,
56 int* bottom,
57 int* left) const {
58 *top = *right = *bottom = *left = 0;
59 for (size_t i = 0; i < operations_.size(); ++i) {
60 const FilterOperation op = operations_[i];
61 if (op.type() == FilterOperation::BLUR ||
62 op.type() == FilterOperation::DROP_SHADOW) {
63 int spread = SpreadForStdDeviation(op.amount());
64 if (op.type() == FilterOperation::BLUR) {
65 *top += spread;
66 *right += spread;
67 *bottom += spread;
68 *left += spread;
69 } else {
70 *top += spread - op.drop_shadow_offset().y();
71 *right += spread + op.drop_shadow_offset().x();
72 *bottom += spread + op.drop_shadow_offset().y();
73 *left += spread - op.drop_shadow_offset().x();
74 }
75 }
76 }
77 }
78
79 bool FilterOperations::HasFilterThatMovesPixels() const {
80 for (size_t i = 0; i < operations_.size(); ++i) {
81 const FilterOperation op = operations_[i];
82 switch (op.type()) {
83 case FilterOperation::BLUR:
84 case FilterOperation::DROP_SHADOW:
85 case FilterOperation::ZOOM:
86 return true;
87 default:
88 break;
89 }
90 }
91 return false;
92 }
93
94 bool FilterOperations::HasFilterThatAffectsOpacity() const {
95 for (size_t i = 0; i < operations_.size(); ++i) {
96 const FilterOperation op = operations_[i];
97 switch (op.type()) {
98 case FilterOperation::OPACITY:
99 case FilterOperation::BLUR:
100 case FilterOperation::DROP_SHADOW:
101 case FilterOperation::ZOOM:
102 return true;
103 case FilterOperation::COLOR_MATRIX: {
104 const SkScalar* matrix = op.matrix();
105 return matrix[15] || matrix[16] || matrix[17] || matrix[18] != 1 ||
106 matrix[19];
107 }
108 default:
109 break;
110 }
111 }
112 return false;
113 }
114
115 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698