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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/skia/SkiaUtils.cpp

Issue 1536803003: Drop SkPathContainsPoint in favor of SkPath::contains (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Less ugly. Created 5 years 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
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/skia/SkiaUtils.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2006,2007,2008, Google Inc. All rights reserved. 2 * Copyright (c) 2006,2007,2008, 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "config.h" 31 #include "config.h"
32 #include "platform/graphics/skia/SkiaUtils.h" 32 #include "platform/graphics/skia/SkiaUtils.h"
33 33
34 #include "platform/graphics/GraphicsContext.h" 34 #include "platform/graphics/GraphicsContext.h"
35 #include "third_party/skia/include/core/SkRegion.h"
36 #include "third_party/skia/include/effects/SkCornerPathEffect.h" 35 #include "third_party/skia/include/effects/SkCornerPathEffect.h"
37 36
38 namespace blink { 37 namespace blink {
39 38
40 static const struct CompositOpToXfermodeMode { 39 static const struct CompositOpToXfermodeMode {
41 CompositeOperator mCompositOp; 40 CompositeOperator mCompositOp;
42 SkXfermode::Mode m_xfermodeMode; 41 SkXfermode::Mode m_xfermodeMode;
43 } gMapCompositOpsToXfermodeModes[] = { 42 } gMapCompositOpsToXfermodeModes[] = {
44 { CompositeClear, SkXfermode::kClear_Mode }, 43 { CompositeClear, SkXfermode::kClear_Mode },
45 { CompositeCopy, SkXfermode::kSrc_Mode }, 44 { CompositeCopy, SkXfermode::kSrc_Mode },
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 case SkXfermode::kColor_Mode: 161 case SkXfermode::kColor_Mode:
163 return WebBlendModeColor; 162 return WebBlendModeColor;
164 case SkXfermode::kLuminosity_Mode: 163 case SkXfermode::kLuminosity_Mode:
165 return WebBlendModeLuminosity; 164 return WebBlendModeLuminosity;
166 default: 165 default:
167 break; 166 break;
168 } 167 }
169 return WebBlendModeNormal; 168 return WebBlendModeNormal;
170 } 169 }
171 170
172 bool SkPathContainsPoint(const SkPath& originalPath, const FloatPoint& point, Sk Path::FillType ft)
173 {
174 SkRect bounds = originalPath.getBounds();
175
176 // We can immediately return false if the point is outside the bounding
177 // rect. We don't use bounds.contains() here, since it would exclude
178 // points on the right and bottom edges of the bounding rect, and we want
179 // to include them.
180 SkScalar fX = SkFloatToScalar(point.x());
181 SkScalar fY = SkFloatToScalar(point.y());
182 if (fX < bounds.fLeft || fX > bounds.fRight || fY < bounds.fTop || fY > boun ds.fBottom)
183 return false;
184
185 // Scale the path to a large size before hit testing for two reasons:
186 // 1) Skia has trouble with coordinates close to the max signed 16-bit value s, so we scale larger paths down.
187 // TODO: when Skia is patched to work properly with large values, this wi ll not be necessary.
188 // 2) Skia does not support analytic hit testing, so we scale paths up to do raster hit testing with subpixel accuracy.
189 // 3) Scale the x/y axis separately so an extreme large/small scale factor o n one axis won't
190 // ruin the resolution of the other axis.
191 SkScalar biggestCoordX = std::max(bounds.fRight, -bounds.fLeft);
192 SkScalar biggestCoordY = std::max(bounds.fBottom, -bounds.fTop);
193 if (SkScalarNearlyZero(biggestCoordX) || SkScalarNearlyZero(biggestCoordY))
194 return false;
195
196 biggestCoordX = std::max(biggestCoordX, std::fabs(fX) + 1);
197 biggestCoordY = std::max(biggestCoordY, std::fabs(fY) + 1);
198
199 const SkScalar kMaxCoordinate = SkIntToScalar(1 << 15);
200 SkScalar scaleX = kMaxCoordinate / biggestCoordX;
201 SkScalar scaleY = kMaxCoordinate / biggestCoordY;
202
203 SkRegion rgn;
204 SkRegion clip;
205 SkMatrix m;
206 SkPath scaledPath(originalPath);
207
208 scaledPath.setFillType(ft);
209 m.setScale(scaleX, scaleY);
210 scaledPath.transform(m, 0);
211
212 int x = static_cast<int>(floorf(0.5f + point.x() * scaleX));
213 int y = static_cast<int>(floorf(0.5f + point.y() * scaleY));
214 clip.setRect(x - 1, y - 1, x + 1, y + 1);
215
216 return rgn.setPath(scaledPath, clip);
217 }
218
219 SkMatrix affineTransformToSkMatrix(const AffineTransform& source) 171 SkMatrix affineTransformToSkMatrix(const AffineTransform& source)
220 { 172 {
221 SkMatrix result; 173 SkMatrix result;
222 174
223 result.setScaleX(WebCoreDoubleToSkScalar(source.a())); 175 result.setScaleX(WebCoreDoubleToSkScalar(source.a()));
224 result.setSkewX(WebCoreDoubleToSkScalar(source.c())); 176 result.setSkewX(WebCoreDoubleToSkScalar(source.c()));
225 result.setTranslateX(WebCoreDoubleToSkScalar(source.e())); 177 result.setTranslateX(WebCoreDoubleToSkScalar(source.e()));
226 178
227 result.setScaleY(WebCoreDoubleToSkScalar(source.d())); 179 result.setScaleY(WebCoreDoubleToSkScalar(source.d()));
228 result.setSkewY(WebCoreDoubleToSkScalar(source.b())); 180 result.setSkewY(WebCoreDoubleToSkScalar(source.b()));
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 paint.setAlpha(128); 347 paint.setAlpha(128);
396 paint.setStrokeWidth(paint.getStrokeWidth() * 0.5f); 348 paint.setStrokeWidth(paint.getStrokeWidth() * 0.5f);
397 drawFocusRingPrimitive(primitive, canvas, paint, cornerRadius); 349 drawFocusRingPrimitive(primitive, canvas, paint, cornerRadius);
398 #endif 350 #endif
399 } 351 }
400 352
401 template void PLATFORM_EXPORT drawPlatformFocusRing<SkRect>(const SkRect&, SkCan vas*, SkColor, int width); 353 template void PLATFORM_EXPORT drawPlatformFocusRing<SkRect>(const SkRect&, SkCan vas*, SkColor, int width);
402 template void PLATFORM_EXPORT drawPlatformFocusRing<SkPath>(const SkPath&, SkCan vas*, SkColor, int width); 354 template void PLATFORM_EXPORT drawPlatformFocusRing<SkPath>(const SkPath&, SkCan vas*, SkColor, int width);
403 355
404 } // namespace blink 356 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/skia/SkiaUtils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698