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 |