| OLD | NEW |
| 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 "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkCanvasPriv.h" | 10 #include "SkCanvasPriv.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "SkTraceEvent.h" | 35 #include "SkTraceEvent.h" |
| 36 | 36 |
| 37 #include <new> | 37 #include <new> |
| 38 | 38 |
| 39 #if SK_SUPPORT_GPU | 39 #if SK_SUPPORT_GPU |
| 40 #include "GrContext.h" | 40 #include "GrContext.h" |
| 41 #include "GrRenderTarget.h" | 41 #include "GrRenderTarget.h" |
| 42 #include "SkGr.h" | 42 #include "SkGr.h" |
| 43 #endif | 43 #endif |
| 44 | 44 |
| 45 #define RETURN_ON_NULL(ptr) do { if (nullptr == (ptr)) return; } while (0) |
| 46 |
| 45 /* | 47 /* |
| 46 * Return true if the drawing this rect would hit every pixels in the canvas. | 48 * Return true if the drawing this rect would hit every pixels in the canvas. |
| 47 * | 49 * |
| 48 * Returns false if | 50 * Returns false if |
| 49 * - rect does not contain the canvas' bounds | 51 * - rect does not contain the canvas' bounds |
| 50 * - paint is not fill | 52 * - paint is not fill |
| 51 * - paint would blur or otherwise change the coverage of the rect | 53 * - paint would blur or otherwise change the coverage of the rect |
| 52 */ | 54 */ |
| 53 bool SkCanvas::wouldOverwriteEntireSurface(const SkRect* rect, const SkPaint* pa
int, | 55 bool SkCanvas::wouldOverwriteEntireSurface(const SkRect* rect, const SkPaint* pa
int, |
| 54 ShaderOverrideOpacity overrideOpacity
) const { | 56 ShaderOverrideOpacity overrideOpacity
) const { |
| (...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1922 const uint16_t indices[], int indexCount, const SkPa
int& paint) { | 1924 const uint16_t indices[], int indexCount, const SkPa
int& paint) { |
| 1923 this->onDrawVertices(vmode, vertexCount, vertices, texs, colors, xmode, | 1925 this->onDrawVertices(vmode, vertexCount, vertices, texs, colors, xmode, |
| 1924 indices, indexCount, paint); | 1926 indices, indexCount, paint); |
| 1925 } | 1927 } |
| 1926 | 1928 |
| 1927 void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { | 1929 void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { |
| 1928 this->onDrawPath(path, paint); | 1930 this->onDrawPath(path, paint); |
| 1929 } | 1931 } |
| 1930 | 1932 |
| 1931 void SkCanvas::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkP
aint* paint) { | 1933 void SkCanvas::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkP
aint* paint) { |
| 1934 RETURN_ON_NULL(image); |
| 1932 this->onDrawImage(image, x, y, paint); | 1935 this->onDrawImage(image, x, y, paint); |
| 1933 } | 1936 } |
| 1934 | 1937 |
| 1935 void SkCanvas::drawImageRect(const SkImage* image, const SkRect& src, const SkRe
ct& dst, | 1938 void SkCanvas::drawImageRect(const SkImage* image, const SkRect& src, const SkRe
ct& dst, |
| 1936 const SkPaint* paint, SrcRectConstraint constraint)
{ | 1939 const SkPaint* paint, SrcRectConstraint constraint)
{ |
| 1940 RETURN_ON_NULL(image); |
| 1937 if (dst.isEmpty() || src.isEmpty()) { | 1941 if (dst.isEmpty() || src.isEmpty()) { |
| 1938 return; | 1942 return; |
| 1939 } | 1943 } |
| 1940 this->onDrawImageRect(image, &src, dst, paint, constraint); | 1944 this->onDrawImageRect(image, &src, dst, paint, constraint); |
| 1941 } | 1945 } |
| 1942 | 1946 |
| 1943 void SkCanvas::drawImageRect(const SkImage* image, const SkIRect& isrc, const Sk
Rect& dst, | 1947 void SkCanvas::drawImageRect(const SkImage* image, const SkIRect& isrc, const Sk
Rect& dst, |
| 1944 const SkPaint* paint, SrcRectConstraint constraint)
{ | 1948 const SkPaint* paint, SrcRectConstraint constraint)
{ |
| 1949 RETURN_ON_NULL(image); |
| 1945 this->drawImageRect(image, SkRect::Make(isrc), dst, paint, constraint); | 1950 this->drawImageRect(image, SkRect::Make(isrc), dst, paint, constraint); |
| 1946 } | 1951 } |
| 1947 | 1952 |
| 1948 void SkCanvas::drawImageRect(const SkImage* image, const SkRect& dst, const SkPa
int* paint, | 1953 void SkCanvas::drawImageRect(const SkImage* image, const SkRect& dst, const SkPa
int* paint, |
| 1949 SrcRectConstraint constraint) { | 1954 SrcRectConstraint constraint) { |
| 1955 RETURN_ON_NULL(image); |
| 1950 this->drawImageRect(image, SkRect::MakeIWH(image->width(), image->height()),
dst, paint, | 1956 this->drawImageRect(image, SkRect::MakeIWH(image->width(), image->height()),
dst, paint, |
| 1951 constraint); | 1957 constraint); |
| 1952 } | 1958 } |
| 1953 | 1959 |
| 1954 void SkCanvas::drawImageNine(const SkImage* image, const SkIRect& center, const
SkRect& dst, | 1960 void SkCanvas::drawImageNine(const SkImage* image, const SkIRect& center, const
SkRect& dst, |
| 1955 const SkPaint* paint) { | 1961 const SkPaint* paint) { |
| 1962 RETURN_ON_NULL(image); |
| 1956 if (dst.isEmpty()) { | 1963 if (dst.isEmpty()) { |
| 1957 return; | 1964 return; |
| 1958 } | 1965 } |
| 1959 if (!SkNinePatchIter::Valid(image->width(), image->height(), center)) { | 1966 if (!SkNinePatchIter::Valid(image->width(), image->height(), center)) { |
| 1960 this->drawImageRect(image, dst, paint); | 1967 this->drawImageRect(image, dst, paint); |
| 1961 } | 1968 } |
| 1962 this->onDrawImageNine(image, center, dst, paint); | 1969 this->onDrawImageNine(image, center, dst, paint); |
| 1963 } | 1970 } |
| 1964 | 1971 |
| 1965 void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar dx, SkScalar dy, cons
t SkPaint* paint) { | 1972 void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar dx, SkScalar dy, cons
t SkPaint* paint) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1995 } | 2002 } |
| 1996 if (!SkNinePatchIter::Valid(bitmap.width(), bitmap.height(), center)) { | 2003 if (!SkNinePatchIter::Valid(bitmap.width(), bitmap.height(), center)) { |
| 1997 this->drawBitmapRect(bitmap, dst, paint); | 2004 this->drawBitmapRect(bitmap, dst, paint); |
| 1998 } | 2005 } |
| 1999 this->onDrawBitmapNine(bitmap, center, dst, paint); | 2006 this->onDrawBitmapNine(bitmap, center, dst, paint); |
| 2000 } | 2007 } |
| 2001 | 2008 |
| 2002 void SkCanvas::drawAtlas(const SkImage* atlas, const SkRSXform xform[], const Sk
Rect tex[], | 2009 void SkCanvas::drawAtlas(const SkImage* atlas, const SkRSXform xform[], const Sk
Rect tex[], |
| 2003 const SkColor colors[], int count, SkXfermode::Mode mod
e, | 2010 const SkColor colors[], int count, SkXfermode::Mode mod
e, |
| 2004 const SkRect* cull, const SkPaint* paint) { | 2011 const SkRect* cull, const SkPaint* paint) { |
| 2012 RETURN_ON_NULL(atlas); |
| 2005 if (count <= 0) { | 2013 if (count <= 0) { |
| 2006 return; | 2014 return; |
| 2007 } | 2015 } |
| 2008 SkASSERT(atlas); | 2016 SkASSERT(atlas); |
| 2009 SkASSERT(xform); | 2017 SkASSERT(xform); |
| 2010 SkASSERT(tex); | 2018 SkASSERT(tex); |
| 2011 this->onDrawAtlas(atlas, xform, tex, colors, count, mode, cull, paint); | 2019 this->onDrawAtlas(atlas, xform, tex, colors, count, mode, cull, paint); |
| 2012 } | 2020 } |
| 2013 | 2021 |
| 2014 void SkCanvas::legacy_drawImageRect(const SkImage* image, const SkRect* src, con
st SkRect& dst, | 2022 void SkCanvas::legacy_drawImageRect(const SkImage* image, const SkRect* src, con
st SkRect& dst, |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2637 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPosTextH()"); | 2645 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPosTextH()"); |
| 2638 this->onDrawPosTextH(text, byteLength, xpos, constY, paint); | 2646 this->onDrawPosTextH(text, byteLength, xpos, constY, paint); |
| 2639 } | 2647 } |
| 2640 void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath&
path, | 2648 void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath&
path, |
| 2641 const SkMatrix* matrix, const SkPaint& paint) { | 2649 const SkMatrix* matrix, const SkPaint& paint) { |
| 2642 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextOnPath()"); | 2650 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextOnPath()"); |
| 2643 this->onDrawTextOnPath(text, byteLength, path, matrix, paint); | 2651 this->onDrawTextOnPath(text, byteLength, path, matrix, paint); |
| 2644 } | 2652 } |
| 2645 void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, | 2653 void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
| 2646 const SkPaint& paint) { | 2654 const SkPaint& paint) { |
| 2655 RETURN_ON_NULL(blob); |
| 2647 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextBlob()"); | 2656 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextBlob()"); |
| 2648 if (blob) { | 2657 this->onDrawTextBlob(blob, x, y, paint); |
| 2649 this->onDrawTextBlob(blob, x, y, paint); | |
| 2650 } | |
| 2651 } | 2658 } |
| 2652 | 2659 |
| 2653 void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount, | 2660 void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount, |
| 2654 const SkPoint verts[], const SkPoint texs[], | 2661 const SkPoint verts[], const SkPoint texs[], |
| 2655 const SkColor colors[], SkXfermode* xmode, | 2662 const SkColor colors[], SkXfermode* xmode, |
| 2656 const uint16_t indices[], int indexCount, | 2663 const uint16_t indices[], int indexCount, |
| 2657 const SkPaint& paint) { | 2664 const SkPaint& paint) { |
| 2658 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()"); | 2665 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()"); |
| 2659 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) | 2666 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) |
| 2660 | 2667 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2691 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) | 2698 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) |
| 2692 | 2699 |
| 2693 while (iter.next()) { | 2700 while (iter.next()) { |
| 2694 iter.fDevice->drawPatch(iter, cubics, colors, texCoords, xmode, paint); | 2701 iter.fDevice->drawPatch(iter, cubics, colors, texCoords, xmode, paint); |
| 2695 } | 2702 } |
| 2696 | 2703 |
| 2697 LOOPER_END | 2704 LOOPER_END |
| 2698 } | 2705 } |
| 2699 | 2706 |
| 2700 void SkCanvas::drawDrawable(SkDrawable* dr, SkScalar x, SkScalar y) { | 2707 void SkCanvas::drawDrawable(SkDrawable* dr, SkScalar x, SkScalar y) { |
| 2701 if (dr) { | 2708 RETURN_ON_NULL(dr); |
| 2702 if (x || y) { | 2709 if (x || y) { |
| 2703 SkMatrix matrix = SkMatrix::MakeTrans(x, y); | 2710 SkMatrix matrix = SkMatrix::MakeTrans(x, y); |
| 2704 this->onDrawDrawable(dr, &matrix); | 2711 this->onDrawDrawable(dr, &matrix); |
| 2705 } else { | 2712 } else { |
| 2706 this->onDrawDrawable(dr, nullptr); | 2713 this->onDrawDrawable(dr, nullptr); |
| 2707 } | |
| 2708 } | 2714 } |
| 2709 } | 2715 } |
| 2710 | 2716 |
| 2711 void SkCanvas::drawDrawable(SkDrawable* dr, const SkMatrix* matrix) { | 2717 void SkCanvas::drawDrawable(SkDrawable* dr, const SkMatrix* matrix) { |
| 2712 if (dr) { | 2718 RETURN_ON_NULL(dr); |
| 2713 if (matrix && matrix->isIdentity()) { | 2719 if (matrix && matrix->isIdentity()) { |
| 2714 matrix = nullptr; | 2720 matrix = nullptr; |
| 2715 } | |
| 2716 this->onDrawDrawable(dr, matrix); | |
| 2717 } | 2721 } |
| 2722 this->onDrawDrawable(dr, matrix); |
| 2718 } | 2723 } |
| 2719 | 2724 |
| 2720 void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) { | 2725 void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) { |
| 2721 SkRect bounds = dr->getBounds(); | 2726 SkRect bounds = dr->getBounds(); |
| 2722 if (matrix) { | 2727 if (matrix) { |
| 2723 matrix->mapRect(&bounds); | 2728 matrix->mapRect(&bounds); |
| 2724 } | 2729 } |
| 2725 if (this->quickReject(bounds)) { | 2730 if (this->quickReject(bounds)) { |
| 2726 return; | 2731 return; |
| 2727 } | 2732 } |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2877 /** | 2882 /** |
| 2878 * This constant is trying to balance the speed of ref'ing a subpicture into a
parent picture, | 2883 * This constant is trying to balance the speed of ref'ing a subpicture into a
parent picture, |
| 2879 * against the playback cost of recursing into the subpicture to get at its act
ual ops. | 2884 * against the playback cost of recursing into the subpicture to get at its act
ual ops. |
| 2880 * | 2885 * |
| 2881 * For now we pick a conservatively small value, though measurement (and other
heuristics like | 2886 * For now we pick a conservatively small value, though measurement (and other
heuristics like |
| 2882 * the type of ops contained) may justify changing this value. | 2887 * the type of ops contained) may justify changing this value. |
| 2883 */ | 2888 */ |
| 2884 #define kMaxPictureOpsToUnrollInsteadOfRef 1 | 2889 #define kMaxPictureOpsToUnrollInsteadOfRef 1 |
| 2885 | 2890 |
| 2886 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con
st SkPaint* paint) { | 2891 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con
st SkPaint* paint) { |
| 2892 RETURN_ON_NULL(picture); |
| 2893 |
| 2887 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPicture()"); | 2894 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPicture()"); |
| 2888 if (picture) { | 2895 if (matrix && matrix->isIdentity()) { |
| 2889 if (matrix && matrix->isIdentity()) { | 2896 matrix = nullptr; |
| 2890 matrix = nullptr; | 2897 } |
| 2891 } | 2898 if (picture->approximateOpCount() <= kMaxPictureOpsToUnrollInsteadOfRef) { |
| 2892 if (picture->approximateOpCount() <= kMaxPictureOpsToUnrollInsteadOfRef)
{ | 2899 SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect()); |
| 2893 SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect(
)); | 2900 picture->playback(this); |
| 2894 picture->playback(this); | 2901 } else { |
| 2895 } else { | 2902 this->onDrawPicture(picture, matrix, paint); |
| 2896 this->onDrawPicture(picture, matrix, paint); | |
| 2897 } | |
| 2898 } | 2903 } |
| 2899 } | 2904 } |
| 2900 | 2905 |
| 2901 void SkCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, | 2906 void SkCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, |
| 2902 const SkPaint* paint) { | 2907 const SkPaint* paint) { |
| 2903 if (!paint || paint->canComputeFastBounds()) { | 2908 if (!paint || paint->canComputeFastBounds()) { |
| 2904 SkRect bounds = picture->cullRect(); | 2909 SkRect bounds = picture->cullRect(); |
| 2905 if (paint) { | 2910 if (paint) { |
| 2906 paint->computeFastBounds(bounds, &bounds); | 2911 paint->computeFastBounds(bounds, &bounds); |
| 2907 } | 2912 } |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3023 } | 3028 } |
| 3024 | 3029 |
| 3025 if (matrix) { | 3030 if (matrix) { |
| 3026 canvas->concat(*matrix); | 3031 canvas->concat(*matrix); |
| 3027 } | 3032 } |
| 3028 } | 3033 } |
| 3029 | 3034 |
| 3030 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3035 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
| 3031 fCanvas->restoreToCount(fSaveCount); | 3036 fCanvas->restoreToCount(fSaveCount); |
| 3032 } | 3037 } |
| OLD | NEW |