Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Side by Side Diff: src/core/SkCanvas.cpp

Issue 702473004: Add tracing to the SkCanvas drawFoo() methods to find long draw ops. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: canvas-tracing: fixmac Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2008 The Android Open Source Project 2 * Copyright 2008 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 "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkCanvasPriv.h" 9 #include "SkCanvasPriv.h"
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
11 #include "SkDeviceImageFilterProxy.h" 11 #include "SkDeviceImageFilterProxy.h"
12 #include "SkDraw.h" 12 #include "SkDraw.h"
13 #include "SkDrawFilter.h" 13 #include "SkDrawFilter.h"
14 #include "SkDrawLooper.h" 14 #include "SkDrawLooper.h"
15 #include "SkImage.h" 15 #include "SkImage.h"
16 #include "SkMetaData.h" 16 #include "SkMetaData.h"
17 #include "SkPathOps.h" 17 #include "SkPathOps.h"
18 #include "SkPatchUtils.h" 18 #include "SkPatchUtils.h"
19 #include "SkPicture.h" 19 #include "SkPicture.h"
20 #include "SkRasterClip.h" 20 #include "SkRasterClip.h"
21 #include "SkRRect.h" 21 #include "SkRRect.h"
22 #include "SkSmallAllocator.h" 22 #include "SkSmallAllocator.h"
23 #include "SkSurface_Base.h" 23 #include "SkSurface_Base.h"
24 #include "SkTemplates.h" 24 #include "SkTemplates.h"
25 #include "SkTextBlob.h" 25 #include "SkTextBlob.h"
26 #include "SkTextFormatParams.h" 26 #include "SkTextFormatParams.h"
27 #include "SkTLazy.h" 27 #include "SkTLazy.h"
28 #include "SkTraceEvent.h"
28 #include "SkUtils.h" 29 #include "SkUtils.h"
29 30
30 #if SK_SUPPORT_GPU 31 #if SK_SUPPORT_GPU
31 #include "GrRenderTarget.h" 32 #include "GrRenderTarget.h"
32 #endif 33 #endif
33 34
34 // experimental for faster tiled drawing... 35 // experimental for faster tiled drawing...
35 //#define SK_ENABLE_CLIP_QUICKREJECT 36 //#define SK_ENABLE_CLIP_QUICKREJECT
36 37
37 //#define SK_TRACE_SAVERESTORE 38 //#define SK_TRACE_SAVERESTORE
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 } 1232 }
1232 } else { 1233 } else {
1233 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint); 1234 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint);
1234 } 1235 }
1235 } 1236 }
1236 LOOPER_END 1237 LOOPER_END
1237 } 1238 }
1238 1239
1239 void SkCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, 1240 void SkCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
1240 const SkPaint* paint) { 1241 const SkPaint* paint) {
1242 TRACE_EVENT0("skia", "SkCanvas::drawSprite()");
1241 if (bitmap.drawsNothing()) { 1243 if (bitmap.drawsNothing()) {
1242 return; 1244 return;
1243 } 1245 }
1244 SkDEBUGCODE(bitmap.validate();) 1246 SkDEBUGCODE(bitmap.validate();)
1245 1247
1246 SkPaint tmp; 1248 SkPaint tmp;
1247 if (NULL == paint) { 1249 if (NULL == paint) {
1248 paint = &tmp; 1250 paint = &tmp;
1249 } 1251 }
1250 1252
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
1677 } 1679 }
1678 } 1680 }
1679 #endif 1681 #endif
1680 1682
1681 return NULL; 1683 return NULL;
1682 1684
1683 } 1685 }
1684 1686
1685 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner, 1687 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner,
1686 const SkPaint& paint) { 1688 const SkPaint& paint) {
1689 TRACE_EVENT0("skia", "SkCanvas::drawDRRect()");
1687 if (outer.isEmpty()) { 1690 if (outer.isEmpty()) {
1688 return; 1691 return;
1689 } 1692 }
1690 if (inner.isEmpty()) { 1693 if (inner.isEmpty()) {
1691 this->drawRRect(outer, paint); 1694 this->drawRRect(outer, paint);
1692 return; 1695 return;
1693 } 1696 }
1694 1697
1695 // We don't have this method (yet), but technically this is what we should 1698 // We don't have this method (yet), but technically this is what we should
1696 // be able to assert... 1699 // be able to assert...
(...skipping 17 matching lines...) Expand all
1714 } 1717 }
1715 } 1718 }
1716 1719
1717 void SkCanvas::onDiscard() { 1720 void SkCanvas::onDiscard() {
1718 if (fSurfaceBase) { 1721 if (fSurfaceBase) {
1719 fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); 1722 fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode);
1720 } 1723 }
1721 } 1724 }
1722 1725
1723 void SkCanvas::drawPaint(const SkPaint& paint) { 1726 void SkCanvas::drawPaint(const SkPaint& paint) {
1727 TRACE_EVENT0("skia", "SkCanvas::drawPaint()");
1724 this->internalDrawPaint(paint); 1728 this->internalDrawPaint(paint);
1725 } 1729 }
1726 1730
1727 void SkCanvas::internalDrawPaint(const SkPaint& paint) { 1731 void SkCanvas::internalDrawPaint(const SkPaint& paint) {
1728 LOOPER_BEGIN(paint, SkDrawFilter::kPaint_Type, NULL) 1732 LOOPER_BEGIN(paint, SkDrawFilter::kPaint_Type, NULL)
1729 1733
1730 while (iter.next()) { 1734 while (iter.next()) {
1731 iter.fDevice->drawPaint(iter, looper.paint()); 1735 iter.fDevice->drawPaint(iter, looper.paint());
1732 } 1736 }
1733 1737
1734 LOOPER_END 1738 LOOPER_END
1735 } 1739 }
1736 1740
1737 void SkCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], 1741 void SkCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
1738 const SkPaint& paint) { 1742 const SkPaint& paint) {
1743 TRACE_EVENT1("skia", "SkCanvas::drawPoints()", "count", static_cast<uint64_t >(count));
1739 if ((long)count <= 0) { 1744 if ((long)count <= 0) {
1740 return; 1745 return;
1741 } 1746 }
1742 1747
1743 SkRect r, storage; 1748 SkRect r, storage;
1744 const SkRect* bounds = NULL; 1749 const SkRect* bounds = NULL;
1745 if (paint.canComputeFastBounds()) { 1750 if (paint.canComputeFastBounds()) {
1746 // special-case 2 points (common for drawing a single line) 1751 // special-case 2 points (common for drawing a single line)
1747 if (2 == count) { 1752 if (2 == count) {
1748 r.set(pts[0], pts[1]); 1753 r.set(pts[0], pts[1]);
(...skipping 11 matching lines...) Expand all
1760 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds) 1765 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds)
1761 1766
1762 while (iter.next()) { 1767 while (iter.next()) {
1763 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint()); 1768 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint());
1764 } 1769 }
1765 1770
1766 LOOPER_END 1771 LOOPER_END
1767 } 1772 }
1768 1773
1769 void SkCanvas::drawRect(const SkRect& r, const SkPaint& paint) { 1774 void SkCanvas::drawRect(const SkRect& r, const SkPaint& paint) {
1775 TRACE_EVENT0("skia", "SkCanvas::drawRect()");
1770 SkRect storage; 1776 SkRect storage;
1771 const SkRect* bounds = NULL; 1777 const SkRect* bounds = NULL;
1772 if (paint.canComputeFastBounds()) { 1778 if (paint.canComputeFastBounds()) {
1773 bounds = &paint.computeFastBounds(r, &storage); 1779 bounds = &paint.computeFastBounds(r, &storage);
1774 if (this->quickReject(*bounds)) { 1780 if (this->quickReject(*bounds)) {
1775 return; 1781 return;
1776 } 1782 }
1777 } 1783 }
1778 1784
1779 LOOPER_BEGIN(paint, SkDrawFilter::kRect_Type, bounds) 1785 LOOPER_BEGIN(paint, SkDrawFilter::kRect_Type, bounds)
1780 1786
1781 while (iter.next()) { 1787 while (iter.next()) {
1782 iter.fDevice->drawRect(iter, r, looper.paint()); 1788 iter.fDevice->drawRect(iter, r, looper.paint());
1783 } 1789 }
1784 1790
1785 LOOPER_END 1791 LOOPER_END
1786 } 1792 }
1787 1793
1788 void SkCanvas::drawOval(const SkRect& oval, const SkPaint& paint) { 1794 void SkCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
1795 TRACE_EVENT0("skia", "SkCanvas::drawOval()");
1789 SkRect storage; 1796 SkRect storage;
1790 const SkRect* bounds = NULL; 1797 const SkRect* bounds = NULL;
1791 if (paint.canComputeFastBounds()) { 1798 if (paint.canComputeFastBounds()) {
1792 bounds = &paint.computeFastBounds(oval, &storage); 1799 bounds = &paint.computeFastBounds(oval, &storage);
1793 if (this->quickReject(*bounds)) { 1800 if (this->quickReject(*bounds)) {
1794 return; 1801 return;
1795 } 1802 }
1796 } 1803 }
1797 1804
1798 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds) 1805 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds)
1799 1806
1800 while (iter.next()) { 1807 while (iter.next()) {
1801 iter.fDevice->drawOval(iter, oval, looper.paint()); 1808 iter.fDevice->drawOval(iter, oval, looper.paint());
1802 } 1809 }
1803 1810
1804 LOOPER_END 1811 LOOPER_END
1805 } 1812 }
1806 1813
1807 void SkCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 1814 void SkCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
1815 TRACE_EVENT0("skia", "SkCanvas::drawRRect()");
1808 SkRect storage; 1816 SkRect storage;
1809 const SkRect* bounds = NULL; 1817 const SkRect* bounds = NULL;
1810 if (paint.canComputeFastBounds()) { 1818 if (paint.canComputeFastBounds()) {
1811 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage); 1819 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage);
1812 if (this->quickReject(*bounds)) { 1820 if (this->quickReject(*bounds)) {
1813 return; 1821 return;
1814 } 1822 }
1815 } 1823 }
1816 1824
1817 if (rrect.isRect()) { 1825 if (rrect.isRect()) {
(...skipping 29 matching lines...) Expand all
1847 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) 1855 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds)
1848 1856
1849 while (iter.next()) { 1857 while (iter.next()) {
1850 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint()); 1858 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint());
1851 } 1859 }
1852 1860
1853 LOOPER_END 1861 LOOPER_END
1854 } 1862 }
1855 1863
1856 void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 1864 void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
1865 TRACE_EVENT0("skia", "SkCanvas::drawPath()");
1857 if (!path.isFinite()) { 1866 if (!path.isFinite()) {
1858 return; 1867 return;
1859 } 1868 }
1860 1869
1861 SkRect storage; 1870 SkRect storage;
1862 const SkRect* bounds = NULL; 1871 const SkRect* bounds = NULL;
1863 if (!path.isInverseFillType() && paint.canComputeFastBounds()) { 1872 if (!path.isInverseFillType() && paint.canComputeFastBounds()) {
1864 const SkRect& pathBounds = path.getBounds(); 1873 const SkRect& pathBounds = path.getBounds();
1865 bounds = &paint.computeFastBounds(pathBounds, &storage); 1874 bounds = &paint.computeFastBounds(pathBounds, &storage);
1866 if (this->quickReject(*bounds)) { 1875 if (this->quickReject(*bounds)) {
(...skipping 13 matching lines...) Expand all
1880 1889
1881 while (iter.next()) { 1890 while (iter.next()) {
1882 iter.fDevice->drawPath(iter, path, looper.paint()); 1891 iter.fDevice->drawPath(iter, path, looper.paint());
1883 } 1892 }
1884 1893
1885 LOOPER_END 1894 LOOPER_END
1886 } 1895 }
1887 1896
1888 void SkCanvas::drawImage(const SkImage* image, SkScalar left, SkScalar top, 1897 void SkCanvas::drawImage(const SkImage* image, SkScalar left, SkScalar top,
1889 const SkPaint* paint) { 1898 const SkPaint* paint) {
1899 TRACE_EVENT0("skia", "SkCanvas::drawImage()");
1890 image->draw(this, left, top, paint); 1900 image->draw(this, left, top, paint);
1891 } 1901 }
1892 1902
1893 void SkCanvas::drawImageRect(const SkImage* image, const SkRect* src, 1903 void SkCanvas::drawImageRect(const SkImage* image, const SkRect* src,
1894 const SkRect& dst, 1904 const SkRect& dst,
1895 const SkPaint* paint) { 1905 const SkPaint* paint) {
1906 TRACE_EVENT0("skia", "SkCanvas::drawImageRect()");
1896 image->drawRect(this, src, dst, paint); 1907 image->drawRect(this, src, dst, paint);
1897 } 1908 }
1898 1909
1899 void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, 1910 void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
1900 const SkPaint* paint) { 1911 const SkPaint* paint) {
1912 TRACE_EVENT0("skia", "SkCanvas::drawBitmap()");
1901 SkDEBUGCODE(bitmap.validate();) 1913 SkDEBUGCODE(bitmap.validate();)
1902 1914
1903 if (NULL == paint || paint->canComputeFastBounds()) { 1915 if (NULL == paint || paint->canComputeFastBounds()) {
1904 SkRect bounds = { 1916 SkRect bounds = {
1905 x, y, 1917 x, y,
1906 x + SkIntToScalar(bitmap.width()), 1918 x + SkIntToScalar(bitmap.width()),
1907 y + SkIntToScalar(bitmap.height()) 1919 y + SkIntToScalar(bitmap.height())
1908 }; 1920 };
1909 if (paint) { 1921 if (paint) {
1910 (void)paint->computeFastBounds(bounds, &bounds); 1922 (void)paint->computeFastBounds(bounds, &bounds);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1948 while (iter.next()) { 1960 while (iter.next()) {
1949 iter.fDevice->drawBitmapRect(iter, bitmap, src, dst, looper.paint(), fla gs); 1961 iter.fDevice->drawBitmapRect(iter, bitmap, src, dst, looper.paint(), fla gs);
1950 } 1962 }
1951 1963
1952 LOOPER_END 1964 LOOPER_END
1953 } 1965 }
1954 1966
1955 void SkCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, 1967 void SkCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
1956 const SkRect& dst, const SkPaint* paint, 1968 const SkRect& dst, const SkPaint* paint,
1957 DrawBitmapRectFlags flags) { 1969 DrawBitmapRectFlags flags) {
1970 TRACE_EVENT0("skia", "SkCanvas::drawBitmapRectToRect()");
1958 SkDEBUGCODE(bitmap.validate();) 1971 SkDEBUGCODE(bitmap.validate();)
1959 this->internalDrawBitmapRect(bitmap, src, dst, paint, flags); 1972 this->internalDrawBitmapRect(bitmap, src, dst, paint, flags);
1960 } 1973 }
1961 1974
1962 void SkCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix, 1975 void SkCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix,
1963 const SkPaint* paint) { 1976 const SkPaint* paint) {
1977 TRACE_EVENT0("skia", "SkCanvas::drawBitmapMatrix()");
1964 SkDEBUGCODE(bitmap.validate();) 1978 SkDEBUGCODE(bitmap.validate();)
1965 this->internalDrawBitmap(bitmap, matrix, paint); 1979 this->internalDrawBitmap(bitmap, matrix, paint);
1966 } 1980 }
1967 1981
1968 void SkCanvas::internalDrawBitmapNine(const SkBitmap& bitmap, 1982 void SkCanvas::internalDrawBitmapNine(const SkBitmap& bitmap,
1969 const SkIRect& center, const SkRect& dst, 1983 const SkIRect& center, const SkRect& dst,
1970 const SkPaint* paint) { 1984 const SkPaint* paint) {
1971 if (bitmap.drawsNothing()) { 1985 if (bitmap.drawsNothing()) {
1972 return; 1986 return;
1973 } 1987 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 d.fLeft = dstX[x]; 2044 d.fLeft = dstX[x];
2031 d.fRight = dstX[x+1]; 2045 d.fRight = dstX[x+1];
2032 this->internalDrawBitmapRect(bitmap, &s, d, paint, 2046 this->internalDrawBitmapRect(bitmap, &s, d, paint,
2033 kNone_DrawBitmapRectFlag); 2047 kNone_DrawBitmapRectFlag);
2034 } 2048 }
2035 } 2049 }
2036 } 2050 }
2037 2051
2038 void SkCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 2052 void SkCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
2039 const SkRect& dst, const SkPaint* paint) { 2053 const SkRect& dst, const SkPaint* paint) {
2054 TRACE_EVENT0("skia", "SkCanvas::drawBitmapNine()");
2040 SkDEBUGCODE(bitmap.validate();) 2055 SkDEBUGCODE(bitmap.validate();)
2041 2056
2042 // Need a device entry-point, so gpu can use a mesh 2057 // Need a device entry-point, so gpu can use a mesh
2043 this->internalDrawBitmapNine(bitmap, center, dst, paint); 2058 this->internalDrawBitmapNine(bitmap, center, dst, paint);
2044 } 2059 }
2045 2060
2046 class SkDeviceFilteredPaint { 2061 class SkDeviceFilteredPaint {
2047 public: 2062 public:
2048 SkDeviceFilteredPaint(SkBaseDevice* device, const SkPaint& paint) { 2063 SkDeviceFilteredPaint(SkBaseDevice* device, const SkPaint& paint) {
2049 SkBaseDevice::TextFlags flags; 2064 SkBaseDevice::TextFlags flags;
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); 2224 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint());
2210 iter.fDevice->drawTextBlob(iter, blob, x, y, dfp.paint()); 2225 iter.fDevice->drawTextBlob(iter, blob, x, y, dfp.paint());
2211 } 2226 }
2212 2227
2213 LOOPER_END 2228 LOOPER_END
2214 } 2229 }
2215 2230
2216 // These will become non-virtual, so they always call the (virtual) onDraw... me thod 2231 // These will become non-virtual, so they always call the (virtual) onDraw... me thod
2217 void SkCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScala r y, 2232 void SkCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScala r y,
2218 const SkPaint& paint) { 2233 const SkPaint& paint) {
2234 TRACE_EVENT0("skia", "SkCanvas::drawText()");
2219 this->onDrawText(text, byteLength, x, y, paint); 2235 this->onDrawText(text, byteLength, x, y, paint);
2220 } 2236 }
2221 void SkCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint po s[], 2237 void SkCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint po s[],
2222 const SkPaint& paint) { 2238 const SkPaint& paint) {
2239 TRACE_EVENT0("skia", "SkCanvas::drawPosText()");
2223 this->onDrawPosText(text, byteLength, pos, paint); 2240 this->onDrawPosText(text, byteLength, pos, paint);
2224 } 2241 }
2225 void SkCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 2242 void SkCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
2226 SkScalar constY, const SkPaint& paint) { 2243 SkScalar constY, const SkPaint& paint) {
2244 TRACE_EVENT0("skia", "SkCanvas::drawPosTextH()");
2227 this->onDrawPosTextH(text, byteLength, xpos, constY, paint); 2245 this->onDrawPosTextH(text, byteLength, xpos, constY, paint);
2228 } 2246 }
2229 void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 2247 void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
2230 const SkMatrix* matrix, const SkPaint& paint) { 2248 const SkMatrix* matrix, const SkPaint& paint) {
2249 TRACE_EVENT0("skia", "SkCanvas::drawTextOnPath()");
2231 this->onDrawTextOnPath(text, byteLength, path, matrix, paint); 2250 this->onDrawTextOnPath(text, byteLength, path, matrix, paint);
2232 } 2251 }
2233 void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 2252 void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
2234 const SkPaint& paint) { 2253 const SkPaint& paint) {
2254 TRACE_EVENT0("skia", "SkCanvas::drawTextBlob()");
2235 if (blob) { 2255 if (blob) {
2236 this->onDrawTextBlob(blob, x, y, paint); 2256 this->onDrawTextBlob(blob, x, y, paint);
2237 } 2257 }
2238 } 2258 }
2239 2259
2240 void SkCanvas::drawVertices(VertexMode vmode, int vertexCount, 2260 void SkCanvas::drawVertices(VertexMode vmode, int vertexCount,
2241 const SkPoint verts[], const SkPoint texs[], 2261 const SkPoint verts[], const SkPoint texs[],
2242 const SkColor colors[], SkXfermode* xmode, 2262 const SkColor colors[], SkXfermode* xmode,
2243 const uint16_t indices[], int indexCount, 2263 const uint16_t indices[], int indexCount,
2244 const SkPaint& paint) { 2264 const SkPaint& paint) {
2265 TRACE_EVENT0("skia", "SkCanvas::drawVertices()");
2245 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, NULL) 2266 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, NULL)
2246 2267
2247 while (iter.next()) { 2268 while (iter.next()) {
2248 iter.fDevice->drawVertices(iter, vmode, vertexCount, verts, texs, 2269 iter.fDevice->drawVertices(iter, vmode, vertexCount, verts, texs,
2249 colors, xmode, indices, indexCount, 2270 colors, xmode, indices, indexCount,
2250 looper.paint()); 2271 looper.paint());
2251 } 2272 }
2252 2273
2253 LOOPER_END 2274 LOOPER_END
2254 } 2275 }
2255 2276
2256 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4], 2277 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
2257 const SkPoint texCoords[4], SkXfermode* xmode, const Sk Paint& paint) { 2278 const SkPoint texCoords[4], SkXfermode* xmode, const Sk Paint& paint) {
2279 TRACE_EVENT0("skia", "SkCanvas::drawPatch()");
2258 if (NULL == cubics) { 2280 if (NULL == cubics) {
2259 return; 2281 return;
2260 } 2282 }
2261 2283
2262 // Since a patch is always within the convex hull of the control points, we discard it when its 2284 // Since a patch is always within the convex hull of the control points, we discard it when its
2263 // bounding rectangle is completely outside the current clip. 2285 // bounding rectangle is completely outside the current clip.
2264 SkRect bounds; 2286 SkRect bounds;
2265 bounds.set(cubics, SkPatchUtils::kNumCtrlPts); 2287 bounds.set(cubics, SkPatchUtils::kNumCtrlPts);
2266 if (this->quickReject(bounds)) { 2288 if (this->quickReject(bounds)) {
2267 return; 2289 return;
(...skipping 14 matching lines...) Expand all
2282 LOOPER_END 2304 LOOPER_END
2283 } 2305 }
2284 2306
2285 ////////////////////////////////////////////////////////////////////////////// 2307 //////////////////////////////////////////////////////////////////////////////
2286 // These methods are NOT virtual, and therefore must call back into virtual 2308 // These methods are NOT virtual, and therefore must call back into virtual
2287 // methods, rather than actually drawing themselves. 2309 // methods, rather than actually drawing themselves.
2288 ////////////////////////////////////////////////////////////////////////////// 2310 //////////////////////////////////////////////////////////////////////////////
2289 2311
2290 void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, 2312 void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b,
2291 SkXfermode::Mode mode) { 2313 SkXfermode::Mode mode) {
2314 TRACE_EVENT0("skia", "SkCanvas::drawARGB()");
2292 SkPaint paint; 2315 SkPaint paint;
2293 2316
2294 paint.setARGB(a, r, g, b); 2317 paint.setARGB(a, r, g, b);
2295 if (SkXfermode::kSrcOver_Mode != mode) { 2318 if (SkXfermode::kSrcOver_Mode != mode) {
2296 paint.setXfermodeMode(mode); 2319 paint.setXfermodeMode(mode);
2297 } 2320 }
2298 this->drawPaint(paint); 2321 this->drawPaint(paint);
2299 } 2322 }
2300 2323
2301 void SkCanvas::drawColor(SkColor c, SkXfermode::Mode mode) { 2324 void SkCanvas::drawColor(SkColor c, SkXfermode::Mode mode) {
2325 TRACE_EVENT0("skia", "SkCanvas::drawColor()");
2302 SkPaint paint; 2326 SkPaint paint;
2303 2327
2304 paint.setColor(c); 2328 paint.setColor(c);
2305 if (SkXfermode::kSrcOver_Mode != mode) { 2329 if (SkXfermode::kSrcOver_Mode != mode) {
2306 paint.setXfermodeMode(mode); 2330 paint.setXfermodeMode(mode);
2307 } 2331 }
2308 this->drawPaint(paint); 2332 this->drawPaint(paint);
2309 } 2333 }
2310 2334
2311 void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) { 2335 void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) {
2336 TRACE_EVENT0("skia", "SkCanvas::drawPoint(SkPaint)");
2312 SkPoint pt; 2337 SkPoint pt;
2313 2338
2314 pt.set(x, y); 2339 pt.set(x, y);
2315 this->drawPoints(kPoints_PointMode, 1, &pt, paint); 2340 this->drawPoints(kPoints_PointMode, 1, &pt, paint);
2316 } 2341 }
2317 2342
2318 void SkCanvas::drawPoint(SkScalar x, SkScalar y, SkColor color) { 2343 void SkCanvas::drawPoint(SkScalar x, SkScalar y, SkColor color) {
2344 TRACE_EVENT0("skia", "SkCanvas::drawPoint(SkColor)");
2319 SkPoint pt; 2345 SkPoint pt;
2320 SkPaint paint; 2346 SkPaint paint;
2321 2347
2322 pt.set(x, y); 2348 pt.set(x, y);
2323 paint.setColor(color); 2349 paint.setColor(color);
2324 this->drawPoints(kPoints_PointMode, 1, &pt, paint); 2350 this->drawPoints(kPoints_PointMode, 1, &pt, paint);
2325 } 2351 }
2326 2352
2327 void SkCanvas::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, 2353 void SkCanvas::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
2328 const SkPaint& paint) { 2354 const SkPaint& paint) {
2355 TRACE_EVENT0("skia", "SkCanvas::drawLine()");
2329 SkPoint pts[2]; 2356 SkPoint pts[2];
2330 2357
2331 pts[0].set(x0, y0); 2358 pts[0].set(x0, y0);
2332 pts[1].set(x1, y1); 2359 pts[1].set(x1, y1);
2333 this->drawPoints(kLines_PointMode, 2, pts, paint); 2360 this->drawPoints(kLines_PointMode, 2, pts, paint);
2334 } 2361 }
2335 2362
2336 void SkCanvas::drawRectCoords(SkScalar left, SkScalar top, 2363 void SkCanvas::drawRectCoords(SkScalar left, SkScalar top,
2337 SkScalar right, SkScalar bottom, 2364 SkScalar right, SkScalar bottom,
2338 const SkPaint& paint) { 2365 const SkPaint& paint) {
2366 TRACE_EVENT0("skia", "SkCanvas::drawRectCoords()");
2339 SkRect r; 2367 SkRect r;
2340 2368
2341 r.set(left, top, right, bottom); 2369 r.set(left, top, right, bottom);
2342 this->drawRect(r, paint); 2370 this->drawRect(r, paint);
2343 } 2371 }
2344 2372
2345 void SkCanvas::drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, 2373 void SkCanvas::drawCircle(SkScalar cx, SkScalar cy, SkScalar radius,
2346 const SkPaint& paint) { 2374 const SkPaint& paint) {
2375 TRACE_EVENT0("skia", "SkCanvas::drawCircle()");
2347 if (radius < 0) { 2376 if (radius < 0) {
2348 radius = 0; 2377 radius = 0;
2349 } 2378 }
2350 2379
2351 SkRect r; 2380 SkRect r;
2352 r.set(cx - radius, cy - radius, cx + radius, cy + radius); 2381 r.set(cx - radius, cy - radius, cx + radius, cy + radius);
2353 this->drawOval(r, paint); 2382 this->drawOval(r, paint);
2354 } 2383 }
2355 2384
2356 void SkCanvas::drawRoundRect(const SkRect& r, SkScalar rx, SkScalar ry, 2385 void SkCanvas::drawRoundRect(const SkRect& r, SkScalar rx, SkScalar ry,
2357 const SkPaint& paint) { 2386 const SkPaint& paint) {
2387 TRACE_EVENT0("skia", "SkCanvas::drawRoundRect()");
2358 if (rx > 0 && ry > 0) { 2388 if (rx > 0 && ry > 0) {
2359 if (paint.canComputeFastBounds()) { 2389 if (paint.canComputeFastBounds()) {
2360 SkRect storage; 2390 SkRect storage;
2361 if (this->quickReject(paint.computeFastBounds(r, &storage))) { 2391 if (this->quickReject(paint.computeFastBounds(r, &storage))) {
2362 return; 2392 return;
2363 } 2393 }
2364 } 2394 }
2365 SkRRect rrect; 2395 SkRRect rrect;
2366 rrect.setRectXY(r, rx, ry); 2396 rrect.setRectXY(r, rx, ry);
2367 this->drawRRect(rrect, paint); 2397 this->drawRRect(rrect, paint);
2368 } else { 2398 } else {
2369 this->drawRect(r, paint); 2399 this->drawRect(r, paint);
2370 } 2400 }
2371 } 2401 }
2372 2402
2373 void SkCanvas::drawArc(const SkRect& oval, SkScalar startAngle, 2403 void SkCanvas::drawArc(const SkRect& oval, SkScalar startAngle,
2374 SkScalar sweepAngle, bool useCenter, 2404 SkScalar sweepAngle, bool useCenter,
2375 const SkPaint& paint) { 2405 const SkPaint& paint) {
2406 TRACE_EVENT0("skia", "SkCanvas::drawArc()");
2376 if (SkScalarAbs(sweepAngle) >= SkIntToScalar(360)) { 2407 if (SkScalarAbs(sweepAngle) >= SkIntToScalar(360)) {
2377 this->drawOval(oval, paint); 2408 this->drawOval(oval, paint);
2378 } else { 2409 } else {
2379 SkPath path; 2410 SkPath path;
2380 if (useCenter) { 2411 if (useCenter) {
2381 path.moveTo(oval.centerX(), oval.centerY()); 2412 path.moveTo(oval.centerX(), oval.centerY());
2382 } 2413 }
2383 path.arcTo(oval, startAngle, sweepAngle, !useCenter); 2414 path.arcTo(oval, startAngle, sweepAngle, !useCenter);
2384 if (useCenter) { 2415 if (useCenter) {
2385 path.close(); 2416 path.close();
2386 } 2417 }
2387 this->drawPath(path, paint); 2418 this->drawPath(path, paint);
2388 } 2419 }
2389 } 2420 }
2390 2421
2391 void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength, 2422 void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
2392 const SkPath& path, SkScalar hOffset, 2423 const SkPath& path, SkScalar hOffset,
2393 SkScalar vOffset, const SkPaint& paint) { 2424 SkScalar vOffset, const SkPaint& paint) {
2425 TRACE_EVENT0("skia", "SkCanvas::drawTextOnPathHV()");
2394 SkMatrix matrix; 2426 SkMatrix matrix;
2395 2427
2396 matrix.setTranslate(hOffset, vOffset); 2428 matrix.setTranslate(hOffset, vOffset);
2397 this->drawTextOnPath(text, byteLength, path, &matrix, paint); 2429 this->drawTextOnPath(text, byteLength, path, &matrix, paint);
2398 } 2430 }
2399 2431
2400 /////////////////////////////////////////////////////////////////////////////// 2432 ///////////////////////////////////////////////////////////////////////////////
2401 void SkCanvas::EXPERIMENTAL_optimize(const SkPicture* picture) { 2433 void SkCanvas::EXPERIMENTAL_optimize(const SkPicture* picture) {
2402 SkBaseDevice* device = this->getDevice(); 2434 SkBaseDevice* device = this->getDevice();
2403 if (device) { 2435 if (device) {
2404 device->EXPERIMENTAL_optimize(picture); 2436 device->EXPERIMENTAL_optimize(picture);
2405 } 2437 }
2406 } 2438 }
2407 2439
2408 void SkCanvas::drawPicture(const SkPicture* picture) { 2440 void SkCanvas::drawPicture(const SkPicture* picture) {
2441 TRACE_EVENT0("skia", "SkCanvas::drawPicture()");
2409 if (picture) { 2442 if (picture) {
2410 this->onDrawPicture(picture, NULL, NULL); 2443 this->onDrawPicture(picture, NULL, NULL);
2411 } 2444 }
2412 } 2445 }
2413 2446
2414 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con st SkPaint* paint) { 2447 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con st SkPaint* paint) {
2448 TRACE_EVENT0("skia", "SkCanvas::drawPicture(SkMatrix, SkPaint)");
2415 if (picture) { 2449 if (picture) {
2416 if (matrix && matrix->isIdentity()) { 2450 if (matrix && matrix->isIdentity()) {
2417 matrix = NULL; 2451 matrix = NULL;
2418 } 2452 }
2419 this->onDrawPicture(picture, matrix, paint); 2453 this->onDrawPicture(picture, matrix, paint);
2420 } 2454 }
2421 } 2455 }
2422 2456
2423 void SkCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, 2457 void SkCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
2424 const SkPaint* paint) { 2458 const SkPaint* paint) {
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 } 2584 }
2551 2585
2552 if (matrix) { 2586 if (matrix) {
2553 canvas->concat(*matrix); 2587 canvas->concat(*matrix);
2554 } 2588 }
2555 } 2589 }
2556 2590
2557 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 2591 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
2558 fCanvas->restoreToCount(fSaveCount); 2592 fCanvas->restoreToCount(fSaveCount);
2559 } 2593 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698