| 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 "SkPaint.h" | 8 #include "SkPaint.h" |
| 9 #include "SkAnnotation.h" | 9 #include "SkAnnotation.h" |
| 10 #include "SkAutoKern.h" | 10 #include "SkAutoKern.h" |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1091 if (zoom) { | 1091 if (zoom) { |
| 1092 zoomMatrix.setScale(zoom, zoom); | 1092 zoomMatrix.setScale(zoom, zoom); |
| 1093 zoomPtr = &zoomMatrix; | 1093 zoomPtr = &zoomMatrix; |
| 1094 } | 1094 } |
| 1095 | 1095 |
| 1096 FontMetrics storage; | 1096 FontMetrics storage; |
| 1097 if (nullptr == metrics) { | 1097 if (nullptr == metrics) { |
| 1098 metrics = &storage; | 1098 metrics = &storage; |
| 1099 } | 1099 } |
| 1100 | 1100 |
| 1101 paint.descriptorProc(nullptr, zoomPtr, FontMetricsDescProc, metrics, true); | 1101 paint.descriptorProc(nullptr, FakeGamma::Off, zoomPtr, FontMetricsDescProc,
metrics); |
| 1102 | 1102 |
| 1103 if (scale) { | 1103 if (scale) { |
| 1104 metrics->fTop = SkScalarMul(metrics->fTop, scale); | 1104 metrics->fTop = SkScalarMul(metrics->fTop, scale); |
| 1105 metrics->fAscent = SkScalarMul(metrics->fAscent, scale); | 1105 metrics->fAscent = SkScalarMul(metrics->fAscent, scale); |
| 1106 metrics->fDescent = SkScalarMul(metrics->fDescent, scale); | 1106 metrics->fDescent = SkScalarMul(metrics->fDescent, scale); |
| 1107 metrics->fBottom = SkScalarMul(metrics->fBottom, scale); | 1107 metrics->fBottom = SkScalarMul(metrics->fBottom, scale); |
| 1108 metrics->fLeading = SkScalarMul(metrics->fLeading, scale); | 1108 metrics->fLeading = SkScalarMul(metrics->fLeading, scale); |
| 1109 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale); | 1109 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale); |
| 1110 metrics->fXMin = SkScalarMul(metrics->fXMin, scale); | 1110 metrics->fXMin = SkScalarMul(metrics->fXMin, scale); |
| 1111 metrics->fXMax = SkScalarMul(metrics->fXMax, scale); | 1111 metrics->fXMax = SkScalarMul(metrics->fXMax, scale); |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1683 } | 1683 } |
| 1684 if (ra) { | 1684 if (ra) { |
| 1685 add_flattenable(desc, kRasterizer_SkDescriptorTag, raBuffer); | 1685 add_flattenable(desc, kRasterizer_SkDescriptorTag, raBuffer); |
| 1686 } | 1686 } |
| 1687 | 1687 |
| 1688 desc->computeChecksum(); | 1688 desc->computeChecksum(); |
| 1689 } | 1689 } |
| 1690 | 1690 |
| 1691 static size_t fill_out_rec(const SkPaint& paint, SkScalerContext::Rec* rec, | 1691 static size_t fill_out_rec(const SkPaint& paint, SkScalerContext::Rec* rec, |
| 1692 const SkSurfaceProps* surfaceProps, | 1692 const SkSurfaceProps* surfaceProps, |
| 1693 const SkMatrix* deviceMatrix, bool ignoreGamma, | 1693 bool fakeGamma, |
| 1694 const SkMatrix* deviceMatrix, |
| 1694 const SkPathEffect* pe, SkWriteBuffer* peBuffer, | 1695 const SkPathEffect* pe, SkWriteBuffer* peBuffer, |
| 1695 const SkMaskFilter* mf, SkWriteBuffer* mfBuffer, | 1696 const SkMaskFilter* mf, SkWriteBuffer* mfBuffer, |
| 1696 const SkRasterizer* ra, SkWriteBuffer* raBuffer) { | 1697 const SkRasterizer* ra, SkWriteBuffer* raBuffer) { |
| 1697 SkScalerContext::MakeRec(paint, surfaceProps, deviceMatrix, rec); | 1698 SkScalerContext::MakeRec(paint, surfaceProps, deviceMatrix, rec); |
| 1698 if (ignoreGamma) { | 1699 if (!fakeGamma) { |
| 1699 rec->ignorePreBlend(); | 1700 rec->ignorePreBlend(); |
| 1700 } | 1701 } |
| 1701 | 1702 |
| 1702 int entryCount = 1; | 1703 int entryCount = 1; |
| 1703 size_t descSize = sizeof(*rec); | 1704 size_t descSize = sizeof(*rec); |
| 1704 | 1705 |
| 1705 if (pe) { | 1706 if (pe) { |
| 1706 peBuffer->writeFlattenable(pe); | 1707 peBuffer->writeFlattenable(pe); |
| 1707 descSize += peBuffer->bytesWritten(); | 1708 descSize += peBuffer->bytesWritten(); |
| 1708 entryCount += 1; | 1709 entryCount += 1; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1778 desc1->computeChecksum(); | 1779 desc1->computeChecksum(); |
| 1779 desc2->computeChecksum(); | 1780 desc2->computeChecksum(); |
| 1780 SkASSERT(!memcmp(desc, desc1, descSize)); | 1781 SkASSERT(!memcmp(desc, desc1, descSize)); |
| 1781 SkASSERT(!memcmp(desc, desc2, descSize)); | 1782 SkASSERT(!memcmp(desc, desc2, descSize)); |
| 1782 } | 1783 } |
| 1783 #endif | 1784 #endif |
| 1784 | 1785 |
| 1785 /* see the note on ignoreGamma on descriptorProc */ | 1786 /* see the note on ignoreGamma on descriptorProc */ |
| 1786 void SkPaint::getScalerContextDescriptor(SkAutoDescriptor* ad, | 1787 void SkPaint::getScalerContextDescriptor(SkAutoDescriptor* ad, |
| 1787 const SkSurfaceProps& surfaceProps, | 1788 const SkSurfaceProps& surfaceProps, |
| 1788 const SkMatrix* deviceMatrix, bool igno
reGamma) const { | 1789 FakeGamma fakeGamma, |
| 1790 const SkMatrix* deviceMatrix) const { |
| 1789 SkScalerContext::Rec rec; | 1791 SkScalerContext::Rec rec; |
| 1790 | 1792 |
| 1791 SkPathEffect* pe = this->getPathEffect(); | 1793 SkPathEffect* pe = this->getPathEffect(); |
| 1792 SkMaskFilter* mf = this->getMaskFilter(); | 1794 SkMaskFilter* mf = this->getMaskFilter(); |
| 1793 SkRasterizer* ra = this->getRasterizer(); | 1795 SkRasterizer* ra = this->getRasterizer(); |
| 1794 | 1796 |
| 1795 SkWriteBuffer peBuffer, mfBuffer, raBuffer; | 1797 SkWriteBuffer peBuffer, mfBuffer, raBuffer; |
| 1796 size_t descSize = fill_out_rec(*this, &rec, &surfaceProps, deviceMatrix, ign
oreGamma, | 1798 size_t descSize = fill_out_rec(*this, &rec, |
| 1799 &surfaceProps, FakeGamma::On == fakeGamma, de
viceMatrix, |
| 1797 pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer); | 1800 pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer); |
| 1798 | 1801 |
| 1799 ad->reset(descSize); | 1802 ad->reset(descSize); |
| 1800 SkDescriptor* desc = ad->getDesc(); | 1803 SkDescriptor* desc = ad->getDesc(); |
| 1801 | 1804 |
| 1802 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer,
descSize); | 1805 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer,
descSize); |
| 1803 | 1806 |
| 1804 SkASSERT(descSize == desc->getLength()); | 1807 SkASSERT(descSize == desc->getLength()); |
| 1805 | 1808 |
| 1806 #ifdef TEST_DESC | 1809 #ifdef TEST_DESC |
| 1807 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); | 1810 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); |
| 1808 #endif | 1811 #endif |
| 1809 } | 1812 } |
| 1810 | 1813 |
| 1811 /* | 1814 /* |
| 1812 * ignoreGamma tells us that the caller just wants metrics that are unaffected | 1815 * ignoreGamma tells us that the caller just wants metrics that are unaffected |
| 1813 * by gamma correction, so we set the rec to ignore preblend: i.e. gamma = 1, | 1816 * by gamma correction, so we set the rec to ignore preblend: i.e. gamma = 1, |
| 1814 * contrast = 0, luminanceColor = transparent black. | 1817 * contrast = 0, luminanceColor = transparent black. |
| 1815 */ | 1818 */ |
| 1816 void SkPaint::descriptorProc(const SkSurfaceProps* surfaceProps, | 1819 void SkPaint::descriptorProc(const SkSurfaceProps* surfaceProps, |
| 1820 FakeGamma fakeGamma, |
| 1817 const SkMatrix* deviceMatrix, | 1821 const SkMatrix* deviceMatrix, |
| 1818 void (*proc)(SkTypeface*, const SkDescriptor*, void
*), | 1822 void (*proc)(SkTypeface*, const SkDescriptor*, void
*), |
| 1819 void* context, bool ignoreGamma) const { | 1823 void* context) const { |
| 1820 SkScalerContext::Rec rec; | 1824 SkScalerContext::Rec rec; |
| 1821 | 1825 |
| 1822 SkPathEffect* pe = this->getPathEffect(); | 1826 SkPathEffect* pe = this->getPathEffect(); |
| 1823 SkMaskFilter* mf = this->getMaskFilter(); | 1827 SkMaskFilter* mf = this->getMaskFilter(); |
| 1824 SkRasterizer* ra = this->getRasterizer(); | 1828 SkRasterizer* ra = this->getRasterizer(); |
| 1825 | 1829 |
| 1826 SkWriteBuffer peBuffer, mfBuffer, raBuffer; | 1830 SkWriteBuffer peBuffer, mfBuffer, raBuffer; |
| 1827 size_t descSize = fill_out_rec(*this, &rec, surfaceProps, deviceMatrix, igno
reGamma, | 1831 size_t descSize = fill_out_rec(*this, &rec, |
| 1832 surfaceProps, FakeGamma::On == fakeGamma, dev
iceMatrix, |
| 1828 pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer); | 1833 pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer); |
| 1829 | 1834 |
| 1830 SkAutoDescriptor ad(descSize); | 1835 SkAutoDescriptor ad(descSize); |
| 1831 SkDescriptor* desc = ad.getDesc(); | 1836 SkDescriptor* desc = ad.getDesc(); |
| 1832 | 1837 |
| 1833 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer,
descSize); | 1838 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer,
descSize); |
| 1834 | 1839 |
| 1835 SkASSERT(descSize == desc->getLength()); | 1840 SkASSERT(descSize == desc->getLength()); |
| 1836 | 1841 |
| 1837 #ifdef TEST_DESC | 1842 #ifdef TEST_DESC |
| 1838 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); | 1843 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); |
| 1839 #endif | 1844 #endif |
| 1840 | 1845 |
| 1841 proc(fTypeface, desc, context); | 1846 proc(fTypeface, desc, context); |
| 1842 } | 1847 } |
| 1843 | 1848 |
| 1844 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, | 1849 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, |
| 1845 const SkMatrix* deviceMatrix, | 1850 FakeGamma fakeGamma, |
| 1846 bool ignoreGamma) const { | 1851 const SkMatrix* deviceMatrix) const { |
| 1847 SkGlyphCache* cache; | 1852 SkGlyphCache* cache; |
| 1848 this->descriptorProc(surfaceProps, deviceMatrix, DetachDescProc, &cache, ign
oreGamma); | 1853 this->descriptorProc(surfaceProps, fakeGamma, deviceMatrix, DetachDescProc,
&cache); |
| 1849 return cache; | 1854 return cache; |
| 1850 } | 1855 } |
| 1851 | 1856 |
| 1852 /** | 1857 /** |
| 1853 * Expands fDeviceGamma, fPaintGamma, fContrast, and fLumBits into a mask pre-bl
end. | 1858 * Expands fDeviceGamma, fPaintGamma, fContrast, and fLumBits into a mask pre-bl
end. |
| 1854 */ | 1859 */ |
| 1855 //static | 1860 //static |
| 1856 SkMaskGamma::PreBlend SkScalerContext::GetMaskPreBlend(const SkScalerContext::Re
c& rec) { | 1861 SkMaskGamma::PreBlend SkScalerContext::GetMaskPreBlend(const SkScalerContext::Re
c& rec) { |
| 1857 SkAutoMutexAcquire ama(gMaskGammaCacheMutex); | 1862 SkAutoMutexAcquire ama(gMaskGammaCacheMutex); |
| 1858 const SkMaskGamma& maskGamma = cachedMaskGamma(rec.getContrast(), | 1863 const SkMaskGamma& maskGamma = cachedMaskGamma(rec.getContrast(), |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2410 } | 2415 } |
| 2411 } else { | 2416 } else { |
| 2412 fScale = SK_Scalar1; | 2417 fScale = SK_Scalar1; |
| 2413 } | 2418 } |
| 2414 | 2419 |
| 2415 if (!applyStrokeAndPathEffects) { | 2420 if (!applyStrokeAndPathEffects) { |
| 2416 fPaint.setStyle(SkPaint::kFill_Style); | 2421 fPaint.setStyle(SkPaint::kFill_Style); |
| 2417 fPaint.setPathEffect(nullptr); | 2422 fPaint.setPathEffect(nullptr); |
| 2418 } | 2423 } |
| 2419 | 2424 |
| 2420 fCache = fPaint.detachCache(nullptr, nullptr, false); | 2425 fCache = fPaint.detachCache(nullptr, SkPaint::FakeGamma::On, nullptr); |
| 2421 | 2426 |
| 2422 SkPaint::Style style = SkPaint::kFill_Style; | 2427 SkPaint::Style style = SkPaint::kFill_Style; |
| 2423 SkPathEffect* pe = nullptr; | 2428 SkPathEffect* pe = nullptr; |
| 2424 | 2429 |
| 2425 if (!applyStrokeAndPathEffects) { | 2430 if (!applyStrokeAndPathEffects) { |
| 2426 style = paint.getStyle(); // restore | 2431 style = paint.getStyle(); // restore |
| 2427 pe = paint.getPathEffect(); // restore | 2432 pe = paint.getPathEffect(); // restore |
| 2428 } | 2433 } |
| 2429 fPaint.setStyle(style); | 2434 fPaint.setStyle(style); |
| 2430 fPaint.setPathEffect(pe); | 2435 fPaint.setPathEffect(pe); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2530 } | 2535 } |
| 2531 | 2536 |
| 2532 uint32_t SkPaint::getHash() const { | 2537 uint32_t SkPaint::getHash() const { |
| 2533 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, | 2538 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, |
| 2534 // so fBitfields should be 10 pointers and 6 32-bit values from the start. | 2539 // so fBitfields should be 10 pointers and 6 32-bit values from the start. |
| 2535 static_assert(offsetof(SkPaint, fBitfields) == 10 * sizeof(void*) + 6 * size
of(uint32_t), | 2540 static_assert(offsetof(SkPaint, fBitfields) == 10 * sizeof(void*) + 6 * size
of(uint32_t), |
| 2536 "SkPaint_notPackedTightly"); | 2541 "SkPaint_notPackedTightly"); |
| 2537 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), | 2542 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), |
| 2538 offsetof(SkPaint, fBitfields) + sizeof(fBitfields
)); | 2543 offsetof(SkPaint, fBitfields) + sizeof(fBitfields
)); |
| 2539 } | 2544 } |
| OLD | NEW |