OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
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 #include "SkAAClip.h" | 9 #include "SkAAClip.h" |
10 #include "SkAtomics.h" | 10 #include "SkAtomics.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 const uint8_t* fData; | 129 const uint8_t* fData; |
130 | 130 |
131 int fTop, fBottom; | 131 int fTop, fBottom; |
132 bool fDone; | 132 bool fDone; |
133 }; | 133 }; |
134 | 134 |
135 SkAAClip::Iter::Iter(const SkAAClip& clip) { | 135 SkAAClip::Iter::Iter(const SkAAClip& clip) { |
136 if (clip.isEmpty()) { | 136 if (clip.isEmpty()) { |
137 fDone = true; | 137 fDone = true; |
138 fTop = fBottom = clip.fBounds.fBottom; | 138 fTop = fBottom = clip.fBounds.fBottom; |
139 fData = NULL; | 139 fData = nullptr; |
140 fCurrYOff = NULL; | 140 fCurrYOff = nullptr; |
141 fStopYOff = NULL; | 141 fStopYOff = nullptr; |
142 return; | 142 return; |
143 } | 143 } |
144 | 144 |
145 const RunHead* head = clip.fRunHead; | 145 const RunHead* head = clip.fRunHead; |
146 fCurrYOff = head->yoffsets(); | 146 fCurrYOff = head->yoffsets(); |
147 fStopYOff = fCurrYOff + head->fRowCount; | 147 fStopYOff = fCurrYOff + head->fRowCount; |
148 fData = head->data() + fCurrYOff->fOffset; | 148 fData = head->data() + fCurrYOff->fOffset; |
149 | 149 |
150 // setup first value | 150 // setup first value |
151 fTop = clip.fBounds.fTop; | 151 fTop = clip.fBounds.fTop; |
152 fBottom = clip.fBounds.fTop + fCurrYOff->fY + 1; | 152 fBottom = clip.fBounds.fTop + fCurrYOff->fY + 1; |
153 fDone = false; | 153 fDone = false; |
154 } | 154 } |
155 | 155 |
156 void SkAAClip::Iter::next() { | 156 void SkAAClip::Iter::next() { |
157 if (!fDone) { | 157 if (!fDone) { |
158 const YOffset* prev = fCurrYOff; | 158 const YOffset* prev = fCurrYOff; |
159 const YOffset* curr = prev + 1; | 159 const YOffset* curr = prev + 1; |
160 SkASSERT(curr <= fStopYOff); | 160 SkASSERT(curr <= fStopYOff); |
161 | 161 |
162 fTop = fBottom; | 162 fTop = fBottom; |
163 if (curr >= fStopYOff) { | 163 if (curr >= fStopYOff) { |
164 fDone = true; | 164 fDone = true; |
165 fBottom = kMaxInt32; | 165 fBottom = kMaxInt32; |
166 fData = NULL; | 166 fData = nullptr; |
167 } else { | 167 } else { |
168 fBottom += curr->fY - prev->fY; | 168 fBottom += curr->fY - prev->fY; |
169 fData += curr->fOffset - prev->fOffset; | 169 fData += curr->fOffset - prev->fOffset; |
170 fCurrYOff = curr; | 170 fCurrYOff = curr; |
171 } | 171 } |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 #ifdef SK_DEBUG | 175 #ifdef SK_DEBUG |
176 // assert we're exactly width-wide, and then return the number of bytes used | 176 // assert we're exactly width-wide, and then return the number of bytes used |
177 static size_t compute_row_length(const uint8_t row[], int width) { | 177 static size_t compute_row_length(const uint8_t row[], int width) { |
178 const uint8_t* origRow = row; | 178 const uint8_t* origRow = row; |
179 while (width > 0) { | 179 while (width > 0) { |
180 int n = row[0]; | 180 int n = row[0]; |
181 SkASSERT(n > 0); | 181 SkASSERT(n > 0); |
182 SkASSERT(n <= width); | 182 SkASSERT(n <= width); |
183 row += 2; | 183 row += 2; |
184 width -= n; | 184 width -= n; |
185 } | 185 } |
186 SkASSERT(0 == width); | 186 SkASSERT(0 == width); |
187 return row - origRow; | 187 return row - origRow; |
188 } | 188 } |
189 | 189 |
190 void SkAAClip::validate() const { | 190 void SkAAClip::validate() const { |
191 if (NULL == fRunHead) { | 191 if (nullptr == fRunHead) { |
192 SkASSERT(fBounds.isEmpty()); | 192 SkASSERT(fBounds.isEmpty()); |
193 return; | 193 return; |
194 } | 194 } |
195 | 195 |
196 const RunHead* head = fRunHead; | 196 const RunHead* head = fRunHead; |
197 SkASSERT(head->fRefCnt > 0); | 197 SkASSERT(head->fRefCnt > 0); |
198 SkASSERT(head->fRowCount > 0); | 198 SkASSERT(head->fRowCount > 0); |
199 | 199 |
200 const YOffset* yoff = head->yoffsets(); | 200 const YOffset* yoff = head->yoffsets(); |
201 const YOffset* ystop = yoff + head->fRowCount; | 201 const YOffset* ystop = yoff + head->fRowCount; |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 if (fRunHead) { | 618 if (fRunHead) { |
619 SkASSERT(fRunHead->fRefCnt >= 1); | 619 SkASSERT(fRunHead->fRefCnt >= 1); |
620 if (1 == sk_atomic_dec(&fRunHead->fRefCnt)) { | 620 if (1 == sk_atomic_dec(&fRunHead->fRefCnt)) { |
621 sk_free(fRunHead); | 621 sk_free(fRunHead); |
622 } | 622 } |
623 } | 623 } |
624 } | 624 } |
625 | 625 |
626 SkAAClip::SkAAClip() { | 626 SkAAClip::SkAAClip() { |
627 fBounds.setEmpty(); | 627 fBounds.setEmpty(); |
628 fRunHead = NULL; | 628 fRunHead = nullptr; |
629 } | 629 } |
630 | 630 |
631 SkAAClip::SkAAClip(const SkAAClip& src) { | 631 SkAAClip::SkAAClip(const SkAAClip& src) { |
632 SkDEBUGCODE(fBounds.setEmpty();) // need this for validate | 632 SkDEBUGCODE(fBounds.setEmpty();) // need this for validate |
633 fRunHead = NULL; | 633 fRunHead = nullptr; |
634 *this = src; | 634 *this = src; |
635 } | 635 } |
636 | 636 |
637 SkAAClip::~SkAAClip() { | 637 SkAAClip::~SkAAClip() { |
638 this->freeRuns(); | 638 this->freeRuns(); |
639 } | 639 } |
640 | 640 |
641 SkAAClip& SkAAClip::operator=(const SkAAClip& src) { | 641 SkAAClip& SkAAClip::operator=(const SkAAClip& src) { |
642 AUTO_AACLIP_VALIDATE(*this); | 642 AUTO_AACLIP_VALIDATE(*this); |
643 src.validate(); | 643 src.validate(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 } | 691 } |
692 | 692 |
693 bool SkAAClip::set(const SkAAClip& src) { | 693 bool SkAAClip::set(const SkAAClip& src) { |
694 *this = src; | 694 *this = src; |
695 return !this->isEmpty(); | 695 return !this->isEmpty(); |
696 } | 696 } |
697 | 697 |
698 bool SkAAClip::setEmpty() { | 698 bool SkAAClip::setEmpty() { |
699 this->freeRuns(); | 699 this->freeRuns(); |
700 fBounds.setEmpty(); | 700 fBounds.setEmpty(); |
701 fRunHead = NULL; | 701 fRunHead = nullptr; |
702 return false; | 702 return false; |
703 } | 703 } |
704 | 704 |
705 bool SkAAClip::setRect(const SkIRect& bounds) { | 705 bool SkAAClip::setRect(const SkIRect& bounds) { |
706 if (bounds.isEmpty()) { | 706 if (bounds.isEmpty()) { |
707 return this->setEmpty(); | 707 return this->setEmpty(); |
708 } | 708 } |
709 | 709 |
710 AUTO_AACLIP_VALIDATE(*this); | 710 AUTO_AACLIP_VALIDATE(*this); |
711 | 711 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 if (r.isEmpty()) { | 756 if (r.isEmpty()) { |
757 return this->setEmpty(); | 757 return this->setEmpty(); |
758 } | 758 } |
759 | 759 |
760 AUTO_AACLIP_VALIDATE(*this); | 760 AUTO_AACLIP_VALIDATE(*this); |
761 | 761 |
762 // TODO: special case this | 762 // TODO: special case this |
763 | 763 |
764 SkPath path; | 764 SkPath path; |
765 path.addRect(r); | 765 path.addRect(r); |
766 return this->setPath(path, NULL, doAA); | 766 return this->setPath(path, nullptr, doAA); |
767 } | 767 } |
768 | 768 |
769 static void append_run(SkTDArray<uint8_t>& array, uint8_t value, int count) { | 769 static void append_run(SkTDArray<uint8_t>& array, uint8_t value, int count) { |
770 SkASSERT(count >= 0); | 770 SkASSERT(count >= 0); |
771 while (count > 0) { | 771 while (count > 0) { |
772 int n = count; | 772 int n = count; |
773 if (n > 255) { | 773 if (n > 255) { |
774 n = 255; | 774 n = 255; |
775 } | 775 } |
776 uint8_t* data = array.append(2); | 776 uint8_t* data = array.append(2); |
(...skipping 26 matching lines...) Expand all Loading... |
803 | 803 |
804 SkTDArray<YOffset> yArray; | 804 SkTDArray<YOffset> yArray; |
805 SkTDArray<uint8_t> xArray; | 805 SkTDArray<uint8_t> xArray; |
806 | 806 |
807 yArray.setReserve(SkMin32(bounds.height(), 1024)); | 807 yArray.setReserve(SkMin32(bounds.height(), 1024)); |
808 xArray.setReserve(SkMin32(bounds.width() * 128, 64 * 1024)); | 808 xArray.setReserve(SkMin32(bounds.width() * 128, 64 * 1024)); |
809 | 809 |
810 SkRegion::Iterator iter(rgn); | 810 SkRegion::Iterator iter(rgn); |
811 int prevRight = 0; | 811 int prevRight = 0; |
812 int prevBot = 0; | 812 int prevBot = 0; |
813 YOffset* currY = NULL; | 813 YOffset* currY = nullptr; |
814 | 814 |
815 for (; !iter.done(); iter.next()) { | 815 for (; !iter.done(); iter.next()) { |
816 const SkIRect& r = iter.rect(); | 816 const SkIRect& r = iter.rect(); |
817 SkASSERT(bounds.contains(r)); | 817 SkASSERT(bounds.contains(r)); |
818 | 818 |
819 int bot = r.fBottom - offsetY; | 819 int bot = r.fBottom - offsetY; |
820 SkASSERT(bot >= prevBot); | 820 SkASSERT(bot >= prevBot); |
821 if (bot > prevBot) { | 821 if (bot > prevBot) { |
822 if (currY) { | 822 if (currY) { |
823 // flush current row | 823 // flush current row |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 return true; | 862 return true; |
863 #endif | 863 #endif |
864 } | 864 } |
865 | 865 |
866 /////////////////////////////////////////////////////////////////////////////// | 866 /////////////////////////////////////////////////////////////////////////////// |
867 | 867 |
868 const uint8_t* SkAAClip::findRow(int y, int* lastYForRow) const { | 868 const uint8_t* SkAAClip::findRow(int y, int* lastYForRow) const { |
869 SkASSERT(fRunHead); | 869 SkASSERT(fRunHead); |
870 | 870 |
871 if (!y_in_rect(y, fBounds)) { | 871 if (!y_in_rect(y, fBounds)) { |
872 return NULL; | 872 return nullptr; |
873 } | 873 } |
874 y -= fBounds.y(); // our yoffs values are relative to the top | 874 y -= fBounds.y(); // our yoffs values are relative to the top |
875 | 875 |
876 const YOffset* yoff = fRunHead->yoffsets(); | 876 const YOffset* yoff = fRunHead->yoffsets(); |
877 while (yoff->fY < y) { | 877 while (yoff->fY < y) { |
878 yoff += 1; | 878 yoff += 1; |
879 SkASSERT(yoff - fRunHead->yoffsets() < fRunHead->fRowCount); | 879 SkASSERT(yoff - fRunHead->yoffsets() < fRunHead->fRowCount); |
880 } | 880 } |
881 | 881 |
882 if (lastYForRow) { | 882 if (lastYForRow) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 SkTDArray<Row> fRows; | 953 SkTDArray<Row> fRows; |
954 Row* fCurrRow; | 954 Row* fCurrRow; |
955 int fPrevY; | 955 int fPrevY; |
956 int fWidth; | 956 int fWidth; |
957 int fMinY; | 957 int fMinY; |
958 | 958 |
959 public: | 959 public: |
960 Builder(const SkIRect& bounds) : fBounds(bounds) { | 960 Builder(const SkIRect& bounds) : fBounds(bounds) { |
961 fPrevY = -1; | 961 fPrevY = -1; |
962 fWidth = bounds.width(); | 962 fWidth = bounds.width(); |
963 fCurrRow = NULL; | 963 fCurrRow = nullptr; |
964 fMinY = bounds.fTop; | 964 fMinY = bounds.fTop; |
965 } | 965 } |
966 | 966 |
967 ~Builder() { | 967 ~Builder() { |
968 Row* row = fRows.begin(); | 968 Row* row = fRows.begin(); |
969 Row* stop = fRows.end(); | 969 Row* stop = fRows.end(); |
970 while (row < stop) { | 970 while (row < stop) { |
971 delete row->fData; | 971 delete row->fData; |
972 row += 1; | 972 row += 1; |
973 } | 973 } |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 private: | 1174 private: |
1175 void flushRowH(Row* row) { | 1175 void flushRowH(Row* row) { |
1176 // flush current row if needed | 1176 // flush current row if needed |
1177 if (row->fWidth < fWidth) { | 1177 if (row->fWidth < fWidth) { |
1178 AppendRun(*row->fData, 0, fWidth - row->fWidth); | 1178 AppendRun(*row->fData, 0, fWidth - row->fWidth); |
1179 row->fWidth = fWidth; | 1179 row->fWidth = fWidth; |
1180 } | 1180 } |
1181 } | 1181 } |
1182 | 1182 |
1183 Row* flushRow(bool readyForAnother) { | 1183 Row* flushRow(bool readyForAnother) { |
1184 Row* next = NULL; | 1184 Row* next = nullptr; |
1185 int count = fRows.count(); | 1185 int count = fRows.count(); |
1186 if (count > 0) { | 1186 if (count > 0) { |
1187 this->flushRowH(&fRows[count - 1]); | 1187 this->flushRowH(&fRows[count - 1]); |
1188 } | 1188 } |
1189 if (count > 1) { | 1189 if (count > 1) { |
1190 // are our last two runs the same? | 1190 // are our last two runs the same? |
1191 Row* prev = &fRows[count - 2]; | 1191 Row* prev = &fRows[count - 2]; |
1192 Row* curr = &fRows[count - 1]; | 1192 Row* curr = &fRows[count - 1]; |
1193 SkASSERT(prev->fWidth == fWidth); | 1193 SkASSERT(prev->fWidth == fWidth); |
1194 SkASSERT(curr->fWidth == fWidth); | 1194 SkASSERT(curr->fWidth == fWidth); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 this->recordMinY(y); | 1291 this->recordMinY(y); |
1292 this->checkForYGap(y); | 1292 this->checkForYGap(y); |
1293 fBuilder->addAntiRectRun(x, y, width, height, leftAlpha, rightAlpha); | 1293 fBuilder->addAntiRectRun(x, y, width, height, leftAlpha, rightAlpha); |
1294 fLastY = y + height - 1; | 1294 fLastY = y + height - 1; |
1295 } | 1295 } |
1296 | 1296 |
1297 void blitMask(const SkMask&, const SkIRect& clip) override | 1297 void blitMask(const SkMask&, const SkIRect& clip) override |
1298 { unexpected(); } | 1298 { unexpected(); } |
1299 | 1299 |
1300 const SkPixmap* justAnOpaqueColor(uint32_t*) override { | 1300 const SkPixmap* justAnOpaqueColor(uint32_t*) override { |
1301 return NULL; | 1301 return nullptr; |
1302 } | 1302 } |
1303 | 1303 |
1304 void blitH(int x, int y, int width) override { | 1304 void blitH(int x, int y, int width) override { |
1305 this->recordMinY(y); | 1305 this->recordMinY(y); |
1306 this->checkForYGap(y); | 1306 this->checkForYGap(y); |
1307 fBuilder->addRun(x, y, 0xFF, width); | 1307 fBuilder->addRun(x, y, 0xFF, width); |
1308 } | 1308 } |
1309 | 1309 |
1310 virtual void blitAntiH(int x, int y, const SkAlpha alpha[], | 1310 virtual void blitAntiH(int x, int y, const SkAlpha alpha[], |
1311 const int16_t runs[]) override { | 1311 const int16_t runs[]) override { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 AUTO_AACLIP_VALIDATE(*this); | 1374 AUTO_AACLIP_VALIDATE(*this); |
1375 | 1375 |
1376 if (clip && clip->isEmpty()) { | 1376 if (clip && clip->isEmpty()) { |
1377 return this->setEmpty(); | 1377 return this->setEmpty(); |
1378 } | 1378 } |
1379 | 1379 |
1380 SkIRect ibounds; | 1380 SkIRect ibounds; |
1381 path.getBounds().roundOut(&ibounds); | 1381 path.getBounds().roundOut(&ibounds); |
1382 | 1382 |
1383 SkRegion tmpClip; | 1383 SkRegion tmpClip; |
1384 if (NULL == clip) { | 1384 if (nullptr == clip) { |
1385 tmpClip.setRect(ibounds); | 1385 tmpClip.setRect(ibounds); |
1386 clip = &tmpClip; | 1386 clip = &tmpClip; |
1387 } | 1387 } |
1388 | 1388 |
1389 if (path.isInverseFillType()) { | 1389 if (path.isInverseFillType()) { |
1390 ibounds = clip->getBounds(); | 1390 ibounds = clip->getBounds(); |
1391 } else { | 1391 } else { |
1392 if (ibounds.isEmpty() || !ibounds.intersect(clip->getBounds())) { | 1392 if (ibounds.isEmpty() || !ibounds.intersect(clip->getBounds())) { |
1393 return this->setEmpty(); | 1393 return this->setEmpty(); |
1394 } | 1394 } |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1601 SkAAClip::Iter iterB(B); | 1601 SkAAClip::Iter iterB(B); |
1602 | 1602 |
1603 SkASSERT(!iterA.done()); | 1603 SkASSERT(!iterA.done()); |
1604 int topA = iterA.top(); | 1604 int topA = iterA.top(); |
1605 int botA = iterA.bottom(); | 1605 int botA = iterA.bottom(); |
1606 SkASSERT(!iterB.done()); | 1606 SkASSERT(!iterB.done()); |
1607 int topB = iterB.top(); | 1607 int topB = iterB.top(); |
1608 int botB = iterB.bottom(); | 1608 int botB = iterB.bottom(); |
1609 | 1609 |
1610 do { | 1610 do { |
1611 const uint8_t* rowA = NULL; | 1611 const uint8_t* rowA = nullptr; |
1612 const uint8_t* rowB = NULL; | 1612 const uint8_t* rowB = nullptr; |
1613 int top, bot; | 1613 int top, bot; |
1614 | 1614 |
1615 if (topA < topB) { | 1615 if (topA < topB) { |
1616 top = topA; | 1616 top = topA; |
1617 rowA = iterA.data(); | 1617 rowA = iterA.data(); |
1618 if (botA <= topB) { | 1618 if (botA <= topB) { |
1619 bot = botA; | 1619 bot = botA; |
1620 } else { | 1620 } else { |
1621 bot = topA = topB; | 1621 bot = topA = topB; |
1622 } | 1622 } |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 return this->op(*this, clip, op); | 1796 return this->op(*this, clip, op); |
1797 } | 1797 } |
1798 | 1798 |
1799 bool SkAAClip::op(const SkAAClip& clip, SkRegion::Op op) { | 1799 bool SkAAClip::op(const SkAAClip& clip, SkRegion::Op op) { |
1800 return this->op(*this, clip, op); | 1800 return this->op(*this, clip, op); |
1801 } | 1801 } |
1802 | 1802 |
1803 /////////////////////////////////////////////////////////////////////////////// | 1803 /////////////////////////////////////////////////////////////////////////////// |
1804 | 1804 |
1805 bool SkAAClip::translate(int dx, int dy, SkAAClip* dst) const { | 1805 bool SkAAClip::translate(int dx, int dy, SkAAClip* dst) const { |
1806 if (NULL == dst) { | 1806 if (nullptr == dst) { |
1807 return !this->isEmpty(); | 1807 return !this->isEmpty(); |
1808 } | 1808 } |
1809 | 1809 |
1810 if (this->isEmpty()) { | 1810 if (this->isEmpty()) { |
1811 return dst->setEmpty(); | 1811 return dst->setEmpty(); |
1812 } | 1812 } |
1813 | 1813 |
1814 if (this != dst) { | 1814 if (this != dst) { |
1815 sk_atomic_inc(&fRunHead->fRefCnt); | 1815 sk_atomic_inc(&fRunHead->fRefCnt); |
1816 dst->freeRuns(); | 1816 dst->freeRuns(); |
(...skipping 15 matching lines...) Expand all Loading... |
1832 row += 2; | 1832 row += 2; |
1833 width -= n; | 1833 width -= n; |
1834 } | 1834 } |
1835 SkASSERT(0 == width); | 1835 SkASSERT(0 == width); |
1836 } | 1836 } |
1837 | 1837 |
1838 void SkAAClip::copyToMask(SkMask* mask) const { | 1838 void SkAAClip::copyToMask(SkMask* mask) const { |
1839 mask->fFormat = SkMask::kA8_Format; | 1839 mask->fFormat = SkMask::kA8_Format; |
1840 if (this->isEmpty()) { | 1840 if (this->isEmpty()) { |
1841 mask->fBounds.setEmpty(); | 1841 mask->fBounds.setEmpty(); |
1842 mask->fImage = NULL; | 1842 mask->fImage = nullptr; |
1843 mask->fRowBytes = 0; | 1843 mask->fRowBytes = 0; |
1844 return; | 1844 return; |
1845 } | 1845 } |
1846 | 1846 |
1847 mask->fBounds = fBounds; | 1847 mask->fBounds = fBounds; |
1848 mask->fRowBytes = fBounds.width(); | 1848 mask->fRowBytes = fBounds.width(); |
1849 size_t size = mask->computeImageSize(); | 1849 size_t size = mask->computeImageSize(); |
1850 mask->fImage = SkMask::AllocImage(size); | 1850 mask->fImage = SkMask::AllocImage(size); |
1851 | 1851 |
1852 Iter iter(*this); | 1852 Iter iter(*this); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 n = data[0]; | 1891 n = data[0]; |
1892 } | 1892 } |
1893 runs[0] = 0; // sentinel | 1893 runs[0] = 0; // sentinel |
1894 } | 1894 } |
1895 | 1895 |
1896 SkAAClipBlitter::~SkAAClipBlitter() { | 1896 SkAAClipBlitter::~SkAAClipBlitter() { |
1897 sk_free(fScanlineScratch); | 1897 sk_free(fScanlineScratch); |
1898 } | 1898 } |
1899 | 1899 |
1900 void SkAAClipBlitter::ensureRunsAndAA() { | 1900 void SkAAClipBlitter::ensureRunsAndAA() { |
1901 if (NULL == fScanlineScratch) { | 1901 if (nullptr == fScanlineScratch) { |
1902 // add 1 so we can store the terminating run count of 0 | 1902 // add 1 so we can store the terminating run count of 0 |
1903 int count = fAAClipBounds.width() + 1; | 1903 int count = fAAClipBounds.width() + 1; |
1904 // we use this either for fRuns + fAA, or a scaline of a mask | 1904 // we use this either for fRuns + fAA, or a scaline of a mask |
1905 // which may be as deep as 32bits | 1905 // which may be as deep as 32bits |
1906 fScanlineScratch = sk_malloc_throw(count * sizeof(SkPMColor)); | 1906 fScanlineScratch = sk_malloc_throw(count * sizeof(SkPMColor)); |
1907 fRuns = (int16_t*)fScanlineScratch; | 1907 fRuns = (int16_t*)fScanlineScratch; |
1908 fAA = (SkAlpha*)(fRuns + count); | 1908 fAA = (SkAlpha*)(fRuns + count); |
1909 } | 1909 } |
1910 } | 1910 } |
1911 | 1911 |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2085 SkASSERT(rowN == n); | 2085 SkASSERT(rowN == n); |
2086 row += 2; | 2086 row += 2; |
2087 rowN = row[0]; | 2087 rowN = row[0]; |
2088 } | 2088 } |
2089 } | 2089 } |
2090 | 2090 |
2091 static MergeAAProc find_merge_aa_proc(SkMask::Format format) { | 2091 static MergeAAProc find_merge_aa_proc(SkMask::Format format) { |
2092 switch (format) { | 2092 switch (format) { |
2093 case SkMask::kBW_Format: | 2093 case SkMask::kBW_Format: |
2094 SkDEBUGFAIL("unsupported"); | 2094 SkDEBUGFAIL("unsupported"); |
2095 return NULL; | 2095 return nullptr; |
2096 case SkMask::kA8_Format: | 2096 case SkMask::kA8_Format: |
2097 case SkMask::k3D_Format: { | 2097 case SkMask::k3D_Format: { |
2098 void (*proc8)(const uint8_t*, int, const uint8_t*, int, uint8_t*) =
mergeT; | 2098 void (*proc8)(const uint8_t*, int, const uint8_t*, int, uint8_t*) =
mergeT; |
2099 return (MergeAAProc)proc8; | 2099 return (MergeAAProc)proc8; |
2100 } | 2100 } |
2101 case SkMask::kLCD16_Format: { | 2101 case SkMask::kLCD16_Format: { |
2102 void (*proc16)(const uint16_t*, int, const uint8_t*, int, uint16_t*)
= mergeT; | 2102 void (*proc16)(const uint16_t*, int, const uint8_t*, int, uint16_t*)
= mergeT; |
2103 return (MergeAAProc)proc16; | 2103 return (MergeAAProc)proc16; |
2104 } | 2104 } |
2105 default: | 2105 default: |
2106 SkDEBUGFAIL("unsupported"); | 2106 SkDEBUGFAIL("unsupported"); |
2107 return NULL; | 2107 return nullptr; |
2108 } | 2108 } |
2109 } | 2109 } |
2110 | 2110 |
2111 static U8CPU bit2byte(int bitInAByte) { | 2111 static U8CPU bit2byte(int bitInAByte) { |
2112 SkASSERT(bitInAByte <= 0xFF); | 2112 SkASSERT(bitInAByte <= 0xFF); |
2113 // negation turns any non-zero into 0xFFFFFF??, so we just shift down | 2113 // negation turns any non-zero into 0xFFFFFF??, so we just shift down |
2114 // some value >= 8 to get a full FF value | 2114 // some value >= 8 to get a full FF value |
2115 return -bitInAByte >> 8; | 2115 return -bitInAByte >> 8; |
2116 } | 2116 } |
2117 | 2117 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2161 | 2161 |
2162 if (fAAClip->quickContains(clip)) { | 2162 if (fAAClip->quickContains(clip)) { |
2163 fBlitter->blitMask(origMask, clip); | 2163 fBlitter->blitMask(origMask, clip); |
2164 return; | 2164 return; |
2165 } | 2165 } |
2166 | 2166 |
2167 const SkMask* mask = &origMask; | 2167 const SkMask* mask = &origMask; |
2168 | 2168 |
2169 // if we're BW, we need to upscale to A8 (ugh) | 2169 // if we're BW, we need to upscale to A8 (ugh) |
2170 SkMask grayMask; | 2170 SkMask grayMask; |
2171 grayMask.fImage = NULL; | 2171 grayMask.fImage = nullptr; |
2172 if (SkMask::kBW_Format == origMask.fFormat) { | 2172 if (SkMask::kBW_Format == origMask.fFormat) { |
2173 grayMask.fFormat = SkMask::kA8_Format; | 2173 grayMask.fFormat = SkMask::kA8_Format; |
2174 grayMask.fBounds = origMask.fBounds; | 2174 grayMask.fBounds = origMask.fBounds; |
2175 grayMask.fRowBytes = origMask.fBounds.width(); | 2175 grayMask.fRowBytes = origMask.fBounds.width(); |
2176 size_t size = grayMask.computeImageSize(); | 2176 size_t size = grayMask.computeImageSize(); |
2177 grayMask.fImage = (uint8_t*)fGrayMaskScratch.reset(size, | 2177 grayMask.fImage = (uint8_t*)fGrayMaskScratch.reset(size, |
2178 SkAutoMalloc::kReuse_OnShrink); | 2178 SkAutoMalloc::kReuse_OnShrink); |
2179 | 2179 |
2180 upscaleBW2A8(&grayMask, origMask); | 2180 upscaleBW2A8(&grayMask, origMask); |
2181 mask = &grayMask; | 2181 mask = &grayMask; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2213 mergeProc(src, width, row, initialCount, rowMask.fImage); | 2213 mergeProc(src, width, row, initialCount, rowMask.fImage); |
2214 rowMask.fBounds.fTop = y; | 2214 rowMask.fBounds.fTop = y; |
2215 rowMask.fBounds.fBottom = y + 1; | 2215 rowMask.fBounds.fBottom = y + 1; |
2216 fBlitter->blitMask(rowMask, rowMask.fBounds); | 2216 fBlitter->blitMask(rowMask, rowMask.fBounds); |
2217 src = (const void*)((const char*)src + srcRB); | 2217 src = (const void*)((const char*)src + srcRB); |
2218 } while (++y < localStopY); | 2218 } while (++y < localStopY); |
2219 } while (y < stopY); | 2219 } while (y < stopY); |
2220 } | 2220 } |
2221 | 2221 |
2222 const SkPixmap* SkAAClipBlitter::justAnOpaqueColor(uint32_t* value) { | 2222 const SkPixmap* SkAAClipBlitter::justAnOpaqueColor(uint32_t* value) { |
2223 return NULL; | 2223 return nullptr; |
2224 } | 2224 } |
OLD | NEW |