Chromium Code Reviews| 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 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 405 // The paint has both a colorfilter(paintCF) and an imagefilter-which-is-a-c olorfilter(imgCF) | 405 // The paint has both a colorfilter(paintCF) and an imagefilter-which-is-a-c olorfilter(imgCF) |
| 406 // and we need to combine them into a single colorfilter. | 406 // and we need to combine them into a single colorfilter. |
| 407 SkAutoTUnref<SkColorFilter> autoImgCF(imgCF); | 407 SkAutoTUnref<SkColorFilter> autoImgCF(imgCF); |
| 408 return SkColorFilter::CreateComposeFilter(imgCF, paintCF); | 408 return SkColorFilter::CreateComposeFilter(imgCF, paintCF); |
| 409 } | 409 } |
| 410 | 410 |
| 411 class AutoDrawLooper { | 411 class AutoDrawLooper { |
| 412 public: | 412 public: |
| 413 AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint& paint, | 413 AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint& paint, |
| 414 bool skipLayerForImageFilter = false, | 414 bool skipLayerForImageFilter = false, |
| 415 const SkRect* bounds = nullptr) : fOrigPaint(paint) { | 415 const SkRect* bounds = nullptr) : fOrigPaint(paint) { |
|
reed1
2015/10/27 20:05:40
Lets rename this parameter somehow, so it is clear
Stephen White
2015/10/27 20:59:55
Done.
| |
| 416 fCanvas = canvas; | 416 fCanvas = canvas; |
| 417 fFilter = canvas->getDrawFilter(); | 417 fFilter = canvas->getDrawFilter(); |
| 418 fPaint = &fOrigPaint; | 418 fPaint = &fOrigPaint; |
| 419 fSaveCount = canvas->getSaveCount(); | 419 fSaveCount = canvas->getSaveCount(); |
| 420 fTempLayerForImageFilter = false; | 420 fTempLayerForImageFilter = false; |
| 421 fDone = false; | 421 fDone = false; |
| 422 | 422 |
| 423 SkColorFilter* simplifiedCF = image_to_color_filter(fOrigPaint); | 423 SkColorFilter* simplifiedCF = image_to_color_filter(fOrigPaint); |
| 424 if (simplifiedCF) { | 424 if (simplifiedCF) { |
| 425 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); | 425 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 440 * return (fPaint). We then draw the primitive (using srcover) into a cleared | 440 * return (fPaint). We then draw the primitive (using srcover) into a cleared |
| 441 * buffer/surface. | 441 * buffer/surface. |
| 442 * 3. Restore the layer created in #1 | 442 * 3. Restore the layer created in #1 |
| 443 * The imagefilter is passed the buffer/surface from the layer (now filled with the | 443 * The imagefilter is passed the buffer/surface from the layer (now filled with the |
| 444 * src pixels of the primitive). It returns a new "filtered" bu ffer, which we | 444 * src pixels of the primitive). It returns a new "filtered" bu ffer, which we |
| 445 * draw onto the previous layer using the xfermode from the ori ginal paint. | 445 * draw onto the previous layer using the xfermode from the ori ginal paint. |
| 446 */ | 446 */ |
| 447 SkPaint tmp; | 447 SkPaint tmp; |
| 448 tmp.setImageFilter(fPaint->getImageFilter()); | 448 tmp.setImageFilter(fPaint->getImageFilter()); |
| 449 tmp.setXfermode(fPaint->getXfermode()); | 449 tmp.setXfermode(fPaint->getXfermode()); |
| 450 #ifndef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 451 SkRect storage; | |
|
reed1
2015/10/27 20:05:40
one way to make the intent of this block clear, co
Stephen White
2015/10/27 20:59:55
Done.
| |
| 452 if (bounds) { | |
| 453 SkPaint tmpUnfiltered(*fPaint); | |
| 454 tmpUnfiltered.setImageFilter(nullptr); | |
| 455 if (tmpUnfiltered.canComputeFastBounds()) { | |
| 456 bounds = &tmpUnfiltered.computeFastBounds(*bounds, &storage) ; | |
| 457 } | |
| 458 } | |
| 459 #endif | |
| 450 (void)canvas->internalSaveLayer(bounds, &tmp, SkCanvas::kARGB_ClipLa yer_SaveFlag, | 460 (void)canvas->internalSaveLayer(bounds, &tmp, SkCanvas::kARGB_ClipLa yer_SaveFlag, |
| 451 SkCanvas::kFullLayer_SaveLayerStrate gy); | 461 SkCanvas::kFullLayer_SaveLayerStrate gy); |
| 452 fTempLayerForImageFilter = true; | 462 fTempLayerForImageFilter = true; |
| 453 // we remove the imagefilter/xfermode inside doNext() | 463 // we remove the imagefilter/xfermode inside doNext() |
| 454 } | 464 } |
| 455 | 465 |
| 456 if (SkDrawLooper* looper = paint.getLooper()) { | 466 if (SkDrawLooper* looper = paint.getLooper()) { |
| 457 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex t>( | 467 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex t>( |
| 458 looper->contextSize()); | 468 looper->contextSize()); |
| 459 fLooperContext = looper->createContext(canvas, buffer); | 469 fLooperContext = looper->createContext(canvas, buffer); |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1012 | 1022 |
| 1013 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, | 1023 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, |
| 1014 SkIRect* intersection, const SkImageFilter* imageF ilter) { | 1024 SkIRect* intersection, const SkImageFilter* imageF ilter) { |
| 1015 SkIRect clipBounds; | 1025 SkIRect clipBounds; |
| 1016 if (!this->getClipDeviceBounds(&clipBounds)) { | 1026 if (!this->getClipDeviceBounds(&clipBounds)) { |
| 1017 return false; | 1027 return false; |
| 1018 } | 1028 } |
| 1019 | 1029 |
| 1020 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix() | 1030 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix() |
| 1021 | 1031 |
| 1032 #ifndef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 1033 SkRect storage; | |
| 1034 #endif | |
| 1022 if (imageFilter) { | 1035 if (imageFilter) { |
| 1023 imageFilter->filterBounds(clipBounds, ctm, &clipBounds); | 1036 imageFilter->filterBounds(clipBounds, ctm, &clipBounds); |
| 1037 #ifndef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
|
reed1
2015/10/27 20:05:40
This bock of code exists solely as a temporary hac
Stephen White
2015/10/27 20:59:55
Done.
| |
| 1038 if (bounds && imageFilter->canComputeFastBounds()) { | |
| 1039 imageFilter->computeFastBounds(*bounds, &storage); | |
| 1040 bounds = &storage; | |
| 1041 } else { | |
| 1042 bounds = nullptr; | |
|
reed1
2015/10/27 20:05:40
I presume we set this to null because we assume th
Stephen White
2015/10/27 20:59:55
Should we just rename canComputeFastBounds(), then
| |
| 1043 } | |
| 1044 #endif | |
| 1024 } | 1045 } |
| 1025 SkIRect ir; | 1046 SkIRect ir; |
| 1026 if (bounds) { | 1047 if (bounds) { |
| 1027 SkRect r; | 1048 SkRect r; |
| 1028 | 1049 |
| 1029 ctm.mapRect(&r, *bounds); | 1050 ctm.mapRect(&r, *bounds); |
| 1030 r.roundOut(&ir); | 1051 r.roundOut(&ir); |
| 1031 // early exit if the layer's bounds are clipped out | 1052 // early exit if the layer's bounds are clipped out |
| 1032 if (!ir.intersect(clipBounds)) { | 1053 if (!ir.intersect(clipBounds)) { |
| 1033 if (bounds_affects_clip(flags)) { | 1054 if (bounds_affects_clip(flags)) { |
| (...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1958 | 1979 |
| 1959 SkRect r, storage; | 1980 SkRect r, storage; |
| 1960 const SkRect* bounds = nullptr; | 1981 const SkRect* bounds = nullptr; |
| 1961 if (paint.canComputeFastBounds()) { | 1982 if (paint.canComputeFastBounds()) { |
| 1962 // special-case 2 points (common for drawing a single line) | 1983 // special-case 2 points (common for drawing a single line) |
| 1963 if (2 == count) { | 1984 if (2 == count) { |
| 1964 r.set(pts[0], pts[1]); | 1985 r.set(pts[0], pts[1]); |
| 1965 } else { | 1986 } else { |
| 1966 r.set(pts, SkToInt(count)); | 1987 r.set(pts, SkToInt(count)); |
| 1967 } | 1988 } |
| 1989 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 1968 bounds = &paint.computeFastStrokeBounds(r, &storage); | 1990 bounds = &paint.computeFastStrokeBounds(r, &storage); |
| 1969 if (this->quickReject(*bounds)) { | 1991 if (this->quickReject(*bounds)) { |
| 1970 return; | 1992 return; |
| 1971 } | 1993 } |
| 1994 #else | |
| 1995 if (this->quickReject(paint.computeFastStrokeBounds(r, &storage))) { | |
| 1996 return; | |
| 1997 } | |
| 1998 SkPaint unfiltered(paint); | |
| 1999 unfiltered.setImageFilter(nullptr); | |
| 2000 bounds = &unfiltered.computeFastStrokeBounds(r, &storage); | |
|
reed1
2015/10/27 20:05:40
don't we just want r here?
bounds = &r;
Stephen White
2015/10/27 20:59:55
Hmm, yeah. Done.
| |
| 2001 #endif | |
| 1972 } | 2002 } |
| 1973 | 2003 |
| 1974 SkASSERT(pts != nullptr); | 2004 SkASSERT(pts != nullptr); |
| 1975 | 2005 |
| 1976 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds) | 2006 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds) |
| 1977 | 2007 |
| 1978 while (iter.next()) { | 2008 while (iter.next()) { |
| 1979 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint()); | 2009 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint()); |
| 1980 } | 2010 } |
| 1981 | 2011 |
| 1982 LOOPER_END | 2012 LOOPER_END |
| 1983 } | 2013 } |
| 1984 | 2014 |
| 1985 void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { | 2015 void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
| 1986 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRect()"); | 2016 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRect()"); |
| 1987 SkRect storage; | 2017 SkRect storage; |
| 1988 const SkRect* bounds = nullptr; | 2018 const SkRect* bounds = nullptr; |
| 1989 if (paint.canComputeFastBounds()) { | 2019 if (paint.canComputeFastBounds()) { |
| 1990 // Skia will draw an inverted rect, because it explicitly "sorts" it dow nstream. | 2020 // Skia will draw an inverted rect, because it explicitly "sorts" it dow nstream. |
| 1991 // To prevent accidental rejecting at this stage, we have to sort it bef ore we check. | 2021 // To prevent accidental rejecting at this stage, we have to sort it bef ore we check. |
| 1992 SkRect tmp(r); | 2022 SkRect tmp(r); |
| 1993 tmp.sort(); | 2023 tmp.sort(); |
| 1994 | 2024 |
| 2025 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 1995 bounds = &paint.computeFastBounds(tmp, &storage); | 2026 bounds = &paint.computeFastBounds(tmp, &storage); |
| 1996 if (this->quickReject(*bounds)) { | 2027 if (this->quickReject(*bounds)) { |
| 1997 return; | 2028 return; |
| 1998 } | 2029 } |
| 2030 #else | |
| 2031 if (this->quickReject(paint.computeFastBounds(tmp, &storage))) { | |
| 2032 return; | |
| 2033 } | |
| 2034 bounds = &r; | |
| 2035 #endif | |
| 1999 } | 2036 } |
| 2000 | 2037 |
| 2001 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kRect_Type, bound s, false) | 2038 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kRect_Type, bound s, false) |
| 2002 | 2039 |
| 2003 while (iter.next()) { | 2040 while (iter.next()) { |
| 2004 iter.fDevice->drawRect(iter, r, looper.paint()); | 2041 iter.fDevice->drawRect(iter, r, looper.paint()); |
| 2005 } | 2042 } |
| 2006 | 2043 |
| 2007 LOOPER_END | 2044 LOOPER_END |
| 2008 } | 2045 } |
| 2009 | 2046 |
| 2010 void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) { | 2047 void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) { |
| 2011 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawOval()"); | 2048 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawOval()"); |
| 2012 SkRect storage; | 2049 SkRect storage; |
| 2013 const SkRect* bounds = nullptr; | 2050 const SkRect* bounds = nullptr; |
| 2014 if (paint.canComputeFastBounds()) { | 2051 if (paint.canComputeFastBounds()) { |
| 2052 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2015 bounds = &paint.computeFastBounds(oval, &storage); | 2053 bounds = &paint.computeFastBounds(oval, &storage); |
| 2016 if (this->quickReject(*bounds)) { | 2054 if (this->quickReject(*bounds)) { |
| 2017 return; | 2055 return; |
| 2018 } | 2056 } |
| 2057 #else | |
| 2058 if (this->quickReject(paint.computeFastBounds(oval, &storage))) { | |
| 2059 return; | |
| 2060 } | |
| 2061 bounds = &oval; | |
| 2062 #endif | |
| 2019 } | 2063 } |
| 2020 | 2064 |
| 2021 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds) | 2065 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds) |
| 2022 | 2066 |
| 2023 while (iter.next()) { | 2067 while (iter.next()) { |
| 2024 iter.fDevice->drawOval(iter, oval, looper.paint()); | 2068 iter.fDevice->drawOval(iter, oval, looper.paint()); |
| 2025 } | 2069 } |
| 2026 | 2070 |
| 2027 LOOPER_END | 2071 LOOPER_END |
| 2028 } | 2072 } |
| 2029 | 2073 |
| 2030 void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { | 2074 void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { |
| 2031 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRRect()"); | 2075 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRRect()"); |
| 2032 SkRect storage; | 2076 SkRect storage; |
| 2033 const SkRect* bounds = nullptr; | 2077 const SkRect* bounds = nullptr; |
| 2034 if (paint.canComputeFastBounds()) { | 2078 if (paint.canComputeFastBounds()) { |
| 2079 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2035 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage); | 2080 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage); |
| 2036 if (this->quickReject(*bounds)) { | 2081 if (this->quickReject(*bounds)) { |
| 2037 return; | 2082 return; |
| 2038 } | 2083 } |
| 2084 #else | |
| 2085 if (this->quickReject(paint.computeFastBounds(rrect.getBounds(), &storag e))) { | |
| 2086 return; | |
| 2087 } | |
| 2088 bounds = &rrect.getBounds(); | |
| 2089 #endif | |
| 2039 } | 2090 } |
| 2040 | 2091 |
| 2041 if (rrect.isRect()) { | 2092 if (rrect.isRect()) { |
| 2042 // call the non-virtual version | 2093 // call the non-virtual version |
| 2043 this->SkCanvas::drawRect(rrect.getBounds(), paint); | 2094 this->SkCanvas::drawRect(rrect.getBounds(), paint); |
| 2044 return; | 2095 return; |
| 2045 } else if (rrect.isOval()) { | 2096 } else if (rrect.isOval()) { |
| 2046 // call the non-virtual version | 2097 // call the non-virtual version |
| 2047 this->SkCanvas::drawOval(rrect.getBounds(), paint); | 2098 this->SkCanvas::drawOval(rrect.getBounds(), paint); |
| 2048 return; | 2099 return; |
| 2049 } | 2100 } |
| 2050 | 2101 |
| 2051 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) | 2102 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) |
| 2052 | 2103 |
| 2053 while (iter.next()) { | 2104 while (iter.next()) { |
| 2054 iter.fDevice->drawRRect(iter, rrect, looper.paint()); | 2105 iter.fDevice->drawRRect(iter, rrect, looper.paint()); |
| 2055 } | 2106 } |
| 2056 | 2107 |
| 2057 LOOPER_END | 2108 LOOPER_END |
| 2058 } | 2109 } |
| 2059 | 2110 |
| 2060 void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, | 2111 void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
| 2061 const SkPaint& paint) { | 2112 const SkPaint& paint) { |
| 2062 SkRect storage; | 2113 SkRect storage; |
| 2063 const SkRect* bounds = nullptr; | 2114 const SkRect* bounds = nullptr; |
| 2064 if (paint.canComputeFastBounds()) { | 2115 if (paint.canComputeFastBounds()) { |
| 2116 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2065 bounds = &paint.computeFastBounds(outer.getBounds(), &storage); | 2117 bounds = &paint.computeFastBounds(outer.getBounds(), &storage); |
| 2066 if (this->quickReject(*bounds)) { | 2118 if (this->quickReject(*bounds)) { |
| 2067 return; | 2119 return; |
| 2068 } | 2120 } |
| 2121 #else | |
| 2122 if (this->quickReject(paint.computeFastBounds(outer.getBounds(), &storag e))) { | |
| 2123 return; | |
| 2124 } | |
| 2125 bounds = &outer.getBounds(); | |
| 2126 #endif | |
| 2069 } | 2127 } |
| 2070 | 2128 |
| 2071 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) | 2129 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) |
| 2072 | 2130 |
| 2073 while (iter.next()) { | 2131 while (iter.next()) { |
| 2074 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint()); | 2132 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint()); |
| 2075 } | 2133 } |
| 2076 | 2134 |
| 2077 LOOPER_END | 2135 LOOPER_END |
| 2078 } | 2136 } |
| 2079 | 2137 |
| 2080 void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { | 2138 void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
| 2081 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPath()"); | 2139 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPath()"); |
| 2082 if (!path.isFinite()) { | 2140 if (!path.isFinite()) { |
| 2083 return; | 2141 return; |
| 2084 } | 2142 } |
| 2085 | 2143 |
| 2086 SkRect storage; | 2144 SkRect storage; |
| 2087 const SkRect* bounds = nullptr; | 2145 const SkRect* bounds = nullptr; |
| 2088 if (!path.isInverseFillType() && paint.canComputeFastBounds()) { | 2146 if (!path.isInverseFillType() && paint.canComputeFastBounds()) { |
| 2089 const SkRect& pathBounds = path.getBounds(); | 2147 const SkRect& pathBounds = path.getBounds(); |
| 2148 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2090 bounds = &paint.computeFastBounds(pathBounds, &storage); | 2149 bounds = &paint.computeFastBounds(pathBounds, &storage); |
| 2091 if (this->quickReject(*bounds)) { | 2150 if (this->quickReject(*bounds)) { |
| 2092 return; | 2151 return; |
| 2093 } | 2152 } |
| 2153 #else | |
| 2154 if (this->quickReject(paint.computeFastBounds(pathBounds, &storage))) { | |
| 2155 return; | |
| 2156 } | |
| 2157 bounds = &pathBounds; | |
| 2158 #endif | |
| 2094 } | 2159 } |
| 2095 | 2160 |
| 2096 const SkRect& r = path.getBounds(); | 2161 const SkRect& r = path.getBounds(); |
| 2097 if (r.width() <= 0 && r.height() <= 0) { | 2162 if (r.width() <= 0 && r.height() <= 0) { |
| 2098 if (path.isInverseFillType()) { | 2163 if (path.isInverseFillType()) { |
| 2099 this->internalDrawPaint(paint); | 2164 this->internalDrawPaint(paint); |
| 2100 return; | 2165 return; |
| 2101 } | 2166 } |
| 2102 } | 2167 } |
| 2103 | 2168 |
| 2104 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, bounds) | 2169 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, bounds) |
| 2105 | 2170 |
| 2106 while (iter.next()) { | 2171 while (iter.next()) { |
| 2107 iter.fDevice->drawPath(iter, path, looper.paint()); | 2172 iter.fDevice->drawPath(iter, path, looper.paint()); |
| 2108 } | 2173 } |
| 2109 | 2174 |
| 2110 LOOPER_END | 2175 LOOPER_END |
| 2111 } | 2176 } |
| 2112 | 2177 |
| 2113 void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S kPaint* paint) { | 2178 void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S kPaint* paint) { |
| 2114 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); | 2179 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); |
| 2115 SkRect bounds = SkRect::MakeXYWH(x, y, | 2180 SkRect bounds = SkRect::MakeXYWH(x, y, |
| 2116 SkIntToScalar(image->width()), SkIntToScala r(image->height())); | 2181 SkIntToScalar(image->width()), SkIntToScala r(image->height())); |
| 2117 if (nullptr == paint || paint->canComputeFastBounds()) { | 2182 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 2183 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2118 if (paint) { | 2184 if (paint) { |
| 2119 paint->computeFastBounds(bounds, &bounds); | 2185 paint->computeFastBounds(bounds, &bounds); |
| 2120 } | 2186 } |
| 2121 if (this->quickReject(bounds)) { | 2187 if (this->quickReject(bounds)) { |
| 2122 return; | 2188 return; |
| 2123 } | 2189 } |
| 2190 #else | |
| 2191 SkRect tmp = bounds; | |
| 2192 if (paint) { | |
| 2193 paint->computeFastBounds(tmp, &tmp); | |
| 2194 } | |
| 2195 if (this->quickReject(tmp)) { | |
| 2196 return; | |
| 2197 } | |
| 2198 #endif | |
| 2124 } | 2199 } |
| 2125 | 2200 |
| 2126 SkLazyPaint lazy; | 2201 SkLazyPaint lazy; |
| 2127 if (nullptr == paint) { | 2202 if (nullptr == paint) { |
| 2128 paint = lazy.init(); | 2203 paint = lazy.init(); |
| 2129 } | 2204 } |
| 2130 | 2205 |
| 2131 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) | 2206 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) |
| 2132 | 2207 |
| 2133 while (iter.next()) { | 2208 while (iter.next()) { |
| 2134 iter.fDevice->drawImage(iter, image, x, y, looper.paint()); | 2209 iter.fDevice->drawImage(iter, image, x, y, looper.paint()); |
| 2135 } | 2210 } |
| 2136 | 2211 |
| 2137 LOOPER_END | 2212 LOOPER_END |
| 2138 } | 2213 } |
| 2139 | 2214 |
| 2140 void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const Sk Rect& dst, | 2215 void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const Sk Rect& dst, |
| 2141 const SkPaint* paint, SrcRectConstraint constrain t) { | 2216 const SkPaint* paint, SrcRectConstraint constrain t) { |
| 2142 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); | 2217 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); |
| 2143 SkRect storage; | 2218 SkRect storage; |
| 2144 const SkRect* bounds = &dst; | 2219 const SkRect* bounds = &dst; |
| 2145 if (nullptr == paint || paint->canComputeFastBounds()) { | 2220 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 2221 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2146 if (paint) { | 2222 if (paint) { |
| 2147 bounds = &paint->computeFastBounds(dst, &storage); | 2223 bounds = &paint->computeFastBounds(dst, &storage); |
| 2148 } | 2224 } |
| 2149 if (this->quickReject(*bounds)) { | 2225 if (this->quickReject(*bounds)) { |
| 2150 return; | 2226 return; |
| 2151 } | 2227 } |
| 2228 #else | |
| 2229 storage = dst; | |
| 2230 if (paint) { | |
| 2231 paint->computeFastBounds(dst, &storage); | |
| 2232 } | |
| 2233 if (this->quickReject(storage)) { | |
| 2234 return; | |
| 2235 } | |
| 2236 #endif | |
| 2152 } | 2237 } |
| 2153 SkLazyPaint lazy; | 2238 SkLazyPaint lazy; |
| 2154 if (nullptr == paint) { | 2239 if (nullptr == paint) { |
| 2155 paint = lazy.init(); | 2240 paint = lazy.init(); |
| 2156 } | 2241 } |
| 2157 | 2242 |
| 2158 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo unds, | 2243 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo unds, |
| 2159 image->isOpaque()) | 2244 image->isOpaque()) |
| 2160 | 2245 |
| 2161 while (iter.next()) { | 2246 while (iter.next()) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 2178 paint = lazy.init(); | 2263 paint = lazy.init(); |
| 2179 } | 2264 } |
| 2180 | 2265 |
| 2181 const SkMatrix matrix = SkMatrix::MakeTrans(x, y); | 2266 const SkMatrix matrix = SkMatrix::MakeTrans(x, y); |
| 2182 | 2267 |
| 2183 SkRect storage; | 2268 SkRect storage; |
| 2184 const SkRect* bounds = nullptr; | 2269 const SkRect* bounds = nullptr; |
| 2185 if (paint->canComputeFastBounds()) { | 2270 if (paint->canComputeFastBounds()) { |
| 2186 bitmap.getBounds(&storage); | 2271 bitmap.getBounds(&storage); |
| 2187 matrix.mapRect(&storage); | 2272 matrix.mapRect(&storage); |
| 2273 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2188 bounds = &paint->computeFastBounds(storage, &storage); | 2274 bounds = &paint->computeFastBounds(storage, &storage); |
| 2189 if (this->quickReject(*bounds)) { | 2275 if (this->quickReject(*bounds)) { |
| 2190 return; | 2276 return; |
| 2191 } | 2277 } |
| 2278 #else | |
| 2279 SkRect tmp = storage; | |
| 2280 if (this->quickReject(paint->computeFastBounds(tmp, &tmp))) { | |
| 2281 return; | |
| 2282 } | |
| 2283 bounds = &storage; | |
| 2284 #endif | |
| 2192 } | 2285 } |
| 2193 | 2286 |
| 2194 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 2287 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
| 2195 | 2288 |
| 2196 while (iter.next()) { | 2289 while (iter.next()) { |
| 2197 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); | 2290 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); |
| 2198 } | 2291 } |
| 2199 | 2292 |
| 2200 LOOPER_END | 2293 LOOPER_END |
| 2201 } | 2294 } |
| 2202 | 2295 |
| 2203 // this one is non-virtual, so it can be called safely by other canvas apis | 2296 // this one is non-virtual, so it can be called safely by other canvas apis |
| 2204 void SkCanvas::internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, | 2297 void SkCanvas::internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, |
| 2205 const SkRect& dst, const SkPaint* paint, | 2298 const SkRect& dst, const SkPaint* paint, |
| 2206 SrcRectConstraint constraint) { | 2299 SrcRectConstraint constraint) { |
| 2207 if (bitmap.drawsNothing() || dst.isEmpty()) { | 2300 if (bitmap.drawsNothing() || dst.isEmpty()) { |
| 2208 return; | 2301 return; |
| 2209 } | 2302 } |
| 2210 | 2303 |
| 2211 SkRect storage; | 2304 SkRect storage; |
| 2212 const SkRect* bounds = &dst; | 2305 const SkRect* bounds = &dst; |
| 2213 if (nullptr == paint || paint->canComputeFastBounds()) { | 2306 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 2307 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2214 if (paint) { | 2308 if (paint) { |
| 2215 bounds = &paint->computeFastBounds(dst, &storage); | 2309 bounds = &paint->computeFastBounds(dst, &storage); |
| 2216 } | 2310 } |
| 2217 if (this->quickReject(*bounds)) { | 2311 if (this->quickReject(*bounds)) { |
| 2218 return; | 2312 return; |
| 2219 } | 2313 } |
| 2314 #else | |
| 2315 if (this->quickReject(paint ? paint->computeFastBounds(dst, &storage) : dst)) { | |
| 2316 return; | |
| 2317 } | |
| 2318 #endif | |
| 2220 } | 2319 } |
| 2221 | 2320 |
| 2222 SkLazyPaint lazy; | 2321 SkLazyPaint lazy; |
| 2223 if (nullptr == paint) { | 2322 if (nullptr == paint) { |
| 2224 paint = lazy.init(); | 2323 paint = lazy.init(); |
| 2225 } | 2324 } |
| 2226 | 2325 |
| 2227 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo unds, | 2326 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo unds, |
| 2228 bitmap.isOpaque()) | 2327 bitmap.isOpaque()) |
| 2229 | 2328 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 2241 this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint); | 2340 this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint); |
| 2242 } | 2341 } |
| 2243 | 2342 |
| 2244 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, cons t SkRect& dst, | 2343 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, cons t SkRect& dst, |
| 2245 const SkPaint* paint) { | 2344 const SkPaint* paint) { |
| 2246 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()"); | 2345 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()"); |
| 2247 | 2346 |
| 2248 SkRect storage; | 2347 SkRect storage; |
| 2249 const SkRect* bounds = &dst; | 2348 const SkRect* bounds = &dst; |
| 2250 if (nullptr == paint || paint->canComputeFastBounds()) { | 2349 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 2350 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2251 if (paint) { | 2351 if (paint) { |
| 2252 bounds = &paint->computeFastBounds(dst, &storage); | 2352 bounds = &paint->computeFastBounds(dst, &storage); |
| 2253 } | 2353 } |
| 2254 if (this->quickReject(*bounds)) { | 2354 if (this->quickReject(*bounds)) { |
| 2255 return; | 2355 return; |
| 2256 } | 2356 } |
| 2357 #else | |
| 2358 if (this->quickReject(paint ? paint->computeFastBounds(dst, &storage) : dst)) { | |
| 2359 return; | |
| 2360 } | |
| 2361 #endif | |
| 2257 } | 2362 } |
| 2258 | 2363 |
| 2259 SkLazyPaint lazy; | 2364 SkLazyPaint lazy; |
| 2260 if (nullptr == paint) { | 2365 if (nullptr == paint) { |
| 2261 paint = lazy.init(); | 2366 paint = lazy.init(); |
| 2262 } | 2367 } |
| 2263 | 2368 |
| 2264 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 2369 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
| 2265 | 2370 |
| 2266 while (iter.next()) { | 2371 while (iter.next()) { |
| 2267 iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint()); | 2372 iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint()); |
| 2268 } | 2373 } |
| 2269 | 2374 |
| 2270 LOOPER_END | 2375 LOOPER_END |
| 2271 } | 2376 } |
| 2272 | 2377 |
| 2273 void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, c onst SkRect& dst, | 2378 void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, c onst SkRect& dst, |
| 2274 const SkPaint* paint) { | 2379 const SkPaint* paint) { |
| 2275 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()"); | 2380 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()"); |
| 2276 SkDEBUGCODE(bitmap.validate();) | 2381 SkDEBUGCODE(bitmap.validate();) |
| 2277 | 2382 |
| 2278 SkRect storage; | 2383 SkRect storage; |
| 2279 const SkRect* bounds = &dst; | 2384 const SkRect* bounds = &dst; |
| 2280 if (nullptr == paint || paint->canComputeFastBounds()) { | 2385 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 2386 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2281 if (paint) { | 2387 if (paint) { |
| 2282 bounds = &paint->computeFastBounds(dst, &storage); | 2388 bounds = &paint->computeFastBounds(dst, &storage); |
| 2283 } | 2389 } |
| 2284 if (this->quickReject(*bounds)) { | 2390 if (this->quickReject(*bounds)) { |
| 2285 return; | 2391 return; |
| 2286 } | 2392 } |
| 2393 #else | |
| 2394 if (this->quickReject(paint ? paint->computeFastBounds(dst, &storage) : dst)) { | |
| 2395 return; | |
| 2396 } | |
| 2397 #endif | |
| 2287 } | 2398 } |
| 2288 | 2399 |
| 2289 SkLazyPaint lazy; | 2400 SkLazyPaint lazy; |
| 2290 if (nullptr == paint) { | 2401 if (nullptr == paint) { |
| 2291 paint = lazy.init(); | 2402 paint = lazy.init(); |
| 2292 } | 2403 } |
| 2293 | 2404 |
| 2294 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 2405 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
| 2295 | 2406 |
| 2296 while (iter.next()) { | 2407 while (iter.next()) { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2449 LOOPER_END | 2560 LOOPER_END |
| 2450 } | 2561 } |
| 2451 | 2562 |
| 2452 void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, | 2563 void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
| 2453 const SkPaint& paint) { | 2564 const SkPaint& paint) { |
| 2454 | 2565 |
| 2455 SkRect storage; | 2566 SkRect storage; |
| 2456 const SkRect* bounds = nullptr; | 2567 const SkRect* bounds = nullptr; |
| 2457 if (paint.canComputeFastBounds()) { | 2568 if (paint.canComputeFastBounds()) { |
| 2458 storage = blob->bounds().makeOffset(x, y); | 2569 storage = blob->bounds().makeOffset(x, y); |
| 2570 #ifdef SK_SAVE_LAYER_BOUNDS_ARE_FILTERED | |
| 2459 bounds = &paint.computeFastBounds(storage, &storage); | 2571 bounds = &paint.computeFastBounds(storage, &storage); |
| 2460 | 2572 |
| 2461 if (this->quickReject(*bounds)) { | 2573 if (this->quickReject(*bounds)) { |
| 2462 return; | 2574 return; |
| 2463 } | 2575 } |
| 2576 #else | |
| 2577 SkRect tmp; | |
| 2578 if (this->quickReject(paint.computeFastBounds(storage, &tmp))) { | |
| 2579 return; | |
| 2580 } | |
| 2581 bounds = &storage; | |
| 2582 #endif | |
| 2464 } | 2583 } |
| 2465 | 2584 |
| 2466 // We cannot filter in the looper as we normally do, because the paint is | 2585 // We cannot filter in the looper as we normally do, because the paint is |
| 2467 // incomplete at this point (text-related attributes are embedded within blo b run paints). | 2586 // incomplete at this point (text-related attributes are embedded within blo b run paints). |
| 2468 SkDrawFilter* drawFilter = fMCRec->fFilter; | 2587 SkDrawFilter* drawFilter = fMCRec->fFilter; |
| 2469 fMCRec->fFilter = nullptr; | 2588 fMCRec->fFilter = nullptr; |
| 2470 | 2589 |
| 2471 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, bounds) | 2590 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, bounds) |
| 2472 | 2591 |
| 2473 while (iter.next()) { | 2592 while (iter.next()) { |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2882 } | 3001 } |
| 2883 | 3002 |
| 2884 if (matrix) { | 3003 if (matrix) { |
| 2885 canvas->concat(*matrix); | 3004 canvas->concat(*matrix); |
| 2886 } | 3005 } |
| 2887 } | 3006 } |
| 2888 | 3007 |
| 2889 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3008 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
| 2890 fCanvas->restoreToCount(fSaveCount); | 3009 fCanvas->restoreToCount(fSaveCount); |
| 2891 } | 3010 } |
| OLD | NEW |