Chromium Code Reviews| 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" |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 32 #include "SkPictureData.h" | 32 #include "SkPictureData.h" |
| 33 #include "SkRRect.h" | 33 #include "SkRRect.h" |
| 34 #include "SkRecord.h" | 34 #include "SkRecord.h" |
| 35 #include "SkStroke.h" | 35 #include "SkStroke.h" |
| 36 #include "SkSurface.h" | 36 #include "SkSurface.h" |
| 37 #include "SkSurface_Gpu.h" | 37 #include "SkSurface_Gpu.h" |
| 38 #include "SkTLazy.h" | 38 #include "SkTLazy.h" |
| 39 #include "SkUtils.h" | 39 #include "SkUtils.h" |
| 40 #include "SkVertState.h" | 40 #include "SkVertState.h" |
| 41 #include "SkXfermode.h" | 41 #include "SkXfermode.h" |
| 42 #include "batches/GrRectBatchFactory.h" | |
| 42 #include "effects/GrBicubicEffect.h" | 43 #include "effects/GrBicubicEffect.h" |
| 43 #include "effects/GrDashingEffect.h" | 44 #include "effects/GrDashingEffect.h" |
| 44 #include "effects/GrSimpleTextureEffect.h" | 45 #include "effects/GrSimpleTextureEffect.h" |
| 45 #include "effects/GrTextureDomain.h" | 46 #include "effects/GrTextureDomain.h" |
| 46 | 47 |
| 47 #if SK_SUPPORT_GPU | 48 #if SK_SUPPORT_GPU |
| 48 | 49 |
| 49 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; | 50 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; |
| 50 | 51 |
| 51 #if 0 | 52 #if 0 |
| (...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 980 if (isDstPixelAligned) | 981 if (isDstPixelAligned) |
| 981 directDraw = true; | 982 directDraw = true; |
| 982 } | 983 } |
| 983 } | 984 } |
| 984 | 985 |
| 985 if (paint.getMaskFilter() || !directDraw) { | 986 if (paint.getMaskFilter() || !directDraw) { |
| 986 // Convert the bitmap to a shader so that the rect can be drawn | 987 // Convert the bitmap to a shader so that the rect can be drawn |
| 987 // through drawRect, which supports mask filters. | 988 // through drawRect, which supports mask filters. |
| 988 SkBitmap tmp; // subset of bitmap, if necessary | 989 SkBitmap tmp; // subset of bitmap, if necessary |
| 989 const SkBitmap* bitmapPtr = &bitmap; | 990 const SkBitmap* bitmapPtr = &bitmap; |
| 990 SkMatrix localM; | 991 SkMatrix srcRectToDstRect; |
| 991 if (srcRectPtr) { | 992 if (srcRectPtr) { |
| 992 localM.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop); | 993 srcRectToDstRect.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop) ; |
| 993 localM.postScale(dstSize.fWidth / srcRectPtr->width(), | 994 srcRectToDstRect.postScale(dstSize.fWidth / srcRectPtr->width(), |
| 994 dstSize.fHeight / srcRectPtr->height()); | 995 dstSize.fHeight / srcRectPtr->height()); |
| 995 // In bleed mode we position and trim the bitmap based on the src re ct which is | 996 // In bleed mode we position and trim the bitmap based on the src re ct which is |
| 996 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out | 997 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out |
| 997 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to | 998 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to |
| 998 // compensate. | 999 // compensate. |
| 999 if (SkCanvas::kStrict_SrcRectConstraint == constraint) { | 1000 if (SkCanvas::kStrict_SrcRectConstraint == constraint) { |
| 1000 SkIRect iSrc; | 1001 SkIRect iSrc; |
| 1001 srcRect.roundOut(&iSrc); | 1002 srcRect.roundOut(&iSrc); |
| 1002 | 1003 |
| 1003 SkPoint offset = SkPoint::Make(SkIntToScalar(iSrc.fLeft), | 1004 SkPoint offset = SkPoint::Make(SkIntToScalar(iSrc.fLeft), |
| 1004 SkIntToScalar(iSrc.fTop)); | 1005 SkIntToScalar(iSrc.fTop)); |
| 1005 | 1006 |
| 1006 if (!bitmap.extractSubset(&tmp, iSrc)) { | 1007 if (!bitmap.extractSubset(&tmp, iSrc)) { |
| 1007 return; // extraction failed | 1008 return; // extraction failed |
| 1008 } | 1009 } |
| 1009 bitmapPtr = &tmp; | 1010 bitmapPtr = &tmp; |
| 1010 srcRect.offset(-offset.fX, -offset.fY); | 1011 srcRect.offset(-offset.fX, -offset.fY); |
| 1011 | 1012 |
| 1012 // The source rect has changed so update the matrix | 1013 // The source rect has changed so update the matrix |
| 1013 localM.preTranslate(offset.fX, offset.fY); | 1014 srcRectToDstRect.preTranslate(offset.fX, offset.fY); |
| 1014 } | 1015 } |
| 1015 } else { | 1016 } else { |
| 1016 localM.reset(); | 1017 srcRectToDstRect.reset(); |
| 1017 } | 1018 } |
| 1018 | 1019 |
| 1019 SkPaint paintWithShader(paint); | 1020 // If we have a maskfilter then we can't batch, so we take a slow path. However, we fast |
| 1020 paintWithShader.setShader(SkShader::CreateBitmapShader(*bitmapPtr, | 1021 // path the case where we are drawing an AA rect so we can batch many dr awImageRect calls |
| 1021 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &localM))->unr ef(); | 1022 if (paint.getMaskFilter()) { |
| 1022 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight}; | 1023 SkPaint paintWithShader(paint); |
| 1023 this->drawRect(draw, dstRect, paintWithShader); | 1024 paintWithShader.setShader(SkShader::CreateBitmapShader(*bitmapPtr, |
|
robertphillips
2015/08/14 18:49:20
tab over to line up with '(' ?
| |
| 1025 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, | |
| 1026 &srcRectToDstRect))->unref(); | |
| 1027 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight}; | |
| 1028 this->drawRect(draw, dstRect, paintWithShader); | |
| 1029 } else { | |
|
robertphillips
2015/08/14 18:49:20
Can/should this be a subroutine ?
| |
| 1030 SkShader::TileMode tm[] = { | |
| 1031 SkShader::kClamp_TileMode, | |
| 1032 SkShader::kClamp_TileMode, | |
| 1033 }; | |
| 1034 | |
| 1035 bool doBicubic; | |
| 1036 GrTextureParams::FilterMode textureFilterMode = | |
| 1037 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *d raw.fMatrix, | |
| 1038 srcRectToDstRect, | |
| 1039 &doBicubic); | |
| 1040 | |
| 1041 // Setup texture to wrap bitmap | |
| 1042 GrTextureParams params(tm, textureFilterMode); | |
| 1043 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(fContext, * bitmapPtr, | |
| 1044 ¶ms)); | |
| 1045 | |
| 1046 if (!texture) { | |
| 1047 SkErrorInternals::SetError(kInternalError_SkError, | |
| 1048 "Couldn't convert bitmap to texture." ); | |
| 1049 return; | |
| 1050 } | |
| 1051 | |
| 1052 // Setup paint | |
| 1053 GrColor paintColor = (kAlpha_8_SkColorType == bitmapPtr->colorType() ) ? | |
| 1054 SkColor2GrColor(paint.getColor()) : | |
| 1055 SkColor2GrColorJustAlpha(paint.getColor()); | |
| 1056 | |
| 1057 GrPaint grPaint; | |
| 1058 | |
| 1059 // Create and insert texture effect | |
| 1060 SkAutoTUnref<const GrFragmentProcessor> fp; | |
| 1061 if (doBicubic) { | |
| 1062 fp.reset(GrBicubicEffect::Create(grPaint.getProcessorDataManager (), texture, | |
| 1063 SkMatrix::I(), | |
| 1064 tm)); | |
| 1065 } else { | |
| 1066 fp.reset(GrSimpleTextureEffect::Create(grPaint.getProcessorDataM anager(), texture, | |
| 1067 SkMatrix::I(), params)); | |
| 1068 } | |
| 1069 | |
| 1070 grPaint.addColorProcessor(fp); | |
| 1071 | |
| 1072 if (!SkPaint2GrPaint(this->context(), fRenderTarget, paint, *draw.fM atrix, true, | |
| 1073 &grPaint)) { | |
| 1074 return; | |
| 1075 } | |
| 1076 | |
| 1077 grPaint.setColor(paintColor); | |
| 1078 | |
| 1079 // Setup dst rect and final matrix | |
| 1080 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight}; | |
| 1081 | |
| 1082 SkRect devRect; | |
| 1083 draw.fMatrix->mapRect(&devRect, dstRect); | |
| 1084 | |
| 1085 SkMatrix matrix; | |
| 1086 matrix.setIDiv(bitmapPtr->width(), bitmapPtr->height()); | |
| 1087 | |
| 1088 SkMatrix dstRectToSrcRect; | |
| 1089 if (!srcRectToDstRect.invert(&dstRectToSrcRect)) { | |
| 1090 return; | |
| 1091 } | |
| 1092 matrix.preConcat(dstRectToSrcRect); | |
| 1093 | |
| 1094 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateFillAA(grP aint.getColor(), | |
| 1095 *dr aw.fMatrix, | |
| 1096 ma trix, | |
| 1097 ds tRect, | |
| 1098 de vRect)); | |
| 1099 | |
| 1100 fDrawContext->drawBatch(fRenderTarget, fClip, grPaint, batch); | |
| 1101 } | |
| 1024 | 1102 |
| 1025 return; | 1103 return; |
| 1026 } | 1104 } |
| 1027 | 1105 |
| 1028 // If there is no mask filter than it is OK to handle the src rect -> dst re ct scaling using | 1106 // If there is no mask filter than it is OK to handle the src rect -> dst re ct scaling using |
| 1029 // the view matrix rather than a local matrix. | 1107 // the view matrix rather than a local matrix. |
| 1030 SkMatrix m; | 1108 SkMatrix m; |
| 1031 m.setScale(dstSize.fWidth / srcRect.width(), | 1109 m.setScale(dstSize.fWidth / srcRect.width(), |
| 1032 dstSize.fHeight / srcRect.height()); | 1110 dstSize.fHeight / srcRect.height()); |
| 1033 SkMatrix viewM = *draw.fMatrix; | 1111 SkMatrix viewM = *draw.fMatrix; |
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1837 #endif | 1915 #endif |
| 1838 } | 1916 } |
| 1839 | 1917 |
| 1840 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1918 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1841 // We always return a transient cache, so it is freed after each | 1919 // We always return a transient cache, so it is freed after each |
| 1842 // filter traversal. | 1920 // filter traversal. |
| 1843 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1921 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
| 1844 } | 1922 } |
| 1845 | 1923 |
| 1846 #endif | 1924 #endif |
| OLD | NEW |