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 "effects/GrBicubicEffect.h" | 10 #include "effects/GrBicubicEffect.h" |
(...skipping 1028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1039 } else { | 1039 } else { |
1040 SkASSERT(dstSizePtr); | 1040 SkASSERT(dstSizePtr); |
1041 srcRect = *srcRectPtr; | 1041 srcRect = *srcRectPtr; |
1042 dstSize = *dstSizePtr; | 1042 dstSize = *dstSizePtr; |
1043 if (srcRect.fLeft <= 0 && srcRect.fTop <= 0 && | 1043 if (srcRect.fLeft <= 0 && srcRect.fTop <= 0 && |
1044 srcRect.fRight >= bitmap.width() && srcRect.fBottom >= bitmap.height ()) { | 1044 srcRect.fRight >= bitmap.width() && srcRect.fBottom >= bitmap.height ()) { |
1045 flags = (SkCanvas::DrawBitmapRectFlags) (flags | SkCanvas::kBleed_Dr awBitmapRectFlag); | 1045 flags = (SkCanvas::DrawBitmapRectFlags) (flags | SkCanvas::kBleed_Dr awBitmapRectFlag); |
1046 } | 1046 } |
1047 } | 1047 } |
1048 | 1048 |
1049 if (paint.getMaskFilter()){ | 1049 // if anti-aliasing without an msaa render target we must call drawRect |
1050 // or the result won't be anti-aliased | |
1051 bool directDraw = fRenderTarget->isMultisampled() || !paint.isAntiAlias(); | |
1052 if (!directDraw) { | |
1053 // if src and dst are pixel aligned we can still draw directly | |
1054 if (fContext->getMatrix().rectStaysRect()) { | |
1055 SkRect rect; | |
1056 fContext->getMatrix().mapRect(&rect, srcRect); | |
bsalomon
2014/10/22 18:47:03
Why does it matter if the src rect is aligned?
Al
| |
1057 const SkScalar *scalars = rect.asScalars(); | |
1058 bool isSrcPixelAligned = true; | |
1059 for (int i = 0; i < 4; i++) { | |
1060 if (!SkScalarIsInt(scalars[i])) { | |
1061 isSrcPixelAligned = false; | |
1062 break; | |
1063 } | |
1064 } | |
1065 | |
1066 if (isSrcPixelAligned) | |
1067 directDraw = SkScalarIsInt(dstSize.fWidth) && | |
1068 SkScalarIsInt(dstSize.fHeight); | |
1069 } | |
1070 } | |
1071 | |
1072 if (paint.getMaskFilter() || !directDraw) { | |
1050 // Convert the bitmap to a shader so that the rect can be drawn | 1073 // Convert the bitmap to a shader so that the rect can be drawn |
1051 // through drawRect, which supports mask filters. | 1074 // through drawRect, which supports mask filters and anti-aliasing |
1075 // without an msaa target. | |
1052 SkBitmap tmp; // subset of bitmap, if necessary | 1076 SkBitmap tmp; // subset of bitmap, if necessary |
1053 const SkBitmap* bitmapPtr = &bitmap; | 1077 const SkBitmap* bitmapPtr = &bitmap; |
1054 SkMatrix localM; | 1078 SkMatrix localM; |
1055 if (srcRectPtr) { | 1079 if (srcRectPtr) { |
1056 localM.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop); | 1080 localM.setTranslate(-srcRectPtr->fLeft, -srcRectPtr->fTop); |
1057 localM.postScale(dstSize.fWidth / srcRectPtr->width(), | 1081 localM.postScale(dstSize.fWidth / srcRectPtr->width(), |
1058 dstSize.fHeight / srcRectPtr->height()); | 1082 dstSize.fHeight / srcRectPtr->height()); |
1059 // In bleed mode we position and trim the bitmap based on the src re ct which is | 1083 // In bleed mode we position and trim the bitmap based on the src re ct which is |
1060 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out | 1084 // already accounted for in 'm' and 'srcRect'. In clamp mode we need to chop out |
1061 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to | 1085 // the desired portion of the bitmap and then update 'm' and 'srcRec t' to |
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1824 GrLayerHoister::UnlockLayers(fContext, atlased, nonAtlased, recycled); | 1848 GrLayerHoister::UnlockLayers(fContext, atlased, nonAtlased, recycled); |
1825 | 1849 |
1826 return true; | 1850 return true; |
1827 } | 1851 } |
1828 | 1852 |
1829 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1853 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
1830 // We always return a transient cache, so it is freed after each | 1854 // We always return a transient cache, so it is freed after each |
1831 // filter traversal. | 1855 // filter traversal. |
1832 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1856 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
1833 } | 1857 } |
OLD | NEW |