| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 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 "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
| 9 | 9 |
| 10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
| 11 #include "GrContext.h" | 11 #include "GrContext.h" |
| 12 #include "SkDraw.h" |
| 12 #include "GrDrawContext.h" | 13 #include "GrDrawContext.h" |
| 13 #include "GrFontScaler.h" | 14 #include "GrFontScaler.h" |
| 14 #include "GrGpu.h" | 15 #include "GrGpu.h" |
| 15 #include "GrGpuResourcePriv.h" | 16 #include "GrGpuResourcePriv.h" |
| 16 #include "GrImageIDTextureAdjuster.h" | 17 #include "GrImageIDTextureAdjuster.h" |
| 17 #include "GrLayerHoister.h" | 18 #include "GrLayerHoister.h" |
| 18 #include "GrRecordReplaceDraw.h" | 19 #include "GrRecordReplaceDraw.h" |
| 19 #include "GrStrokeInfo.h" | 20 #include "GrStrokeInfo.h" |
| 20 #include "GrTextContext.h" | 21 #include "GrTextContext.h" |
| 21 #include "GrTracing.h" | 22 #include "GrTracing.h" |
| 22 #include "SkCanvasPriv.h" | 23 #include "SkCanvasPriv.h" |
| 23 #include "SkDrawProcs.h" | |
| 24 #include "SkErrorInternals.h" | 24 #include "SkErrorInternals.h" |
| 25 #include "SkGlyphCache.h" | 25 #include "SkGlyphCache.h" |
| 26 #include "SkGrTexturePixelRef.h" | 26 #include "SkGrTexturePixelRef.h" |
| 27 #include "SkGr.h" | 27 #include "SkGr.h" |
| 28 #include "SkGrPriv.h" | 28 #include "SkGrPriv.h" |
| 29 #include "SkImage_Base.h" | 29 #include "SkImage_Base.h" |
| 30 #include "SkImageFilter.h" | 30 #include "SkImageFilter.h" |
| 31 #include "SkLayerInfo.h" | 31 #include "SkLayerInfo.h" |
| 32 #include "SkMaskFilter.h" | 32 #include "SkMaskFilter.h" |
| 33 #include "SkNinePatchIter.h" | 33 #include "SkNinePatchIter.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 return fTexture.get(); | 106 return fTexture.get(); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 private: | 110 private: |
| 111 SkAutoTUnref<GrTexture> fTexture; | 111 SkAutoTUnref<GrTexture> fTexture; |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 /////////////////////////////////////////////////////////////////////////////// | 114 /////////////////////////////////////////////////////////////////////////////// |
| 115 | 115 |
| 116 struct GrSkDrawProcs : public SkDrawProcs { | |
| 117 public: | |
| 118 GrContext* fContext; | |
| 119 GrTextContext* fTextContext; | |
| 120 GrFontScaler* fFontScaler; // cached in the skia glyphcache | |
| 121 }; | |
| 122 | |
| 123 /////////////////////////////////////////////////////////////////////////////// | |
| 124 | |
| 125 /** Checks that the alpha type is legal and gets constructor flags. Returns fals
e if device creation | 116 /** Checks that the alpha type is legal and gets constructor flags. Returns fals
e if device creation |
| 126 should fail. */ | 117 should fail. */ |
| 127 bool SkGpuDevice::CheckAlphaTypeAndGetFlags( | 118 bool SkGpuDevice::CheckAlphaTypeAndGetFlags( |
| 128 const SkImageInfo* info, SkGpuDevice::InitContents init,
unsigned* flags) { | 119 const SkImageInfo* info, SkGpuDevice::InitContents init,
unsigned* flags) { |
| 129 *flags = 0; | 120 *flags = 0; |
| 130 if (info) { | 121 if (info) { |
| 131 switch (info->alphaType()) { | 122 switch (info->alphaType()) { |
| 132 case kPremul_SkAlphaType: | 123 case kPremul_SkAlphaType: |
| 133 break; | 124 break; |
| 134 case kOpaque_SkAlphaType: | 125 case kOpaque_SkAlphaType: |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 return nullptr; | 165 return nullptr; |
| 175 } | 166 } |
| 176 | 167 |
| 177 return new SkGpuDevice(rt, info.width(), info.height(), props, flags); | 168 return new SkGpuDevice(rt, info.width(), info.height(), props, flags); |
| 178 } | 169 } |
| 179 | 170 |
| 180 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height, | 171 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height, |
| 181 const SkSurfaceProps* props, unsigned flags) | 172 const SkSurfaceProps* props, unsigned flags) |
| 182 : INHERITED(SkSurfacePropsCopyOrDefault(props)) | 173 : INHERITED(SkSurfacePropsCopyOrDefault(props)) |
| 183 { | 174 { |
| 184 fDrawProcs = nullptr; | |
| 185 | |
| 186 fContext = SkRef(rt->getContext()); | 175 fContext = SkRef(rt->getContext()); |
| 187 fNeedClear = SkToBool(flags & kNeedClear_Flag); | 176 fNeedClear = SkToBool(flags & kNeedClear_Flag); |
| 188 fOpaque = SkToBool(flags & kIsOpaque_Flag); | 177 fOpaque = SkToBool(flags & kIsOpaque_Flag); |
| 189 | 178 |
| 190 fRenderTarget = SkRef(rt); | 179 fRenderTarget = SkRef(rt); |
| 191 | 180 |
| 192 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; | 181 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
| 193 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height); | 182 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height); |
| 194 SkPixelRef* pr = new SkGrPixelRef(info, rt); | 183 SkPixelRef* pr = new SkGrPixelRef(info, rt); |
| 195 fLegacyBitmap.setInfo(info); | 184 fLegacyBitmap.setInfo(info); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 GrTexture* texture = context->textureProvider()->createTexture( | 220 GrTexture* texture = context->textureProvider()->createTexture( |
| 232 desc, SkToBool(budgeted), nullptr, 0); | 221 desc, SkToBool(budgeted), nullptr, 0); |
| 233 if (nullptr == texture) { | 222 if (nullptr == texture) { |
| 234 return nullptr; | 223 return nullptr; |
| 235 } | 224 } |
| 236 SkASSERT(nullptr != texture->asRenderTarget()); | 225 SkASSERT(nullptr != texture->asRenderTarget()); |
| 237 return texture->asRenderTarget(); | 226 return texture->asRenderTarget(); |
| 238 } | 227 } |
| 239 | 228 |
| 240 SkGpuDevice::~SkGpuDevice() { | 229 SkGpuDevice::~SkGpuDevice() { |
| 241 if (fDrawProcs) { | |
| 242 delete fDrawProcs; | |
| 243 } | |
| 244 | |
| 245 fRenderTarget->unref(); | 230 fRenderTarget->unref(); |
| 246 fContext->unref(); | 231 fContext->unref(); |
| 247 } | 232 } |
| 248 | 233 |
| 249 /////////////////////////////////////////////////////////////////////////////// | 234 /////////////////////////////////////////////////////////////////////////////// |
| 250 | 235 |
| 251 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size
_t dstRowBytes, | 236 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size
_t dstRowBytes, |
| 252 int x, int y) { | 237 int x, int y) { |
| 253 DO_DEFERRED_CLEAR(); | 238 DO_DEFERRED_CLEAR(); |
| 254 | 239 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 }; | 382 }; |
| 398 | 383 |
| 399 // suppress antialiasing on axis-aligned integer-coordinate lines | 384 // suppress antialiasing on axis-aligned integer-coordinate lines |
| 400 static bool needs_antialiasing(SkCanvas::PointMode mode, size_t count, const SkP
oint pts[]) { | 385 static bool needs_antialiasing(SkCanvas::PointMode mode, size_t count, const SkP
oint pts[]) { |
| 401 if (mode == SkCanvas::PointMode::kPoints_PointMode) { | 386 if (mode == SkCanvas::PointMode::kPoints_PointMode) { |
| 402 return false; | 387 return false; |
| 403 } | 388 } |
| 404 if (count == 2) { | 389 if (count == 2) { |
| 405 // We do not antialias as long as the primary axis of the line is intege
r-aligned, even if | 390 // We do not antialias as long as the primary axis of the line is intege
r-aligned, even if |
| 406 // the other coordinates are not. This does mean the two end pixels of t
he line will be | 391 // the other coordinates are not. This does mean the two end pixels of t
he line will be |
| 407 // sharp even when they shouldn't be, but turning antialiasing on (as th
ings stand | 392 // sharp even when they shouldn't be, but turning antialiasing on (as th
ings stand |
| 408 // currently) means that the line will turn into a two-pixel-wide blur.
While obviously a | 393 // currently) means that the line will turn into a two-pixel-wide blur.
While obviously a |
| 409 // more complete fix is possible down the road, for the time being we ac
cept the error on | 394 // more complete fix is possible down the road, for the time being we ac
cept the error on |
| 410 // the two end pixels as being the lesser of two evils. | 395 // the two end pixels as being the lesser of two evils. |
| 411 if (pts[0].fX == pts[1].fX) { | 396 if (pts[0].fX == pts[1].fX) { |
| 412 return ((int) pts[0].fX) != pts[0].fX; | 397 return ((int) pts[0].fX) != pts[0].fX; |
| 413 } | 398 } |
| 414 if (pts[0].fY == pts[1].fY) { | 399 if (pts[0].fY == pts[1].fY) { |
| 415 return ((int) pts[0].fY) != pts[0].fY; | 400 return ((int) pts[0].fY) != pts[0].fY; |
| 416 } | 401 } |
| 417 } | 402 } |
| 418 return true; | 403 return true; |
| 419 } | 404 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 437 SkPath path; | 422 SkPath path; |
| 438 path.setIsVolatile(true); | 423 path.setIsVolatile(true); |
| 439 path.moveTo(pts[0]); | 424 path.moveTo(pts[0]); |
| 440 path.lineTo(pts[1]); | 425 path.lineTo(pts[1]); |
| 441 fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); | 426 fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); |
| 442 return; | 427 return; |
| 443 } | 428 } |
| 444 | 429 |
| 445 // we only handle non-antialiased hairlines and paints without path effects
or mask filters, | 430 // we only handle non-antialiased hairlines and paints without path effects
or mask filters, |
| 446 // else we let the SkDraw call our drawPath() | 431 // else we let the SkDraw call our drawPath() |
| 447 if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || | 432 if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || |
| 448 (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { | 433 (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { |
| 449 draw.drawPoints(mode, count, pts, paint, true); | 434 draw.drawPoints(mode, count, pts, paint, true); |
| 450 return; | 435 return; |
| 451 } | 436 } |
| 452 | 437 |
| 453 GrPaint grPaint; | 438 GrPaint grPaint; |
| 454 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 439 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| 455 return; | 440 return; |
| 456 } | 441 } |
| 457 | 442 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 CHECK_FOR_ANNOTATION(paint); | 603 CHECK_FOR_ANNOTATION(paint); |
| 619 CHECK_SHOULD_DRAW(draw); | 604 CHECK_SHOULD_DRAW(draw); |
| 620 | 605 |
| 621 // Presumably the path effect warps this to something other than an oval | 606 // Presumably the path effect warps this to something other than an oval |
| 622 if (paint.getPathEffect()) { | 607 if (paint.getPathEffect()) { |
| 623 SkPath path; | 608 SkPath path; |
| 624 path.setIsVolatile(true); | 609 path.setIsVolatile(true); |
| 625 path.addOval(oval); | 610 path.addOval(oval); |
| 626 this->drawPath(draw, path, paint, nullptr, true); | 611 this->drawPath(draw, path, paint, nullptr, true); |
| 627 return; | 612 return; |
| 628 } | 613 } |
| 629 | 614 |
| 630 if (paint.getMaskFilter()) { | 615 if (paint.getMaskFilter()) { |
| 631 // The RRect path can handle special case blurring | 616 // The RRect path can handle special case blurring |
| 632 SkRRect rr = SkRRect::MakeOval(oval); | 617 SkRRect rr = SkRRect::MakeOval(oval); |
| 633 return this->drawRRect(draw, rr, paint); | 618 return this->drawRRect(draw, rr, paint); |
| 634 } | 619 } |
| 635 | 620 |
| 636 GrPaint grPaint; | 621 GrPaint grPaint; |
| 637 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 622 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| 638 return; | 623 return; |
| 639 } | 624 } |
| (...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS
Xform xform[], | 1666 void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS
Xform xform[], |
| 1682 const SkRect texRect[], const SkColor colors[], int
count, | 1667 const SkRect texRect[], const SkColor colors[], int
count, |
| 1683 SkXfermode::Mode mode, const SkPaint& paint) { | 1668 SkXfermode::Mode mode, const SkPaint& paint) { |
| 1684 if (paint.isAntiAlias()) { | 1669 if (paint.isAntiAlias()) { |
| 1685 this->INHERITED::drawAtlas(draw, atlas, xform, texRect, colors, count, m
ode, paint); | 1670 this->INHERITED::drawAtlas(draw, atlas, xform, texRect, colors, count, m
ode, paint); |
| 1686 return; | 1671 return; |
| 1687 } | 1672 } |
| 1688 | 1673 |
| 1689 CHECK_SHOULD_DRAW(draw); | 1674 CHECK_SHOULD_DRAW(draw); |
| 1690 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 1675 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); |
| 1691 | 1676 |
| 1692 SkPaint p(paint); | 1677 SkPaint p(paint); |
| 1693 p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_Til
eMode))->unref(); | 1678 p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_Til
eMode))->unref(); |
| 1694 | 1679 |
| 1695 GrPaint grPaint; | 1680 GrPaint grPaint; |
| 1696 if (colors) { | 1681 if (colors) { |
| 1697 if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
e, true, | 1682 if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
e, true, |
| 1698 &grPaint)) { | 1683 &grPaint)) { |
| 1699 return; | 1684 return; |
| 1700 } | 1685 } |
| 1701 } else { | 1686 } else { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1867 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
| 1883 } | 1868 } |
| 1884 | 1869 |
| 1885 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1870 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1886 // We always return a transient cache, so it is freed after each | 1871 // We always return a transient cache, so it is freed after each |
| 1887 // filter traversal. | 1872 // filter traversal. |
| 1888 return SkGpuDevice::NewImageFilterCache(); | 1873 return SkGpuDevice::NewImageFilterCache(); |
| 1889 } | 1874 } |
| 1890 | 1875 |
| 1891 #endif | 1876 #endif |
| OLD | NEW |