OLD | NEW |
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 Loading... |
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 |
OLD | NEW |