| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 fRenderTarget->ref(); | 193 fRenderTarget->ref(); |
| 194 | 194 |
| 195 // Hold onto to the texture in the pixel ref (if there is one) because the t
exture holds a ref | 195 // Hold onto to the texture in the pixel ref (if there is one) because the t
exture holds a ref |
| 196 // on the RT but not vice-versa. | 196 // on the RT but not vice-versa. |
| 197 // TODO: Remove this trickery once we figure out how to make SkGrPixelRef do
this without | 197 // TODO: Remove this trickery once we figure out how to make SkGrPixelRef do
this without |
| 198 // busting chrome (for a currently unknown reason). | 198 // busting chrome (for a currently unknown reason). |
| 199 GrSurface* surface = fRenderTarget->asTexture(); | 199 GrSurface* surface = fRenderTarget->asTexture(); |
| 200 if (NULL == surface) { | 200 if (NULL == surface) { |
| 201 surface = fRenderTarget; | 201 surface = fRenderTarget; |
| 202 } | 202 } |
| 203 | 203 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (surface, cached)); |
| 204 SkImageInfo info; | |
| 205 surface->asImageInfo(&info); | |
| 206 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, surface, cached)); | |
| 207 | 204 |
| 208 this->setPixelRef(pr, 0)->unref(); | 205 this->setPixelRef(pr, 0)->unref(); |
| 209 } | 206 } |
| 210 | 207 |
| 211 SkGpuDevice::SkGpuDevice(GrContext* context, | 208 SkGpuDevice::SkGpuDevice(GrContext* context, |
| 212 SkBitmap::Config config, | 209 SkBitmap::Config config, |
| 213 int width, | 210 int width, |
| 214 int height, | 211 int height, |
| 215 int sampleCount) | 212 int sampleCount) |
| 216 : SkBitmapDevice(config, width, height, false /*isOpaque*/) | 213 : SkBitmapDevice(config, width, height, false /*isOpaque*/) { |
| 217 { | 214 |
| 218 fDrawProcs = NULL; | 215 fDrawProcs = NULL; |
| 219 | 216 |
| 220 fContext = context; | 217 fContext = context; |
| 221 fContext->ref(); | 218 fContext->ref(); |
| 222 | 219 |
| 223 fRenderTarget = NULL; | 220 fRenderTarget = NULL; |
| 224 fNeedClear = false; | 221 fNeedClear = false; |
| 225 | 222 |
| 226 if (config != SkBitmap::kRGB_565_Config) { | 223 if (config != SkBitmap::kRGB_565_Config) { |
| 227 config = SkBitmap::kARGB_8888_Config; | 224 config = SkBitmap::kARGB_8888_Config; |
| 228 } | 225 } |
| 229 | 226 |
| 230 GrTextureDesc desc; | 227 GrTextureDesc desc; |
| 231 desc.fFlags = kRenderTarget_GrTextureFlagBit; | 228 desc.fFlags = kRenderTarget_GrTextureFlagBit; |
| 232 desc.fWidth = width; | 229 desc.fWidth = width; |
| 233 desc.fHeight = height; | 230 desc.fHeight = height; |
| 234 desc.fConfig = SkBitmapConfig2GrPixelConfig(config); | 231 desc.fConfig = SkBitmapConfig2GrPixelConfig(config); |
| 235 desc.fSampleCnt = sampleCount; | 232 desc.fSampleCnt = sampleCount; |
| 236 | 233 |
| 237 SkImageInfo info; | |
| 238 if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) { | |
| 239 sk_throw(); | |
| 240 } | |
| 241 info.fWidth = width; | |
| 242 info.fHeight = height; | |
| 243 info.fAlphaType = kPremul_SkAlphaType; | |
| 244 | |
| 245 SkAutoTUnref<GrTexture> texture(fContext->createUncachedTexture(desc, NULL,
0)); | 234 SkAutoTUnref<GrTexture> texture(fContext->createUncachedTexture(desc, NULL,
0)); |
| 246 | 235 |
| 247 if (NULL != texture) { | 236 if (NULL != texture) { |
| 248 fRenderTarget = texture->asRenderTarget(); | 237 fRenderTarget = texture->asRenderTarget(); |
| 249 fRenderTarget->ref(); | 238 fRenderTarget->ref(); |
| 250 | 239 |
| 251 SkASSERT(NULL != fRenderTarget); | 240 SkASSERT(NULL != fRenderTarget); |
| 252 | 241 |
| 253 // wrap the bitmap with a pixelref to expose our texture | 242 // wrap the bitmap with a pixelref to expose our texture |
| 254 SkGrPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, texture)); | 243 SkGrPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (texture)); |
| 255 this->setPixelRef(pr, 0)->unref(); | 244 this->setPixelRef(pr, 0)->unref(); |
| 256 } else { | 245 } else { |
| 257 GrPrintf("--- failed to create gpu-offscreen [%d %d]\n", | 246 GrPrintf("--- failed to create gpu-offscreen [%d %d]\n", |
| 258 width, height); | 247 width, height); |
| 259 SkASSERT(false); | 248 SkASSERT(false); |
| 260 } | 249 } |
| 261 } | 250 } |
| 262 | 251 |
| 263 SkGpuDevice::~SkGpuDevice() { | 252 SkGpuDevice::~SkGpuDevice() { |
| 264 if (fDrawProcs) { | 253 if (fDrawProcs) { |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 | 819 |
| 831 // Draw the mask into maskTexture with the path's top-left at the origin usi
ng tempPaint. | 820 // Draw the mask into maskTexture with the path's top-left at the origin usi
ng tempPaint. |
| 832 SkMatrix translate; | 821 SkMatrix translate; |
| 833 translate.setTranslate(-maskRect.fLeft, -maskRect.fTop); | 822 translate.setTranslate(-maskRect.fLeft, -maskRect.fTop); |
| 834 am.set(context, translate); | 823 am.set(context, translate); |
| 835 context->drawPath(tempPaint, devPath, stroke); | 824 context->drawPath(tempPaint, devPath, stroke); |
| 836 return true; | 825 return true; |
| 837 } | 826 } |
| 838 | 827 |
| 839 SkBitmap wrap_texture(GrTexture* texture) { | 828 SkBitmap wrap_texture(GrTexture* texture) { |
| 840 SkImageInfo info; | |
| 841 texture->asImageInfo(&info); | |
| 842 | |
| 843 SkBitmap result; | 829 SkBitmap result; |
| 844 result.setConfig(info); | 830 bool dummy; |
| 845 result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); | 831 SkBitmap::Config config = grConfig2skConfig(texture->config(), &dummy); |
| 832 result.setConfig(config, texture->width(), texture->height()); |
| 833 result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (texture)))->unref(); |
| 846 return result; | 834 return result; |
| 847 } | 835 } |
| 848 | 836 |
| 849 }; | 837 }; |
| 850 | 838 |
| 851 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, | 839 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
| 852 const SkPaint& paint, const SkMatrix* prePathMatrix, | 840 const SkPaint& paint, const SkMatrix* prePathMatrix, |
| 853 bool pathIsMutable) { | 841 bool pathIsMutable) { |
| 854 CHECK_FOR_ANNOTATION(paint); | 842 CHECK_FOR_ANNOTATION(paint); |
| 855 CHECK_SHOULD_DRAW(draw, false); | 843 CHECK_SHOULD_DRAW(draw, false); |
| (...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1893 GrTexture* texture, | 1881 GrTexture* texture, |
| 1894 bool needClear) | 1882 bool needClear) |
| 1895 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { | 1883 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { |
| 1896 | 1884 |
| 1897 SkASSERT(texture && texture->asRenderTarget()); | 1885 SkASSERT(texture && texture->asRenderTarget()); |
| 1898 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture | 1886 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture |
| 1899 // cache. We pass true for the third argument so that it will get unlocked. | 1887 // cache. We pass true for the third argument so that it will get unlocked. |
| 1900 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 1888 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
| 1901 fNeedClear = needClear; | 1889 fNeedClear = needClear; |
| 1902 } | 1890 } |
| OLD | NEW |