| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkDraw.h" | 8 #include "SkDraw.h" |
| 9 #include "SkBlitter.h" | 9 #include "SkBlitter.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 this->drawPath(path, p, NULL, true); | 728 this->drawPath(path, p, NULL, true); |
| 729 } | 729 } |
| 730 path.rewind(); | 730 path.rewind(); |
| 731 } | 731 } |
| 732 break; | 732 break; |
| 733 } | 733 } |
| 734 } | 734 } |
| 735 } | 735 } |
| 736 } | 736 } |
| 737 | 737 |
| 738 static inline SkPoint compute_stroke_size(const SkPaint& paint, const SkMatrix&
matrix) { |
| 739 SkASSERT(matrix.rectStaysRect()); |
| 740 SkASSERT(SkPaint::kFill_Style != paint.getStyle()); |
| 741 |
| 742 SkVector size; |
| 743 SkPoint pt = { paint.getStrokeWidth(), paint.getStrokeWidth() }; |
| 744 matrix.mapVectors(&size, &pt, 1); |
| 745 return SkPoint::Make(SkScalarAbs(size.fX), SkScalarAbs(size.fY)); |
| 746 } |
| 747 |
| 738 static bool easy_rect_join(const SkPaint& paint, const SkMatrix& matrix, | 748 static bool easy_rect_join(const SkPaint& paint, const SkMatrix& matrix, |
| 739 SkPoint* strokeSize) { | 749 SkPoint* strokeSize) { |
| 740 if (SkPaint::kMiter_Join != paint.getStrokeJoin() || | 750 if (SkPaint::kMiter_Join != paint.getStrokeJoin() || |
| 741 paint.getStrokeMiter() < SK_ScalarSqrt2) { | 751 paint.getStrokeMiter() < SK_ScalarSqrt2) { |
| 742 return false; | 752 return false; |
| 743 } | 753 } |
| 744 | 754 |
| 745 SkASSERT(matrix.rectStaysRect()); | 755 *strokeSize = compute_stroke_size(paint, matrix); |
| 746 SkPoint pt = { paint.getStrokeWidth(), paint.getStrokeWidth() }; | |
| 747 matrix.mapVectors(strokeSize, &pt, 1); | |
| 748 strokeSize->fX = SkScalarAbs(strokeSize->fX); | |
| 749 strokeSize->fY = SkScalarAbs(strokeSize->fY); | |
| 750 return true; | 756 return true; |
| 751 } | 757 } |
| 752 | 758 |
| 753 SkDraw::RectType SkDraw::ComputeRectType(const SkPaint& paint, | 759 SkDraw::RectType SkDraw::ComputeRectType(const SkPaint& paint, |
| 754 const SkMatrix& matrix, | 760 const SkMatrix& matrix, |
| 755 SkPoint* strokeSize) { | 761 SkPoint* strokeSize) { |
| 756 RectType rtype; | 762 RectType rtype; |
| 757 const SkScalar width = paint.getStrokeWidth(); | 763 const SkScalar width = paint.getStrokeWidth(); |
| 758 const bool zeroWidth = (0 == width); | 764 const bool zeroWidth = (0 == width); |
| 759 SkPaint::Style style = paint.getStyle(); | 765 SkPaint::Style style = paint.getStyle(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 draw.fMatrix = matrix; | 821 draw.fMatrix = matrix; |
| 816 } | 822 } |
| 817 SkPath tmp; | 823 SkPath tmp; |
| 818 tmp.addRect(prePaintRect); | 824 tmp.addRect(prePaintRect); |
| 819 tmp.setFillType(SkPath::kWinding_FillType); | 825 tmp.setFillType(SkPath::kWinding_FillType); |
| 820 draw.drawPath(tmp, paint, NULL, true); | 826 draw.drawPath(tmp, paint, NULL, true); |
| 821 return; | 827 return; |
| 822 } | 828 } |
| 823 | 829 |
| 824 SkRect devRect; | 830 SkRect devRect; |
| 825 if (paintMatrix) { | 831 const SkRect& paintRect = paintMatrix ? *postPaintRect : prePaintRect; |
| 826 // skip the paintMatrix when transforming the rect by the CTM | 832 // skip the paintMatrix when transforming the rect by the CTM |
| 827 fMatrix->mapPoints(rect_points(devRect), rect_points(*postPaintRect), 2)
; | 833 fMatrix->mapPoints(rect_points(devRect), rect_points(paintRect), 2); |
| 828 } else { | |
| 829 fMatrix->mapPoints(rect_points(devRect), rect_points(prePaintRect), 2); | |
| 830 } | |
| 831 // transform rect into devRect | |
| 832 devRect.sort(); | 834 devRect.sort(); |
| 833 | 835 |
| 834 // look for the quick exit, before we build a blitter | 836 // look for the quick exit, before we build a blitter |
| 835 SkIRect ir = devRect.roundOut(); | 837 SkRect bbox = devRect; |
| 836 if (paint.getStyle() != SkPaint::kFill_Style) { | 838 if (paint.getStyle() != SkPaint::kFill_Style) { |
| 837 // extra space for hairlines | 839 // extra space for hairlines |
| 838 if (paint.getStrokeWidth() == 0) { | 840 if (paint.getStrokeWidth() == 0) { |
| 839 ir.outset(1, 1); | 841 bbox.outset(1, 1); |
| 840 } else { | 842 } else { |
| 841 SkScalar radius = SkScalarHalf(paint.getStrokeWidth()); | 843 // For kStroke_RectType, strokeSize is already computed. |
| 842 ir.outset(radius, radius); | 844 const SkPoint& ssize = (kStroke_RectType == rtype) |
| 845 ? strokeSize |
| 846 : compute_stroke_size(paint, *fMatrix); |
| 847 bbox.outset(SkScalarHalf(ssize.x()), SkScalarHalf(ssize.y())); |
| 843 } | 848 } |
| 844 } | 849 } |
| 850 |
| 851 SkIRect ir = bbox.roundOut(); |
| 845 if (fRC->quickReject(ir)) { | 852 if (fRC->quickReject(ir)) { |
| 846 return; | 853 return; |
| 847 } | 854 } |
| 848 | 855 |
| 849 SkDeviceLooper looper(*fBitmap, *fRC, ir, paint.isAntiAlias()); | 856 SkDeviceLooper looper(*fBitmap, *fRC, ir, paint.isAntiAlias()); |
| 850 while (looper.next()) { | 857 while (looper.next()) { |
| 851 SkRect localDevRect; | 858 SkRect localDevRect; |
| 852 looper.mapRect(&localDevRect, devRect); | 859 looper.mapRect(&localDevRect, devRect); |
| 853 SkMatrix localMatrix; | 860 SkMatrix localMatrix; |
| 854 looper.mapMatrix(&localMatrix, *matrix); | 861 looper.mapMatrix(&localMatrix, *matrix); |
| (...skipping 1536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2391 mask->fImage = SkMask::AllocImage(size); | 2398 mask->fImage = SkMask::AllocImage(size); |
| 2392 memset(mask->fImage, 0, mask->computeImageSize()); | 2399 memset(mask->fImage, 0, mask->computeImageSize()); |
| 2393 } | 2400 } |
| 2394 | 2401 |
| 2395 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2402 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
| 2396 draw_into_mask(*mask, devPath, style); | 2403 draw_into_mask(*mask, devPath, style); |
| 2397 } | 2404 } |
| 2398 | 2405 |
| 2399 return true; | 2406 return true; |
| 2400 } | 2407 } |
| OLD | NEW |