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

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 1291663005: Revert of drawBitmapImage can batch across AA rects (Closed) Base URL: https://skia.googlesource.com/skia.git@gmfordrawimagerect
Patch Set: Created 5 years, 4 months 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 | src/gpu/batches/GrRectBatchFactory.h » ('j') | 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 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
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"
43 #include "effects/GrBicubicEffect.h" 42 #include "effects/GrBicubicEffect.h"
44 #include "effects/GrDashingEffect.h" 43 #include "effects/GrDashingEffect.h"
45 #include "effects/GrSimpleTextureEffect.h" 44 #include "effects/GrSimpleTextureEffect.h"
46 #include "effects/GrTextureDomain.h" 45 #include "effects/GrTextureDomain.h"
47 46
48 #if SK_SUPPORT_GPU 47 #if SK_SUPPORT_GPU
49 48
50 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; 49 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 };
51 50
52 #if 0 51 #if 0
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 needsTextureDomain = false; 911 needsTextureDomain = false;
913 } else { 912 } else {
914 needsTextureDomain = may_color_bleed(srcRect, transformedRect, 913 needsTextureDomain = may_color_bleed(srcRect, transformedRect,
915 contextMatrix, isMSAA); 914 contextMatrix, isMSAA);
916 } 915 }
917 } 916 }
918 } 917 }
919 return needsTextureDomain; 918 return needsTextureDomain;
920 } 919 }
921 920
922 static void draw_aa_bitmap(GrDrawContext* drawContext, GrContext* context,
923 GrRenderTarget* renderTarget, const GrClip& clip,
924 const SkMatrix& viewMatrix, const SkMatrix& srcRectTo DstRect,
925 const SkPaint& paint, const SkBitmap* bitmapPtr, cons t SkSize& dstSize) {
926 SkShader::TileMode tm[] = {
927 SkShader::kClamp_TileMode,
928 SkShader::kClamp_TileMode,
929 };
930
931 bool doBicubic;
932 GrTextureParams::FilterMode textureFilterMode =
933 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewMatrix ,
934 srcRectToDstRect,
935 &doBicubic);
936
937 // Setup texture to wrap bitmap
938 GrTextureParams params(tm, textureFilterMode);
939 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, *bitmapPtr , &params));
940
941 if (!texture) {
942 SkErrorInternals::SetError(kInternalError_SkError,
943 "Couldn't convert bitmap to texture.");
944 return;
945 }
946
947 // Setup paint
948 GrColor paintColor = (kAlpha_8_SkColorType == bitmapPtr->colorType()) ?
949 SkColor2GrColor(paint.getColor()) :
950 SkColor2GrColorJustAlpha(paint.getColor());
951
952 GrPaint grPaint;
953
954 // Create and insert texture effect
955 SkAutoTUnref<const GrFragmentProcessor> fp;
956 if (doBicubic) {
957 fp.reset(GrBicubicEffect::Create(grPaint.getProcessorDataManager(), text ure,
958 SkMatrix::I(),
959 tm));
960 } else {
961 fp.reset(GrSimpleTextureEffect::Create(grPaint.getProcessorDataManager() , texture,
962 SkMatrix::I(), params));
963 }
964
965 grPaint.addColorProcessor(fp);
966
967 if (!SkPaint2GrPaint(context, renderTarget, paint, viewMatrix, true,
968 &grPaint)) {
969 return;
970 }
971
972 grPaint.setColor(paintColor);
973
974 // Setup dst rect and final matrix
975 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight};
976
977 SkRect devRect;
978 viewMatrix.mapRect(&devRect, dstRect);
979
980 SkMatrix matrix;
981 matrix.setIDiv(bitmapPtr->width(), bitmapPtr->height());
982
983 SkMatrix dstRectToSrcRect;
984 if (!srcRectToDstRect.invert(&dstRectToSrcRect)) {
985 return;
986 }
987 matrix.preConcat(dstRectToSrcRect);
988
989 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateFillAA(grPaint.get Color(),
990 viewMatrix,
991 matrix,
992 dstRect,
993 devRect));
994
995 drawContext->drawBatch(renderTarget, clip, grPaint, batch);
996 }
997
998 void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, 921 void SkGpuDevice::drawBitmapCommon(const SkDraw& draw,
999 const SkBitmap& bitmap, 922 const SkBitmap& bitmap,
1000 const SkRect* srcRectPtr, 923 const SkRect* srcRectPtr,
1001 const SkSize* dstSizePtr, 924 const SkSize* dstSizePtr,
1002 const SkPaint& paint, 925 const SkPaint& paint,
1003 SkCanvas::SrcRectConstraint constraint) { 926 SkCanvas::SrcRectConstraint constraint) {
1004 CHECK_SHOULD_DRAW(draw); 927 CHECK_SHOULD_DRAW(draw);
1005 928
1006 SkRect srcRect; 929 SkRect srcRect;
1007 SkSize dstSize; 930 SkSize dstSize;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 if (isDstPixelAligned) 980 if (isDstPixelAligned)
1058 directDraw = true; 981 directDraw = true;
1059 } 982 }
1060 } 983 }
1061 984
1062 if (paint.getMaskFilter() || !directDraw) { 985 if (paint.getMaskFilter() || !directDraw) {
1063 // Convert the bitmap to a shader so that the rect can be drawn 986 // Convert the bitmap to a shader so that the rect can be drawn
1064 // through drawRect, which supports mask filters. 987 // through drawRect, which supports mask filters.
1065 SkBitmap tmp; // subset of bitmap, if necessary 988 SkBitmap tmp; // subset of bitmap, if necessary
1066 const SkBitmap* bitmapPtr = &bitmap; 989 const SkBitmap* bitmapPtr = &bitmap;
1067 SkMatrix srcRectToDstRect; 990 SkMatrix localM;
1068 if (srcRectPtr) { 991 if (srcRectPtr) {
1069 srcRectToDstRect.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop) ; 992 localM.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop);
1070 srcRectToDstRect.postScale(dstSize.fWidth / srcRectPtr->width(), 993 localM.postScale(dstSize.fWidth / srcRectPtr->width(),
1071 dstSize.fHeight / srcRectPtr->height()); 994 dstSize.fHeight / srcRectPtr->height());
1072 // In bleed mode we position and trim the bitmap based on the src re ct which is 995 // In bleed mode we position and trim the bitmap based on the src re ct which is
1073 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out 996 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out
1074 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to 997 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to
1075 // compensate. 998 // compensate.
1076 if (SkCanvas::kStrict_SrcRectConstraint == constraint) { 999 if (SkCanvas::kStrict_SrcRectConstraint == constraint) {
1077 SkIRect iSrc; 1000 SkIRect iSrc;
1078 srcRect.roundOut(&iSrc); 1001 srcRect.roundOut(&iSrc);
1079 1002
1080 SkPoint offset = SkPoint::Make(SkIntToScalar(iSrc.fLeft), 1003 SkPoint offset = SkPoint::Make(SkIntToScalar(iSrc.fLeft),
1081 SkIntToScalar(iSrc.fTop)); 1004 SkIntToScalar(iSrc.fTop));
1082 1005
1083 if (!bitmap.extractSubset(&tmp, iSrc)) { 1006 if (!bitmap.extractSubset(&tmp, iSrc)) {
1084 return; // extraction failed 1007 return; // extraction failed
1085 } 1008 }
1086 bitmapPtr = &tmp; 1009 bitmapPtr = &tmp;
1087 srcRect.offset(-offset.fX, -offset.fY); 1010 srcRect.offset(-offset.fX, -offset.fY);
1088 1011
1089 // The source rect has changed so update the matrix 1012 // The source rect has changed so update the matrix
1090 srcRectToDstRect.preTranslate(offset.fX, offset.fY); 1013 localM.preTranslate(offset.fX, offset.fY);
1091 } 1014 }
1092 } else { 1015 } else {
1093 srcRectToDstRect.reset(); 1016 localM.reset();
1094 } 1017 }
1095 1018
1096 // If we have a maskfilter then we can't batch, so we take a slow path. However, we fast 1019 SkPaint paintWithShader(paint);
1097 // path the case where we are drawing an AA rect so we can batch many dr awImageRect calls 1020 paintWithShader.setShader(SkShader::CreateBitmapShader(*bitmapPtr,
1098 if (paint.getMaskFilter()) { 1021 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &localM))->unr ef();
1099 SkPaint paintWithShader(paint); 1022 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight};
1100 paintWithShader.setShader(SkShader::CreateBitmapShader(*bitmapPtr, 1023 this->drawRect(draw, dstRect, paintWithShader);
1101 SkShader::kClamp_TileMode, SkShader::kClam p_TileMode,
1102 &srcRectToDstRect))->unref();
1103 SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight};
1104 this->drawRect(draw, dstRect, paintWithShader);
1105 } else {
1106 draw_aa_bitmap(fDrawContext, fContext, fRenderTarget, fClip, *draw.f Matrix,
1107 srcRectToDstRect, paint, bitmapPtr, dstSize);
1108 }
1109 1024
1110 return; 1025 return;
1111 } 1026 }
1112 1027
1113 // If there is no mask filter than it is OK to handle the src rect -> dst re ct scaling using 1028 // If there is no mask filter than it is OK to handle the src rect -> dst re ct scaling using
1114 // the view matrix rather than a local matrix. 1029 // the view matrix rather than a local matrix.
1115 SkMatrix m; 1030 SkMatrix m;
1116 m.setScale(dstSize.fWidth / srcRect.width(), 1031 m.setScale(dstSize.fWidth / srcRect.width(),
1117 dstSize.fHeight / srcRect.height()); 1032 dstSize.fHeight / srcRect.height());
1118 SkMatrix viewM = *draw.fMatrix; 1033 SkMatrix viewM = *draw.fMatrix;
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
1922 #endif 1837 #endif
1923 } 1838 }
1924 1839
1925 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 1840 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
1926 // We always return a transient cache, so it is freed after each 1841 // We always return a transient cache, so it is freed after each
1927 // filter traversal. 1842 // filter traversal.
1928 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); 1843 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize);
1929 } 1844 }
1930 1845
1931 #endif 1846 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/batches/GrRectBatchFactory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698