| OLD | NEW |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 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 "ui/gfx/skia_paint_util.h" | 5 #include "ui/gfx/skia_paint_util.h" |
| 6 | 6 |
| 7 #include "third_party/skia/include/core/SkColorFilter.h" | 7 #include "third_party/skia/include/core/SkColorFilter.h" |
| 8 #include "third_party/skia/include/effects/SkBlurMaskFilter.h" | 8 #include "third_party/skia/include/effects/SkBlurMaskFilter.h" |
| 9 #include "third_party/skia/include/effects/SkGradientShader.h" | 9 #include "third_party/skia/include/effects/SkGradientShader.h" |
| 10 #include "third_party/skia/include/effects/SkLayerDrawLooper.h" | 10 #include "third_party/skia/include/effects/SkLayerDrawLooper.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 SkColor end_color) { | 46 SkColor end_color) { |
| 47 SkColor grad_colors[2] = {start_color, end_color}; | 47 SkColor grad_colors[2] = {start_color, end_color}; |
| 48 SkPoint grad_points[2]; | 48 SkPoint grad_points[2]; |
| 49 grad_points[0].iset(0, start_point); | 49 grad_points[0].iset(0, start_point); |
| 50 grad_points[1].iset(0, end_point); | 50 grad_points[1].iset(0, end_point); |
| 51 | 51 |
| 52 return cc::WrapSkShader(SkGradientShader::MakeLinear( | 52 return cc::WrapSkShader(SkGradientShader::MakeLinear( |
| 53 grad_points, grad_colors, NULL, 2, cc::PaintShader::kClamp_TileMode)); | 53 grad_points, grad_colors, NULL, 2, cc::PaintShader::kClamp_TileMode)); |
| 54 } | 54 } |
| 55 | 55 |
| 56 // TODO(estade): remove. Only exists to support legacy CreateShadowDrawLooper. | |
| 57 static SkScalar DeprecatedRadiusToSigma(double radius) { | |
| 58 // This captures historically what skia did under the hood. Now skia accepts | |
| 59 // sigma, not radius, so we perform the conversion. | |
| 60 return radius > 0 ? SkDoubleToScalar(0.57735f * radius + 0.5) : 0; | |
| 61 } | |
| 62 | |
| 63 // This is copied from | 56 // This is copied from |
| 64 // third_party/WebKit/Source/platform/graphics/skia/SkiaUtils.h | 57 // third_party/WebKit/Source/platform/graphics/skia/SkiaUtils.h |
| 65 static SkScalar RadiusToSigma(double radius) { | 58 static SkScalar RadiusToSigma(double radius) { |
| 66 return radius > 0 ? SkDoubleToScalar(0.288675f * radius + 0.5f) : 0; | 59 return radius > 0 ? SkDoubleToScalar(0.288675f * radius + 0.5f) : 0; |
| 67 } | 60 } |
| 68 | 61 |
| 69 sk_sp<SkDrawLooper> CreateShadowDrawLooper( | 62 sk_sp<SkDrawLooper> CreateShadowDrawLooper( |
| 70 const std::vector<ShadowValue>& shadows) { | 63 const std::vector<ShadowValue>& shadows) { |
| 71 if (shadows.empty()) | 64 if (shadows.empty()) |
| 72 return nullptr; | 65 return nullptr; |
| 73 | 66 |
| 74 SkLayerDrawLooper::Builder looper_builder; | 67 SkLayerDrawLooper::Builder looper_builder; |
| 75 | 68 |
| 76 looper_builder.addLayer(); // top layer of the original. | 69 looper_builder.addLayer(); // top layer of the original. |
| 77 | 70 |
| 78 SkLayerDrawLooper::LayerInfo layer_info; | 71 SkLayerDrawLooper::LayerInfo layer_info; |
| 79 layer_info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; | 72 layer_info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; |
| 80 layer_info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit; | 73 layer_info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit; |
| 81 layer_info.fColorMode = SkBlendMode::kSrc; | 74 layer_info.fColorMode = SkBlendMode::kSrc; |
| 82 | 75 |
| 83 for (size_t i = 0; i < shadows.size(); ++i) { | 76 for (size_t i = 0; i < shadows.size(); ++i) { |
| 84 const ShadowValue& shadow = shadows[i]; | 77 const ShadowValue& shadow = shadows[i]; |
| 85 | 78 |
| 86 layer_info.fOffset.set(SkIntToScalar(shadow.x()), | 79 layer_info.fOffset.set(SkIntToScalar(shadow.x()), |
| 87 SkIntToScalar(shadow.y())); | 80 SkIntToScalar(shadow.y())); |
| 88 | 81 |
| 89 SkPaint* paint = looper_builder.addLayer(layer_info); | 82 SkPaint* paint = looper_builder.addLayer(layer_info); |
| 90 // SkBlurMaskFilter's blur radius defines the range to extend the blur from | 83 // SkBlurMaskFilter's blur radius defines the range to extend the blur from |
| 91 // original mask, which is half of blur amount as defined in ShadowValue. | 84 // original mask, which is half of blur amount as defined in ShadowValue. |
| 92 // Note that because this function uses DeprecatedRadiusToSigma, it actually | |
| 93 // creates a draw looper with roughly twice the desired blur. | |
| 94 paint->setMaskFilter(SkBlurMaskFilter::Make( | |
| 95 kNormal_SkBlurStyle, DeprecatedRadiusToSigma(shadow.blur() / 2), | |
| 96 SkBlurMaskFilter::kHighQuality_BlurFlag)); | |
| 97 paint->setColorFilter( | |
| 98 SkColorFilter::MakeModeFilter(shadow.color(), SkBlendMode::kSrcIn)); | |
| 99 } | |
| 100 | |
| 101 return looper_builder.detach(); | |
| 102 } | |
| 103 | |
| 104 sk_sp<SkDrawLooper> CreateShadowDrawLooperCorrectBlur( | |
| 105 const std::vector<ShadowValue>& shadows) { | |
| 106 if (shadows.empty()) | |
| 107 return nullptr; | |
| 108 | |
| 109 SkLayerDrawLooper::Builder looper_builder; | |
| 110 | |
| 111 looper_builder.addLayer(); // top layer of the original. | |
| 112 | |
| 113 SkLayerDrawLooper::LayerInfo layer_info; | |
| 114 layer_info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; | |
| 115 layer_info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit; | |
| 116 layer_info.fColorMode = SkBlendMode::kSrc; | |
| 117 | |
| 118 for (size_t i = 0; i < shadows.size(); ++i) { | |
| 119 const ShadowValue& shadow = shadows[i]; | |
| 120 | |
| 121 layer_info.fOffset.set(SkIntToScalar(shadow.x()), | |
| 122 SkIntToScalar(shadow.y())); | |
| 123 | |
| 124 SkPaint* paint = looper_builder.addLayer(layer_info); | |
| 125 // SkBlurMaskFilter's blur radius defines the range to extend the blur from | |
| 126 // original mask, which is half of blur amount as defined in ShadowValue. | |
| 127 paint->setMaskFilter(SkBlurMaskFilter::Make( | 85 paint->setMaskFilter(SkBlurMaskFilter::Make( |
| 128 kNormal_SkBlurStyle, RadiusToSigma(shadow.blur() / 2), | 86 kNormal_SkBlurStyle, RadiusToSigma(shadow.blur() / 2), |
| 129 SkBlurMaskFilter::kHighQuality_BlurFlag)); | 87 SkBlurMaskFilter::kHighQuality_BlurFlag)); |
| 130 paint->setColorFilter( | 88 paint->setColorFilter( |
| 131 SkColorFilter::MakeModeFilter(shadow.color(), SkBlendMode::kSrcIn)); | 89 SkColorFilter::MakeModeFilter(shadow.color(), SkBlendMode::kSrcIn)); |
| 132 } | 90 } |
| 133 | 91 |
| 134 return looper_builder.detach(); | 92 return looper_builder.detach(); |
| 135 } | 93 } |
| 136 | 94 |
| 137 } // namespace gfx | 95 } // namespace gfx |
| OLD | NEW |