| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 The Android Open Source Project | 3 * Copyright 2011 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkScan.h" | 10 #include "SkScan.h" |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 } | 595 } |
| 596 | 596 |
| 597 SkASSERT(clip == NULL || !clip->getBounds().isEmpty()); | 597 SkASSERT(clip == NULL || !clip->getBounds().isEmpty()); |
| 598 | 598 |
| 599 #ifdef TEST_GAMMA | 599 #ifdef TEST_GAMMA |
| 600 build_gamma_table(); | 600 build_gamma_table(); |
| 601 #endif | 601 #endif |
| 602 | 602 |
| 603 SkPoint pts[2] = { pt0, pt1 }; | 603 SkPoint pts[2] = { pt0, pt1 }; |
| 604 | 604 |
| 605 #ifdef SK_SCALAR_IS_FLOAT | |
| 606 // We have to pre-clip the line to fit in a SkFixed, so we just chop | 605 // We have to pre-clip the line to fit in a SkFixed, so we just chop |
| 607 // the line. TODO find a way to actually draw beyond that range. | 606 // the line. TODO find a way to actually draw beyond that range. |
| 608 { | 607 { |
| 609 SkRect fixedBounds; | 608 SkRect fixedBounds; |
| 610 const SkScalar max = SkIntToScalar(32767); | 609 const SkScalar max = SkIntToScalar(32767); |
| 611 fixedBounds.set(-max, -max, max, max); | 610 fixedBounds.set(-max, -max, max, max); |
| 612 if (!SkLineClipper::IntersectLine(pts, fixedBounds, pts)) { | 611 if (!SkLineClipper::IntersectLine(pts, fixedBounds, pts)) { |
| 613 return; | 612 return; |
| 614 } | 613 } |
| 615 } | 614 } |
| 616 #endif | |
| 617 | 615 |
| 618 if (clip) { | 616 if (clip) { |
| 619 SkRect clipBounds; | 617 SkRect clipBounds; |
| 620 clipBounds.set(clip->getBounds()); | 618 clipBounds.set(clip->getBounds()); |
| 621 /* We perform integral clipping later on, but we do a scalar clip first | 619 /* We perform integral clipping later on, but we do a scalar clip first |
| 622 to ensure that our coordinates are expressible in fixed/integers. | 620 to ensure that our coordinates are expressible in fixed/integers. |
| 623 | 621 |
| 624 antialiased hairlines can draw up to 1/2 of a pixel outside of | 622 antialiased hairlines can draw up to 1/2 of a pixel outside of |
| 625 their bounds, so we need to outset the clip before calling the | 623 their bounds, so we need to outset the clip before calling the |
| 626 clipper. To make the numerics safer, we outset by a whole pixel, | 624 clipper. To make the numerics safer, we outset by a whole pixel, |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 AntiFillXRect(xr, NULL, blitter); | 819 AntiFillXRect(xr, NULL, blitter); |
| 822 } else { | 820 } else { |
| 823 SkAAClipBlitterWrapper wrapper(clip, blitter); | 821 SkAAClipBlitterWrapper wrapper(clip, blitter); |
| 824 blitter = wrapper.getBlitter(); | 822 blitter = wrapper.getBlitter(); |
| 825 | 823 |
| 826 AntiFillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); | 824 AntiFillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); |
| 827 } | 825 } |
| 828 } | 826 } |
| 829 } | 827 } |
| 830 | 828 |
| 831 #ifdef SK_SCALAR_IS_FLOAT | |
| 832 | |
| 833 /* This guy takes a float-rect, but with the key improvement that it has | 829 /* This guy takes a float-rect, but with the key improvement that it has |
| 834 already been clipped, so we know that it is safe to convert it into a | 830 already been clipped, so we know that it is safe to convert it into a |
| 835 XRect (fixedpoint), as it won't overflow. | 831 XRect (fixedpoint), as it won't overflow. |
| 836 */ | 832 */ |
| 837 static void antifillrect(const SkRect& r, SkBlitter* blitter) { | 833 static void antifillrect(const SkRect& r, SkBlitter* blitter) { |
| 838 SkXRect xr; | 834 SkXRect xr; |
| 839 | 835 |
| 840 XRect_set(&xr, r); | 836 XRect_set(&xr, r); |
| 841 antifillrect(xr, blitter); | 837 antifillrect(xr, blitter); |
| 842 } | 838 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 void SkScan::AntiFillRect(const SkRect& r, const SkRasterClip& clip, | 877 void SkScan::AntiFillRect(const SkRect& r, const SkRasterClip& clip, |
| 882 SkBlitter* blitter) { | 878 SkBlitter* blitter) { |
| 883 if (clip.isBW()) { | 879 if (clip.isBW()) { |
| 884 AntiFillRect(r, &clip.bwRgn(), blitter); | 880 AntiFillRect(r, &clip.bwRgn(), blitter); |
| 885 } else { | 881 } else { |
| 886 SkAAClipBlitterWrapper wrap(clip, blitter); | 882 SkAAClipBlitterWrapper wrap(clip, blitter); |
| 887 AntiFillRect(r, &wrap.getRgn(), wrap.getBlitter()); | 883 AntiFillRect(r, &wrap.getRgn(), wrap.getBlitter()); |
| 888 } | 884 } |
| 889 } | 885 } |
| 890 | 886 |
| 891 #endif // SK_SCALAR_IS_FLOAT | |
| 892 | |
| 893 /////////////////////////////////////////////////////////////////////////////// | 887 /////////////////////////////////////////////////////////////////////////////// |
| 894 | 888 |
| 895 #define SkAlphaMulRound(a, b) SkMulDiv255Round(a, b) | 889 #define SkAlphaMulRound(a, b) SkMulDiv255Round(a, b) |
| 896 | 890 |
| 897 // calls blitRect() if the rectangle is non-empty | 891 // calls blitRect() if the rectangle is non-empty |
| 898 static void fillcheckrect(int L, int T, int R, int B, SkBlitter* blitter) { | 892 static void fillcheckrect(int L, int T, int R, int B, SkBlitter* blitter) { |
| 899 if (L < R && T < B) { | 893 if (L < R && T < B) { |
| 900 blitter->blitRect(L, T, R - L, B - T); | 894 blitter->blitRect(L, T, R - L, B - T); |
| 901 } | 895 } |
| 902 } | 896 } |
| 903 | 897 |
| 904 static inline FDot8 SkScalarToFDot8(SkScalar x) { | 898 static inline FDot8 SkScalarToFDot8(SkScalar x) { |
| 905 #ifdef SK_SCALAR_IS_FLOAT | |
| 906 return (int)(x * 256); | 899 return (int)(x * 256); |
| 907 #else | |
| 908 return x >> 8; | |
| 909 #endif | |
| 910 } | 900 } |
| 911 | 901 |
| 912 static inline int FDot8Floor(FDot8 x) { | 902 static inline int FDot8Floor(FDot8 x) { |
| 913 return x >> 8; | 903 return x >> 8; |
| 914 } | 904 } |
| 915 | 905 |
| 916 static inline int FDot8Ceil(FDot8 x) { | 906 static inline int FDot8Ceil(FDot8 x) { |
| 917 return (x + 0xFF) >> 8; | 907 return (x + 0xFF) >> 8; |
| 918 } | 908 } |
| 919 | 909 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 | 1045 |
| 1056 void SkScan::AntiFrameRect(const SkRect& r, const SkPoint& strokeSize, | 1046 void SkScan::AntiFrameRect(const SkRect& r, const SkPoint& strokeSize, |
| 1057 const SkRasterClip& clip, SkBlitter* blitter) { | 1047 const SkRasterClip& clip, SkBlitter* blitter) { |
| 1058 if (clip.isBW()) { | 1048 if (clip.isBW()) { |
| 1059 AntiFrameRect(r, strokeSize, &clip.bwRgn(), blitter); | 1049 AntiFrameRect(r, strokeSize, &clip.bwRgn(), blitter); |
| 1060 } else { | 1050 } else { |
| 1061 SkAAClipBlitterWrapper wrap(clip, blitter); | 1051 SkAAClipBlitterWrapper wrap(clip, blitter); |
| 1062 AntiFrameRect(r, strokeSize, &wrap.getRgn(), wrap.getBlitter()); | 1052 AntiFrameRect(r, strokeSize, &wrap.getRgn(), wrap.getBlitter()); |
| 1063 } | 1053 } |
| 1064 } | 1054 } |
| OLD | NEW |