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 "SkBuffer.h" | 8 #include "SkBuffer.h" |
9 #include "SkErrorInternals.h" | 9 #include "SkErrorInternals.h" |
10 #include "SkGeometry.h" | 10 #include "SkGeometry.h" |
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 this->addRRect(rrect, dir, dir == kCW_Direction ? 6 : 7); | 1065 this->addRRect(rrect, dir, dir == kCW_Direction ? 6 : 7); |
1066 } | 1066 } |
1067 | 1067 |
1068 void SkPath::addRRect(const SkRRect &rrect, Direction dir, unsigned startIndex)
{ | 1068 void SkPath::addRRect(const SkRRect &rrect, Direction dir, unsigned startIndex)
{ |
1069 assert_known_direction(dir); | 1069 assert_known_direction(dir); |
1070 | 1070 |
1071 if (rrect.isEmpty()) { | 1071 if (rrect.isEmpty()) { |
1072 return; | 1072 return; |
1073 } | 1073 } |
1074 | 1074 |
| 1075 bool isRRect = hasOnlyMoveTos(); |
1075 const SkRect& bounds = rrect.getBounds(); | 1076 const SkRect& bounds = rrect.getBounds(); |
1076 | 1077 |
1077 if (rrect.isRect()) { | 1078 if (rrect.isRect()) { |
1078 // degenerate(rect) => radii points are collapsing | 1079 // degenerate(rect) => radii points are collapsing |
1079 this->addRect(bounds, dir, (startIndex + 1) / 2); | 1080 this->addRect(bounds, dir, (startIndex + 1) / 2); |
1080 } else if (rrect.isOval()) { | 1081 } else if (rrect.isOval()) { |
1081 // degenerate(oval) => line points are collapsing | 1082 // degenerate(oval) => line points are collapsing |
1082 this->addOval(bounds, dir, startIndex / 2); | 1083 this->addOval(bounds, dir, startIndex / 2); |
1083 } else { | 1084 } else { |
1084 fFirstDirection = this->hasOnlyMoveTos() ? | 1085 fFirstDirection = this->hasOnlyMoveTos() ? |
(...skipping 27 matching lines...) Expand all Loading... |
1112 this->conicTo(rectIter.next(), rrectIter.next(), weight); | 1113 this->conicTo(rectIter.next(), rrectIter.next(), weight); |
1113 // final lineTo handled by close(). | 1114 // final lineTo handled by close(). |
1114 } else { | 1115 } else { |
1115 for (unsigned i = 0; i < 4; ++i) { | 1116 for (unsigned i = 0; i < 4; ++i) { |
1116 this->lineTo(rrectIter.next()); | 1117 this->lineTo(rrectIter.next()); |
1117 this->conicTo(rectIter.next(), rrectIter.next(), weight); | 1118 this->conicTo(rectIter.next(), rrectIter.next(), weight); |
1118 } | 1119 } |
1119 } | 1120 } |
1120 this->close(); | 1121 this->close(); |
1121 | 1122 |
| 1123 SkPathRef::Editor ed(&fPathRef); |
| 1124 ed.setIsRRect(isRRect); |
| 1125 |
1122 SkASSERT(this->countVerbs() == initialVerbCount + kVerbs); | 1126 SkASSERT(this->countVerbs() == initialVerbCount + kVerbs); |
1123 } | 1127 } |
1124 | 1128 |
1125 SkDEBUGCODE(fPathRef->validate();) | 1129 SkDEBUGCODE(fPathRef->validate();) |
1126 } | 1130 } |
1127 | 1131 |
1128 bool SkPath::hasOnlyMoveTos() const { | 1132 bool SkPath::hasOnlyMoveTos() const { |
1129 int count = fPathRef->countVerbs(); | 1133 int count = fPathRef->countVerbs(); |
1130 const uint8_t* verbs = const_cast<const SkPathRef*>(fPathRef.get())->verbsMe
mBegin(); | 1134 const uint8_t* verbs = const_cast<const SkPathRef*>(fPathRef.get())->verbsMe
mBegin(); |
1131 for (int i = 0; i < count; ++i) { | 1135 for (int i = 0; i < count; ++i) { |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1854 } | 1858 } |
1855 fLastPt = fMoveTo; | 1859 fLastPt = fMoveTo; |
1856 break; | 1860 break; |
1857 } | 1861 } |
1858 fPts = srcPts; | 1862 fPts = srcPts; |
1859 return (Verb)verb; | 1863 return (Verb)verb; |
1860 } | 1864 } |
1861 | 1865 |
1862 /////////////////////////////////////////////////////////////////////////////// | 1866 /////////////////////////////////////////////////////////////////////////////// |
1863 | 1867 |
1864 SkPath::RawIter::RawIter() { | |
1865 #ifdef SK_DEBUG | |
1866 fPts = nullptr; | |
1867 fConicWeights = nullptr; | |
1868 #endif | |
1869 // need to init enough to make next() harmlessly return kDone_Verb | |
1870 fVerbs = nullptr; | |
1871 fVerbStop = nullptr; | |
1872 } | |
1873 | |
1874 SkPath::RawIter::RawIter(const SkPath& path) { | |
1875 this->setPath(path); | |
1876 } | |
1877 | |
1878 void SkPath::RawIter::setPath(const SkPath& path) { | |
1879 fPts = path.fPathRef->points(); | |
1880 fVerbs = path.fPathRef->verbs(); | |
1881 fVerbStop = path.fPathRef->verbsMemBegin(); | |
1882 fConicWeights = path.fPathRef->conicWeights() - 1; // begin one behind | |
1883 } | |
1884 | |
1885 SkPath::Verb SkPath::RawIter::next(SkPoint pts[4]) { | |
1886 SkASSERT(pts); | |
1887 if (fVerbs == fVerbStop) { | |
1888 return kDone_Verb; | |
1889 } | |
1890 | |
1891 // fVerbs points one beyond next verb so decrement first. | |
1892 unsigned verb = *(--fVerbs); | |
1893 const SkPoint* srcPts = fPts; | |
1894 | |
1895 switch (verb) { | |
1896 case kMove_Verb: | |
1897 pts[0] = srcPts[0]; | |
1898 srcPts += 1; | |
1899 break; | |
1900 case kLine_Verb: | |
1901 pts[0] = srcPts[-1]; | |
1902 pts[1] = srcPts[0]; | |
1903 srcPts += 1; | |
1904 break; | |
1905 case kConic_Verb: | |
1906 fConicWeights += 1; | |
1907 // fall-through | |
1908 case kQuad_Verb: | |
1909 pts[0] = srcPts[-1]; | |
1910 pts[1] = srcPts[0]; | |
1911 pts[2] = srcPts[1]; | |
1912 srcPts += 2; | |
1913 break; | |
1914 case kCubic_Verb: | |
1915 pts[0] = srcPts[-1]; | |
1916 pts[1] = srcPts[0]; | |
1917 pts[2] = srcPts[1]; | |
1918 pts[3] = srcPts[2]; | |
1919 srcPts += 3; | |
1920 break; | |
1921 case kClose_Verb: | |
1922 break; | |
1923 case kDone_Verb: | |
1924 SkASSERT(fVerbs == fVerbStop); | |
1925 break; | |
1926 } | |
1927 fPts = srcPts; | |
1928 return (Verb)verb; | |
1929 } | |
1930 | |
1931 /////////////////////////////////////////////////////////////////////////////// | |
1932 | |
1933 /* | 1868 /* |
1934 Format in compressed buffer: [ptCount, verbCount, pts[], verbs[]] | 1869 Format in compressed buffer: [ptCount, verbCount, pts[], verbs[]] |
1935 */ | 1870 */ |
1936 | 1871 |
1937 size_t SkPath::writeToMemory(void* storage) const { | 1872 size_t SkPath::writeToMemory(void* storage) const { |
1938 SkDEBUGCODE(this->validate();) | 1873 SkDEBUGCODE(this->validate();) |
1939 | 1874 |
1940 if (nullptr == storage) { | 1875 if (nullptr == storage) { |
1941 const int byteCount = sizeof(int32_t) + fPathRef->writeSize(); | 1876 const int byteCount = sizeof(int32_t) + fPathRef->writeSize(); |
1942 return SkAlign4(byteCount); | 1877 return SkAlign4(byteCount); |
(...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2895 switch (this->getFillType()) { | 2830 switch (this->getFillType()) { |
2896 case SkPath::kEvenOdd_FillType: | 2831 case SkPath::kEvenOdd_FillType: |
2897 case SkPath::kInverseEvenOdd_FillType: | 2832 case SkPath::kInverseEvenOdd_FillType: |
2898 w &= 1; | 2833 w &= 1; |
2899 break; | 2834 break; |
2900 default: | 2835 default: |
2901 break; | 2836 break; |
2902 } | 2837 } |
2903 return SkToBool(w); | 2838 return SkToBool(w); |
2904 } | 2839 } |
OLD | NEW |