| 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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 fRenderTarget->ref(); | 207 fRenderTarget->ref(); |
| 208 | 208 |
| 209 // Hold onto to the texture in the pixel ref (if there is one) because the t
exture holds a ref | 209 // Hold onto to the texture in the pixel ref (if there is one) because the t
exture holds a ref |
| 210 // on the RT but not vice-versa. | 210 // on the RT but not vice-versa. |
| 211 // TODO: Remove this trickery once we figure out how to make SkGrPixelRef do
this without | 211 // TODO: Remove this trickery once we figure out how to make SkGrPixelRef do
this without |
| 212 // busting chrome (for a currently unknown reason). | 212 // busting chrome (for a currently unknown reason). |
| 213 GrSurface* surface = fRenderTarget->asTexture(); | 213 GrSurface* surface = fRenderTarget->asTexture(); |
| 214 if (NULL == surface) { | 214 if (NULL == surface) { |
| 215 surface = fRenderTarget; | 215 surface = fRenderTarget; |
| 216 } | 216 } |
| 217 | 217 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (surface, cached)); |
| 218 SkImageInfo info; | |
| 219 surface->asImageInfo(&info); | |
| 220 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, surface, cached)); | |
| 221 | 218 |
| 222 this->setPixelRef(pr, 0)->unref(); | 219 this->setPixelRef(pr, 0)->unref(); |
| 223 } | 220 } |
| 224 | 221 |
| 225 SkGpuDevice::SkGpuDevice(GrContext* context, | 222 SkGpuDevice::SkGpuDevice(GrContext* context, |
| 226 SkBitmap::Config config, | 223 SkBitmap::Config config, |
| 227 int width, | 224 int width, |
| 228 int height, | 225 int height, |
| 229 int sampleCount) | 226 int sampleCount) |
| 230 : SkBitmapDevice(make_bitmap(config, width, height, false /*isOpaque*/)) | 227 : SkBitmapDevice(make_bitmap(config, width, height, false /*isOpaque*/)) { |
| 231 { | 228 |
| 232 fDrawProcs = NULL; | 229 fDrawProcs = NULL; |
| 233 | 230 |
| 234 fContext = context; | 231 fContext = context; |
| 235 fContext->ref(); | 232 fContext->ref(); |
| 236 | 233 |
| 237 fRenderTarget = NULL; | 234 fRenderTarget = NULL; |
| 238 fNeedClear = false; | 235 fNeedClear = false; |
| 239 | 236 |
| 240 if (config != SkBitmap::kRGB_565_Config) { | 237 if (config != SkBitmap::kRGB_565_Config) { |
| 241 config = SkBitmap::kARGB_8888_Config; | 238 config = SkBitmap::kARGB_8888_Config; |
| 242 } | 239 } |
| 243 | 240 |
| 244 GrTextureDesc desc; | 241 GrTextureDesc desc; |
| 245 desc.fFlags = kRenderTarget_GrTextureFlagBit; | 242 desc.fFlags = kRenderTarget_GrTextureFlagBit; |
| 246 desc.fWidth = width; | 243 desc.fWidth = width; |
| 247 desc.fHeight = height; | 244 desc.fHeight = height; |
| 248 desc.fConfig = SkBitmapConfig2GrPixelConfig(config); | 245 desc.fConfig = SkBitmapConfig2GrPixelConfig(config); |
| 249 desc.fSampleCnt = sampleCount; | 246 desc.fSampleCnt = sampleCount; |
| 250 | 247 |
| 251 SkImageInfo info; | |
| 252 if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) { | |
| 253 sk_throw(); | |
| 254 } | |
| 255 info.fWidth = width; | |
| 256 info.fHeight = height; | |
| 257 info.fAlphaType = kPremul_SkAlphaType; | |
| 258 | |
| 259 SkAutoTUnref<GrTexture> texture(fContext->createUncachedTexture(desc, NULL,
0)); | 248 SkAutoTUnref<GrTexture> texture(fContext->createUncachedTexture(desc, NULL,
0)); |
| 260 | 249 |
| 261 if (NULL != texture) { | 250 if (NULL != texture) { |
| 262 fRenderTarget = texture->asRenderTarget(); | 251 fRenderTarget = texture->asRenderTarget(); |
| 263 fRenderTarget->ref(); | 252 fRenderTarget->ref(); |
| 264 | 253 |
| 265 SkASSERT(NULL != fRenderTarget); | 254 SkASSERT(NULL != fRenderTarget); |
| 266 | 255 |
| 267 // wrap the bitmap with a pixelref to expose our texture | 256 // wrap the bitmap with a pixelref to expose our texture |
| 268 SkGrPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, texture)); | 257 SkGrPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (texture)); |
| 269 this->setPixelRef(pr, 0)->unref(); | 258 this->setPixelRef(pr, 0)->unref(); |
| 270 } else { | 259 } else { |
| 271 GrPrintf("--- failed to create gpu-offscreen [%d %d]\n", | 260 GrPrintf("--- failed to create gpu-offscreen [%d %d]\n", |
| 272 width, height); | 261 width, height); |
| 273 SkASSERT(false); | 262 SkASSERT(false); |
| 274 } | 263 } |
| 275 } | 264 } |
| 276 | 265 |
| 277 SkGpuDevice::~SkGpuDevice() { | 266 SkGpuDevice::~SkGpuDevice() { |
| 278 if (fDrawProcs) { | 267 if (fDrawProcs) { |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 | 833 |
| 845 // Draw the mask into maskTexture with the path's top-left at the origin usi
ng tempPaint. | 834 // Draw the mask into maskTexture with the path's top-left at the origin usi
ng tempPaint. |
| 846 SkMatrix translate; | 835 SkMatrix translate; |
| 847 translate.setTranslate(-maskRect.fLeft, -maskRect.fTop); | 836 translate.setTranslate(-maskRect.fLeft, -maskRect.fTop); |
| 848 am.set(context, translate); | 837 am.set(context, translate); |
| 849 context->drawPath(tempPaint, devPath, stroke); | 838 context->drawPath(tempPaint, devPath, stroke); |
| 850 return true; | 839 return true; |
| 851 } | 840 } |
| 852 | 841 |
| 853 SkBitmap wrap_texture(GrTexture* texture) { | 842 SkBitmap wrap_texture(GrTexture* texture) { |
| 854 SkImageInfo info; | |
| 855 texture->asImageInfo(&info); | |
| 856 | |
| 857 SkBitmap result; | 843 SkBitmap result; |
| 858 result.setConfig(info); | 844 bool dummy; |
| 859 result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); | 845 SkBitmap::Config config = grConfig2skConfig(texture->config(), &dummy); |
| 846 result.setConfig(config, texture->width(), texture->height()); |
| 847 result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (texture)))->unref(); |
| 860 return result; | 848 return result; |
| 861 } | 849 } |
| 862 | 850 |
| 863 }; | 851 }; |
| 864 | 852 |
| 865 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, | 853 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
| 866 const SkPaint& paint, const SkMatrix* prePathMatrix, | 854 const SkPaint& paint, const SkMatrix* prePathMatrix, |
| 867 bool pathIsMutable) { | 855 bool pathIsMutable) { |
| 868 CHECK_FOR_ANNOTATION(paint); | 856 CHECK_FOR_ANNOTATION(paint); |
| 869 CHECK_SHOULD_DRAW(draw, false); | 857 CHECK_SHOULD_DRAW(draw, false); |
| (...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 GrTexture* texture, | 1900 GrTexture* texture, |
| 1913 bool needClear) | 1901 bool needClear) |
| 1914 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { | 1902 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { |
| 1915 | 1903 |
| 1916 SkASSERT(texture && texture->asRenderTarget()); | 1904 SkASSERT(texture && texture->asRenderTarget()); |
| 1917 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture | 1905 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture |
| 1918 // cache. We pass true for the third argument so that it will get unlocked. | 1906 // cache. We pass true for the third argument so that it will get unlocked. |
| 1919 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 1907 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
| 1920 fNeedClear = needClear; | 1908 fNeedClear = needClear; |
| 1921 } | 1909 } |
| OLD | NEW |