| 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
| 10 #include "SkMathPriv.h" | 10 #include "SkMathPriv.h" |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // Can't use canvas->peekPixels(), as we are trying to look at GPU pixels so
metimes as well. | 193 // Can't use canvas->peekPixels(), as we are trying to look at GPU pixels so
metimes as well. |
| 194 // At some point this will be unsupported, as we won't allow accessBitmap()
to magically call | 194 // At some point this will be unsupported, as we won't allow accessBitmap()
to magically call |
| 195 // readPixels for the client. | 195 // readPixels for the client. |
| 196 SkBitmap secretDevBitmap; | 196 SkBitmap secretDevBitmap; |
| 197 canvas->readPixels(canvasInfo.bounds(), &secretDevBitmap); | 197 canvas->readPixels(canvasInfo.bounds(), &secretDevBitmap); |
| 198 | 198 |
| 199 SkAutoLockPixels alp(secretDevBitmap); | 199 SkAutoLockPixels alp(secretDevBitmap); |
| 200 canvasRowBytes = secretDevBitmap.rowBytes(); | 200 canvasRowBytes = secretDevBitmap.rowBytes(); |
| 201 canvasPixels = static_cast<const uint32_t*>(secretDevBitmap.getPixels()); | 201 canvasPixels = static_cast<const uint32_t*>(secretDevBitmap.getPixels()); |
| 202 | 202 |
| 203 if (NULL == canvasPixels) { | 203 if (nullptr == canvasPixels) { |
| 204 return false; | 204 return false; |
| 205 } | 205 } |
| 206 | 206 |
| 207 if (canvasInfo.width() != DEV_W || | 207 if (canvasInfo.width() != DEV_W || |
| 208 canvasInfo.height() != DEV_H || | 208 canvasInfo.height() != DEV_H || |
| 209 canvasInfo.colorType() != kN32_SkColorType) { | 209 canvasInfo.colorType() != kN32_SkColorType) { |
| 210 return false; | 210 return false; |
| 211 } | 211 } |
| 212 | 212 |
| 213 const SkImageInfo bmInfo = bitmap.info(); | 213 const SkImageInfo bmInfo = bitmap.info(); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 #include "SkMallocPixelRef.h" | 279 #include "SkMallocPixelRef.h" |
| 280 | 280 |
| 281 // This is a tricky pattern, because we have to setConfig+rowBytes AND specify | 281 // This is a tricky pattern, because we have to setConfig+rowBytes AND specify |
| 282 // a custom pixelRef (which also has to specify its rowBytes), so we have to be | 282 // a custom pixelRef (which also has to specify its rowBytes), so we have to be |
| 283 // sure that the two rowBytes match (and the infos match). | 283 // sure that the two rowBytes match (and the infos match). |
| 284 // | 284 // |
| 285 static bool alloc_row_bytes(SkBitmap* bm, const SkImageInfo& info, size_t rowByt
es) { | 285 static bool alloc_row_bytes(SkBitmap* bm, const SkImageInfo& info, size_t rowByt
es) { |
| 286 if (!bm->setInfo(info, rowBytes)) { | 286 if (!bm->setInfo(info, rowBytes)) { |
| 287 return false; | 287 return false; |
| 288 } | 288 } |
| 289 SkPixelRef* pr = SkMallocPixelRef::NewAllocate(info, rowBytes, NULL); | 289 SkPixelRef* pr = SkMallocPixelRef::NewAllocate(info, rowBytes, nullptr); |
| 290 bm->setPixelRef(pr)->unref(); | 290 bm->setPixelRef(pr)->unref(); |
| 291 return true; | 291 return true; |
| 292 } | 292 } |
| 293 | 293 |
| 294 static void free_pixels(void* pixels, void* ctx) { | 294 static void free_pixels(void* pixels, void* ctx) { |
| 295 sk_free(pixels); | 295 sk_free(pixels); |
| 296 } | 296 } |
| 297 | 297 |
| 298 static SkSurface* create_surface(const CanvasConfig& c, GrContext* grCtx) { | 298 static SkSurface* create_surface(const CanvasConfig& c, GrContext* grCtx) { |
| 299 SkImageInfo info = SkImageInfo::MakeN32Premul(DEV_W, DEV_H); | 299 SkImageInfo info = SkImageInfo::MakeN32Premul(DEV_W, DEV_H); |
| 300 switch (c.fDevType) { | 300 switch (c.fDevType) { |
| 301 case kRaster_DevType: { | 301 case kRaster_DevType: { |
| 302 const size_t rowBytes = c.fTightRowBytes ? info.minRowBytes() : 4 *
DEV_W + 100; | 302 const size_t rowBytes = c.fTightRowBytes ? info.minRowBytes() : 4 *
DEV_W + 100; |
| 303 const size_t size = info.getSafeSize(rowBytes); | 303 const size_t size = info.getSafeSize(rowBytes); |
| 304 void* pixels = sk_malloc_throw(size); | 304 void* pixels = sk_malloc_throw(size); |
| 305 // if rowBytes isn't tight then set the padding to a known value | 305 // if rowBytes isn't tight then set the padding to a known value |
| 306 if (!c.fTightRowBytes) { | 306 if (!c.fTightRowBytes) { |
| 307 memset(pixels, DEV_PAD, size); | 307 memset(pixels, DEV_PAD, size); |
| 308 } | 308 } |
| 309 return SkSurface::NewRasterDirectReleaseProc(info, pixels, rowBytes,
free_pixels, NULL); | 309 return SkSurface::NewRasterDirectReleaseProc(info, pixels, rowBytes,
free_pixels, nullptr); |
| 310 } | 310 } |
| 311 #if SK_SUPPORT_GPU | 311 #if SK_SUPPORT_GPU |
| 312 case kGpu_BottomLeft_DevType: | 312 case kGpu_BottomLeft_DevType: |
| 313 case kGpu_TopLeft_DevType: | 313 case kGpu_TopLeft_DevType: |
| 314 GrSurfaceDesc desc; | 314 GrSurfaceDesc desc; |
| 315 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 315 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 316 desc.fWidth = DEV_W; | 316 desc.fWidth = DEV_W; |
| 317 desc.fHeight = DEV_H; | 317 desc.fHeight = DEV_H; |
| 318 desc.fConfig = kSkia8888_GrPixelConfig; | 318 desc.fConfig = kSkia8888_GrPixelConfig; |
| 319 desc.fOrigin = kGpu_TopLeft_DevType == c.fDevType ? | 319 desc.fOrigin = kGpu_TopLeft_DevType == c.fDevType ? |
| 320 kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin; | 320 kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin; |
| 321 SkAutoTUnref<GrTexture> texture(grCtx->textureProvider()->createText
ure(desc, false)); | 321 SkAutoTUnref<GrTexture> texture(grCtx->textureProvider()->createText
ure(desc, false)); |
| 322 return SkSurface::NewRenderTargetDirect(texture->asRenderTarget()); | 322 return SkSurface::NewRenderTargetDirect(texture->asRenderTarget()); |
| 323 #endif | 323 #endif |
| 324 } | 324 } |
| 325 return NULL; | 325 return nullptr; |
| 326 } | 326 } |
| 327 | 327 |
| 328 static bool setup_bitmap(SkBitmap* bm, SkColorType ct, SkAlphaType at, int w, in
t h, int tightRB) { | 328 static bool setup_bitmap(SkBitmap* bm, SkColorType ct, SkAlphaType at, int w, in
t h, int tightRB) { |
| 329 size_t rowBytes = tightRB ? 0 : 4 * w + 60; | 329 size_t rowBytes = tightRB ? 0 : 4 * w + 60; |
| 330 SkImageInfo info = SkImageInfo::Make(w, h, ct, at); | 330 SkImageInfo info = SkImageInfo::Make(w, h, ct, at); |
| 331 if (!alloc_row_bytes(bm, info, rowBytes)) { | 331 if (!alloc_row_bytes(bm, info, rowBytes)) { |
| 332 return false; | 332 return false; |
| 333 } | 333 } |
| 334 SkAutoLockPixels alp(*bm); | 334 SkAutoLockPixels alp(*bm); |
| 335 for (int y = 0; y < h; ++y) { | 335 for (int y = 0; y < h; ++y) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 for (size_t i = 0; i < SK_ARRAY_COUNT(gCanvasConfigs); ++i) { | 410 for (size_t i = 0; i < SK_ARRAY_COUNT(gCanvasConfigs); ++i) { |
| 411 int glCtxTypeCnt = 1; | 411 int glCtxTypeCnt = 1; |
| 412 #if SK_SUPPORT_GPU | 412 #if SK_SUPPORT_GPU |
| 413 bool isGPUDevice = kGpu_TopLeft_DevType == gCanvasConfigs[i].fDevType || | 413 bool isGPUDevice = kGpu_TopLeft_DevType == gCanvasConfigs[i].fDevType || |
| 414 kGpu_BottomLeft_DevType == gCanvasConfigs[i].fDevType
; | 414 kGpu_BottomLeft_DevType == gCanvasConfigs[i].fDevType
; |
| 415 if (isGPUDevice) { | 415 if (isGPUDevice) { |
| 416 glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; | 416 glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; |
| 417 } | 417 } |
| 418 #endif | 418 #endif |
| 419 for (int glCtxType = 0; glCtxType < glCtxTypeCnt; ++glCtxType) { | 419 for (int glCtxType = 0; glCtxType < glCtxTypeCnt; ++glCtxType) { |
| 420 GrContext* context = NULL; | 420 GrContext* context = nullptr; |
| 421 #if SK_SUPPORT_GPU | 421 #if SK_SUPPORT_GPU |
| 422 if (isGPUDevice) { | 422 if (isGPUDevice) { |
| 423 GrContextFactory::GLContextType type = | 423 GrContextFactory::GLContextType type = |
| 424 static_cast<GrContextFactory::GLContextType>(glCtxType); | 424 static_cast<GrContextFactory::GLContextType>(glCtxType); |
| 425 if (!GrContextFactory::IsRenderingGLContext(type)) { | 425 if (!GrContextFactory::IsRenderingGLContext(type)) { |
| 426 continue; | 426 continue; |
| 427 } | 427 } |
| 428 context = factory->get(type); | 428 context = factory->get(type); |
| 429 if (NULL == context) { | 429 if (nullptr == context) { |
| 430 continue; | 430 continue; |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 #endif | 433 #endif |
| 434 | 434 |
| 435 SkAutoTUnref<SkSurface> surface(create_surface(gCanvasConfigs[i], co
ntext)); | 435 SkAutoTUnref<SkSurface> surface(create_surface(gCanvasConfigs[i], co
ntext)); |
| 436 SkCanvas& canvas = *surface->getCanvas(); | 436 SkCanvas& canvas = *surface->getCanvas(); |
| 437 | 437 |
| 438 static const struct { | 438 static const struct { |
| 439 SkColorType fColorType; | 439 SkColorType fColorType; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 469 SkIRect writeRect = SkIRect::MakeXYWH(rect.fLeft, rect.f
Top, | 469 SkIRect writeRect = SkIRect::MakeXYWH(rect.fLeft, rect.f
Top, |
| 470 bmp.width(), bmp.h
eight()); | 470 bmp.width(), bmp.h
eight()); |
| 471 bool intersects = SkIRect::Intersects(canvasRect, writeR
ect) ; | 471 bool intersects = SkIRect::Intersects(canvasRect, writeR
ect) ; |
| 472 REPORTER_ASSERT(reporter, intersects == (idBefore != idA
fter)); | 472 REPORTER_ASSERT(reporter, intersects == (idBefore != idA
fter)); |
| 473 } | 473 } |
| 474 } | 474 } |
| 475 } | 475 } |
| 476 } | 476 } |
| 477 } | 477 } |
| 478 } | 478 } |
| OLD | NEW |