OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/render_surface_filters.h" | 5 #include "cc/render_surface_filters.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "skia/ext/refptr.h" | 8 #include "skia/ext/refptr.h" |
9 #include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperation.
h" | 9 #include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperation.
h" |
10 #include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperations
.h" | 10 #include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperations
.h" |
11 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3
D.h" | 11 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3
D.h" |
12 #include "third_party/skia/include/core/SkCanvas.h" | 12 #include "third_party/skia/include/core/SkCanvas.h" |
13 #include "third_party/skia/include/effects/SkBlurImageFilter.h" | 13 #include "third_party/skia/include/effects/SkBlurImageFilter.h" |
14 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 14 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
15 #include "third_party/skia/include/effects/SkMagnifierImageFilter.h" | 15 #include "third_party/skia/include/effects/SkMagnifierImageFilter.h" |
16 #include "third_party/skia/include/gpu/SkGpuDevice.h" | 16 #include "third_party/skia/include/gpu/SkGpuDevice.h" |
17 #include "third_party/skia/include/gpu/SkGrPixelRef.h" | 17 #include "third_party/skia/include/gpu/SkGrPixelRef.h" |
18 #include "ui/gfx/size_f.h" | 18 #include "ui/gfx/size_f.h" |
19 | 19 |
20 namespace cc { | 20 namespace cc { |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 void getBrightnessMatrix(float amount, SkScalar matrix[20]) | 24 void getBrightnessMatrix(float amount, SkScalar matrix[20]) |
25 { | 25 { |
| 26 // Spec implementation |
| 27 // (http://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#brightnessEqu
ivalent) |
| 28 // <feFunc[R|G|B] type="linear" slope="[amount]"> |
26 memset(matrix, 0, 20 * sizeof(SkScalar)); | 29 memset(matrix, 0, 20 * sizeof(SkScalar)); |
27 // Old implementation, a la the draft spec, a straight-up scale, | 30 matrix[0] = matrix[6] = matrix[12] = amount; |
28 // representing <feFunc[R|G|B] type="linear" slope="[amount]"> | 31 matrix[18] = 1; |
29 // (See http://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#bright
nessEquivalent) | 32 } |
30 // matrix[0] = matrix[6] = matrix[12] = amount; | 33 |
31 // matrix[18] = 1; | 34 void getSaturatingBrightnessMatrix(float amount, SkScalar matrix[20]) |
32 // New implementation, a translation in color space, representing | 35 { |
33 // <feFunc[R|G|B] type="linear" intercept="[amount]"/> | 36 // Legacy implementation used by internal clients. |
34 // (See https://www.w3.org/Bugs/Public/show_bug.cgi?id=15647) | 37 // <feFunc[R|G|B] type="linear" intercept="[amount]"/> |
| 38 memset(matrix, 0, 20 * sizeof(SkScalar)); |
35 matrix[0] = matrix[6] = matrix[12] = matrix[18] = 1; | 39 matrix[0] = matrix[6] = matrix[12] = matrix[18] = 1; |
36 matrix[4] = matrix[9] = matrix[14] = amount * 255; | 40 matrix[4] = matrix[9] = matrix[14] = amount * 255; |
37 } | 41 } |
38 | 42 |
39 void getContrastMatrix(float amount, SkScalar matrix[20]) | 43 void getContrastMatrix(float amount, SkScalar matrix[20]) |
40 { | 44 { |
41 memset(matrix, 0, 20 * sizeof(SkScalar)); | 45 memset(matrix, 0, 20 * sizeof(SkScalar)); |
42 matrix[0] = matrix[6] = matrix[12] = amount; | 46 matrix[0] = matrix[6] = matrix[12] = amount; |
43 matrix[4] = matrix[9] = matrix[14] = (-0.5f * amount + 0.5f) * 255; | 47 matrix[4] = matrix[9] = matrix[14] = (-0.5f * amount + 0.5f) * 255; |
44 matrix[18] = 1; | 48 matrix[18] = 1; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 || componentNeedsClamping(matrix+15); | 195 || componentNeedsClamping(matrix+15); |
192 } | 196 } |
193 | 197 |
194 bool getColorMatrix(const WebKit::WebFilterOperation& op, SkScalar matrix[20]) | 198 bool getColorMatrix(const WebKit::WebFilterOperation& op, SkScalar matrix[20]) |
195 { | 199 { |
196 switch (op.type()) { | 200 switch (op.type()) { |
197 case WebKit::WebFilterOperation::FilterTypeBrightness: { | 201 case WebKit::WebFilterOperation::FilterTypeBrightness: { |
198 getBrightnessMatrix(op.amount(), matrix); | 202 getBrightnessMatrix(op.amount(), matrix); |
199 return true; | 203 return true; |
200 } | 204 } |
| 205 case WebKit::WebFilterOperation::FilterTypeSaturatingBrightness: { |
| 206 getSaturatingBrightnessMatrix(op.amount(), matrix); |
| 207 return true; |
| 208 } |
201 case WebKit::WebFilterOperation::FilterTypeContrast: { | 209 case WebKit::WebFilterOperation::FilterTypeContrast: { |
202 getContrastMatrix(op.amount(), matrix); | 210 getContrastMatrix(op.amount(), matrix); |
203 return true; | 211 return true; |
204 } | 212 } |
205 case WebKit::WebFilterOperation::FilterTypeGrayscale: { | 213 case WebKit::WebFilterOperation::FilterTypeGrayscale: { |
206 getGrayscaleMatrix(1 - op.amount(), matrix); | 214 getGrayscaleMatrix(1 - op.amount(), matrix); |
207 return true; | 215 return true; |
208 } | 216 } |
209 case WebKit::WebFilterOperation::FilterTypeSepia: { | 217 case WebKit::WebFilterOperation::FilterTypeSepia: { |
210 getSepiaMatrix(1 - op.amount(), matrix); | 218 getSepiaMatrix(1 - op.amount(), matrix); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 newList.append(WebKit::WebFilterOperation::createColorMatrixFilter(a
ccumulatedColorMatrix)); | 353 newList.append(WebKit::WebFilterOperation::createColorMatrixFilter(a
ccumulatedColorMatrix)); |
346 haveAccumulatedColorMatrix = false; | 354 haveAccumulatedColorMatrix = false; |
347 | 355 |
348 switch (op.type()) { | 356 switch (op.type()) { |
349 case WebKit::WebFilterOperation::FilterTypeBlur: | 357 case WebKit::WebFilterOperation::FilterTypeBlur: |
350 case WebKit::WebFilterOperation::FilterTypeDropShadow: | 358 case WebKit::WebFilterOperation::FilterTypeDropShadow: |
351 case WebKit::WebFilterOperation::FilterTypeZoom: | 359 case WebKit::WebFilterOperation::FilterTypeZoom: |
352 newList.append(op); | 360 newList.append(op); |
353 break; | 361 break; |
354 case WebKit::WebFilterOperation::FilterTypeBrightness: | 362 case WebKit::WebFilterOperation::FilterTypeBrightness: |
| 363 case WebKit::WebFilterOperation::FilterTypeSaturatingBrightness: |
355 case WebKit::WebFilterOperation::FilterTypeContrast: | 364 case WebKit::WebFilterOperation::FilterTypeContrast: |
356 case WebKit::WebFilterOperation::FilterTypeGrayscale: | 365 case WebKit::WebFilterOperation::FilterTypeGrayscale: |
357 case WebKit::WebFilterOperation::FilterTypeSepia: | 366 case WebKit::WebFilterOperation::FilterTypeSepia: |
358 case WebKit::WebFilterOperation::FilterTypeSaturate: | 367 case WebKit::WebFilterOperation::FilterTypeSaturate: |
359 case WebKit::WebFilterOperation::FilterTypeHueRotate: | 368 case WebKit::WebFilterOperation::FilterTypeHueRotate: |
360 case WebKit::WebFilterOperation::FilterTypeInvert: | 369 case WebKit::WebFilterOperation::FilterTypeInvert: |
361 case WebKit::WebFilterOperation::FilterTypeOpacity: | 370 case WebKit::WebFilterOperation::FilterTypeOpacity: |
362 case WebKit::WebFilterOperation::FilterTypeColorMatrix: | 371 case WebKit::WebFilterOperation::FilterTypeColorMatrix: |
363 default: // FIXME: temporary place holder to prevent build failures | |
364 break; | 372 break; |
365 } | 373 } |
366 } | 374 } |
367 if (haveAccumulatedColorMatrix) | 375 if (haveAccumulatedColorMatrix) |
368 newList.append(WebKit::WebFilterOperation::createColorMatrixFilter(accum
ulatedColorMatrix)); | 376 newList.append(WebKit::WebFilterOperation::createColorMatrixFilter(accum
ulatedColorMatrix)); |
369 return newList; | 377 return newList; |
370 } | 378 } |
371 | 379 |
372 SkBitmap RenderSurfaceFilters::apply(const WebKit::WebFilterOperations& filters,
unsigned textureId, const gfx::SizeF& size, WebKit::WebGraphicsContext3D* conte
xt3D, GrContext* grContext) | 380 SkBitmap RenderSurfaceFilters::apply(const WebKit::WebFilterOperations& filters,
unsigned textureId, const gfx::SizeF& size, WebKit::WebGraphicsContext3D* conte
xt3D, GrContext* grContext) |
373 { | 381 { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 op.zoomRect().width, | 428 op.zoomRect().width, |
421 op.zoomRect().height), | 429 op.zoomRect().height), |
422 op.amount())); | 430 op.amount())); |
423 paint.setImageFilter(zoomFilter.get()); | 431 paint.setImageFilter(zoomFilter.get()); |
424 canvas->saveLayer(0, &paint); | 432 canvas->saveLayer(0, &paint); |
425 canvas->drawBitmap(state.source(), 0, 0); | 433 canvas->drawBitmap(state.source(), 0, 0); |
426 canvas->restore(); | 434 canvas->restore(); |
427 break; | 435 break; |
428 } | 436 } |
429 case WebKit::WebFilterOperation::FilterTypeBrightness: | 437 case WebKit::WebFilterOperation::FilterTypeBrightness: |
| 438 case WebKit::WebFilterOperation::FilterTypeSaturatingBrightness: |
430 case WebKit::WebFilterOperation::FilterTypeContrast: | 439 case WebKit::WebFilterOperation::FilterTypeContrast: |
431 case WebKit::WebFilterOperation::FilterTypeGrayscale: | 440 case WebKit::WebFilterOperation::FilterTypeGrayscale: |
432 case WebKit::WebFilterOperation::FilterTypeSepia: | 441 case WebKit::WebFilterOperation::FilterTypeSepia: |
433 case WebKit::WebFilterOperation::FilterTypeSaturate: | 442 case WebKit::WebFilterOperation::FilterTypeSaturate: |
434 case WebKit::WebFilterOperation::FilterTypeHueRotate: | 443 case WebKit::WebFilterOperation::FilterTypeHueRotate: |
435 case WebKit::WebFilterOperation::FilterTypeInvert: | 444 case WebKit::WebFilterOperation::FilterTypeInvert: |
436 case WebKit::WebFilterOperation::FilterTypeOpacity: | 445 case WebKit::WebFilterOperation::FilterTypeOpacity: |
437 default: // FIXME: temporary place holder to prevent build failures | |
438 NOTREACHED(); | 446 NOTREACHED(); |
439 break; | 447 break; |
440 } | 448 } |
441 state.swap(); | 449 state.swap(); |
442 } | 450 } |
443 context3D->flush(); | 451 context3D->flush(); |
444 return state.source(); | 452 return state.source(); |
445 } | 453 } |
446 | 454 |
447 } // namespace cc | 455 } // namespace cc |
OLD | NEW |