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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp

Issue 2335253002: Push CompositorFilterOperations creation out of GraphicsLayer (Closed)
Patch Set: The right FilterOperations Created 4 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 93 }
94 94
95 void buildSourceGraphic(FilterEffect* sourceGraphic, sk_sp<SkPicture> picture) 95 void buildSourceGraphic(FilterEffect* sourceGraphic, sk_sp<SkPicture> picture)
96 { 96 {
97 ASSERT(picture); 97 ASSERT(picture);
98 SkRect cullRect = picture->cullRect(); 98 SkRect cullRect = picture->cullRect();
99 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(std::move(picture), cullRect); 99 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(std::move(picture), cullRect);
100 populateSourceGraphicImageFilters(sourceGraphic, std::move(filter), sourceGr aphic->operatingColorSpace()); 100 populateSourceGraphicImageFilters(sourceGraphic, std::move(filter), sourceGr aphic->operatingColorSpace());
101 } 101 }
102 102
103 void buildFilterOperations(const FilterOperations& operations, CompositorFilterO perations* filters) 103 CompositorFilterOperations buildFilterOperations(const FilterOperations& operati ons)
104 { 104 {
105 ColorSpace currentColorSpace = ColorSpaceDeviceRGB; 105 ColorSpace currentColorSpace = ColorSpaceDeviceRGB;
106 106
107 CompositorFilterOperations filters;
107 for (size_t i = 0; i < operations.size(); ++i) { 108 for (size_t i = 0; i < operations.size(); ++i) {
108 const FilterOperation& op = *operations.at(i); 109 const FilterOperation& op = *operations.at(i);
109 switch (op.type()) { 110 switch (op.type()) {
110 case FilterOperation::REFERENCE: { 111 case FilterOperation::REFERENCE: {
111 Filter* referenceFilter = toReferenceFilterOperation(op).getFilter() ; 112 Filter* referenceFilter = toReferenceFilterOperation(op).getFilter() ;
112 if (referenceFilter && referenceFilter->lastEffect()) { 113 if (referenceFilter && referenceFilter->lastEffect()) {
113 populateSourceGraphicImageFilters(referenceFilter->getSourceGrap hic(), nullptr, currentColorSpace); 114 populateSourceGraphicImageFilters(referenceFilter->getSourceGrap hic(), nullptr, currentColorSpace);
114 115
115 FilterEffect* filterEffect = referenceFilter->lastEffect(); 116 FilterEffect* filterEffect = referenceFilter->lastEffect();
116 currentColorSpace = filterEffect->operatingColorSpace(); 117 currentColorSpace = filterEffect->operatingColorSpace();
117 filters->appendReferenceFilter(SkiaImageFilterBuilder::build(fil terEffect, currentColorSpace)); 118 filters.appendReferenceFilter(SkiaImageFilterBuilder::build(filt erEffect, currentColorSpace));
118 } 119 }
119 break; 120 break;
120 } 121 }
121 case FilterOperation::GRAYSCALE: 122 case FilterOperation::GRAYSCALE:
122 case FilterOperation::SEPIA: 123 case FilterOperation::SEPIA:
123 case FilterOperation::SATURATE: 124 case FilterOperation::SATURATE:
124 case FilterOperation::HUE_ROTATE: { 125 case FilterOperation::HUE_ROTATE: {
125 float amount = toBasicColorMatrixFilterOperation(op).amount(); 126 float amount = toBasicColorMatrixFilterOperation(op).amount();
126 switch (op.type()) { 127 switch (op.type()) {
127 case FilterOperation::GRAYSCALE: 128 case FilterOperation::GRAYSCALE:
128 filters->appendGrayscaleFilter(amount); 129 filters.appendGrayscaleFilter(amount);
129 break; 130 break;
130 case FilterOperation::SEPIA: 131 case FilterOperation::SEPIA:
131 filters->appendSepiaFilter(amount); 132 filters.appendSepiaFilter(amount);
132 break; 133 break;
133 case FilterOperation::SATURATE: 134 case FilterOperation::SATURATE:
134 filters->appendSaturateFilter(amount); 135 filters.appendSaturateFilter(amount);
135 break; 136 break;
136 case FilterOperation::HUE_ROTATE: 137 case FilterOperation::HUE_ROTATE:
137 filters->appendHueRotateFilter(amount); 138 filters.appendHueRotateFilter(amount);
138 break; 139 break;
139 default: 140 default:
140 ASSERT_NOT_REACHED(); 141 ASSERT_NOT_REACHED();
141 } 142 }
142 break; 143 break;
143 } 144 }
144 case FilterOperation::INVERT: 145 case FilterOperation::INVERT:
145 case FilterOperation::OPACITY: 146 case FilterOperation::OPACITY:
146 case FilterOperation::BRIGHTNESS: 147 case FilterOperation::BRIGHTNESS:
147 case FilterOperation::CONTRAST: { 148 case FilterOperation::CONTRAST: {
148 float amount = toBasicComponentTransferFilterOperation(op).amount(); 149 float amount = toBasicComponentTransferFilterOperation(op).amount();
149 switch (op.type()) { 150 switch (op.type()) {
150 case FilterOperation::INVERT: 151 case FilterOperation::INVERT:
151 filters->appendInvertFilter(amount); 152 filters.appendInvertFilter(amount);
152 break; 153 break;
153 case FilterOperation::OPACITY: 154 case FilterOperation::OPACITY:
154 filters->appendOpacityFilter(amount); 155 filters.appendOpacityFilter(amount);
155 break; 156 break;
156 case FilterOperation::BRIGHTNESS: 157 case FilterOperation::BRIGHTNESS:
157 filters->appendBrightnessFilter(amount); 158 filters.appendBrightnessFilter(amount);
158 break; 159 break;
159 case FilterOperation::CONTRAST: 160 case FilterOperation::CONTRAST:
160 filters->appendContrastFilter(amount); 161 filters.appendContrastFilter(amount);
161 break; 162 break;
162 default: 163 default:
163 ASSERT_NOT_REACHED(); 164 ASSERT_NOT_REACHED();
164 } 165 }
165 break; 166 break;
166 } 167 }
167 case FilterOperation::BLUR: { 168 case FilterOperation::BLUR: {
168 float pixelRadius = toBlurFilterOperation(op).stdDeviation().getFloa tValue(); 169 float pixelRadius = toBlurFilterOperation(op).stdDeviation().getFloa tValue();
169 filters->appendBlurFilter(pixelRadius); 170 filters.appendBlurFilter(pixelRadius);
170 break; 171 break;
171 } 172 }
172 case FilterOperation::DROP_SHADOW: { 173 case FilterOperation::DROP_SHADOW: {
173 const DropShadowFilterOperation& drop = toDropShadowFilterOperation( op); 174 const DropShadowFilterOperation& drop = toDropShadowFilterOperation( op);
174 filters->appendDropShadowFilter(drop.location(), drop.stdDeviation() , drop.getColor()); 175 filters.appendDropShadowFilter(drop.location(), drop.stdDeviation(), drop.getColor());
175 break; 176 break;
176 } 177 }
177 case FilterOperation::BOX_REFLECT: { 178 case FilterOperation::BOX_REFLECT: {
178 // TODO(jbroman): Consider explaining box reflect to the compositor, 179 // TODO(jbroman): Consider explaining box reflect to the compositor,
179 // instead of calling this a "reference filter". 180 // instead of calling this a "reference filter".
180 const auto& reflection = toBoxReflectFilterOperation(op).reflection( ); 181 const auto& reflection = toBoxReflectFilterOperation(op).reflection( );
181 filters->appendReferenceFilter(buildBoxReflectFilter(reflection, nul lptr)); 182 filters.appendReferenceFilter(buildBoxReflectFilter(reflection, null ptr));
182 break; 183 break;
183 } 184 }
184 case FilterOperation::NONE: 185 case FilterOperation::NONE:
185 break; 186 break;
186 } 187 }
187 } 188 }
188 if (currentColorSpace != ColorSpaceDeviceRGB) { 189 if (currentColorSpace != ColorSpaceDeviceRGB) {
189 // Transform to device color space at the end of processing, if required 190 // Transform to device color space at the end of processing, if required
190 sk_sp<SkImageFilter> filter = transformColorSpace(nullptr, currentColorS pace, ColorSpaceDeviceRGB); 191 sk_sp<SkImageFilter> filter = transformColorSpace(nullptr, currentColorS pace, ColorSpaceDeviceRGB);
191 filters->appendReferenceFilter(std::move(filter)); 192 filters.appendReferenceFilter(std::move(filter));
192 } 193 }
194 return filters;
193 } 195 }
194 196
195 sk_sp<SkImageFilter> buildBoxReflectFilter(const BoxReflection& reflection, sk_s p<SkImageFilter> input) 197 sk_sp<SkImageFilter> buildBoxReflectFilter(const BoxReflection& reflection, sk_s p<SkImageFilter> input)
196 { 198 {
197 sk_sp<SkImageFilter> maskedInput; 199 sk_sp<SkImageFilter> maskedInput;
198 if (SkPicture* maskPicture = reflection.mask()) { 200 if (SkPicture* maskPicture = reflection.mask()) {
199 // SkXfermodeImageFilter can choose an excessively large size if the 201 // SkXfermodeImageFilter can choose an excessively large size if the
200 // mask is smaller than the filtered contents (due to overflow). 202 // mask is smaller than the filtered contents (due to overflow).
201 // http://skbug.com/5210 203 // http://skbug.com/5210
202 SkImageFilter::CropRect cropRect(maskPicture->cullRect()); 204 SkImageFilter::CropRect cropRect(maskPicture->cullRect());
203 maskedInput = SkXfermodeImageFilter::Make( 205 maskedInput = SkXfermodeImageFilter::Make(
204 SkXfermode::Make(SkXfermode::kSrcIn_Mode), 206 SkXfermode::Make(SkXfermode::kSrcIn_Mode),
205 SkPictureImageFilter::Make(sk_ref_sp(maskPicture)), 207 SkPictureImageFilter::Make(sk_ref_sp(maskPicture)),
206 input, &cropRect); 208 input, &cropRect);
207 } else { 209 } else {
208 maskedInput = input; 210 maskedInput = input;
209 } 211 }
210 sk_sp<SkImageFilter> flipImageFilter = SkImageFilter::MakeMatrixFilter( 212 sk_sp<SkImageFilter> flipImageFilter = SkImageFilter::MakeMatrixFilter(
211 reflection.reflectionMatrix(), kLow_SkFilterQuality, std::move(maskedInp ut)); 213 reflection.reflectionMatrix(), kLow_SkFilterQuality, std::move(maskedInp ut));
212 return SkXfermodeImageFilter::Make(nullptr, std::move(flipImageFilter), std: :move(input), nullptr); 214 return SkXfermodeImageFilter::Make(nullptr, std::move(flipImageFilter), std: :move(input), nullptr);
213 } 215 }
214 216
215 } // namespace SkiaImageFilterBuilder 217 } // namespace SkiaImageFilterBuilder
216 } // namespace blink 218 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698