virtual void onDrawContent(SkCanvas* canvas) { SkBitmap bitmap; create_bitmap(&bitmap); int x = bitmap.width() / 2; int y = bitmap.height() / 2; SkBitmap subset; bitmap.extractSubset(&subset, SkIRect::MakeXYWH(x, y, x, y)); canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); canvas->drawBitmap(bitmap, 0, 0); canvas->drawBitmap(subset, 0, 0); // Now do the same but with a device bitmap as source image SkRefPtr<SkDevice> primaryDevice(canvas->getDevice()); SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice( SkBitmap::kARGB_8888_Config, bitmap.width(), bitmap.height(), true)); secondDevice->unref(); SkCanvas secondCanvas(secondDevice.get()); secondCanvas.writePixels(bitmap, 0, 0); SkBitmap deviceBitmap = secondDevice->accessBitmap(false); SkBitmap deviceSubset; deviceBitmap.extractSubset(&deviceSubset, SkIRect::MakeXYWH(x, y, x, y)); canvas->translate(SkIntToScalar(120), SkIntToScalar(0)); canvas->drawBitmap(deviceBitmap, 0, 0); canvas->drawBitmap(deviceSubset, 0, 0); }
virtual void onDrawContent(SkCanvas* canvas) { SkIRect srcRect; SkRect dstRect; SkPaint paint; paint.setFilterBitmap(true); // Test that bitmap draws from malloc-backed bitmaps respect // the constrained texture domain. srcRect.setXYWH(1, 1, 3, 3); dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f); canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint); // Test that bitmap draws across separate devices also respect // the constrainted texture domain. // Note: GPU-backed bitmaps follow a different rendering path // when copying from one GPU device to another. SkAutoTUnref<SkDevice> secondDevice(canvas->createCompatibleDevice( SkBitmap::kARGB_8888_Config, 5, 5, true)); SkCanvas secondCanvas(secondDevice.get()); srcRect.setXYWH(1, 1, 3, 3); dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f); secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint); SkBitmap deviceBitmap = secondDevice->accessBitmap(false); srcRect.setXYWH(1, 1, 3, 3); dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f); canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); // Test that bitmap blurring using a subrect // renders correctly srcRect.setXYWH(1, 1, 3, 3); dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f); SkMaskFilter* mf = SkBlurMaskFilter::Create( 5, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag | SkBlurMaskFilter::kIgnoreTransform_BlurFlag); paint.setMaskFilter(mf)->unref(); canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); // Blur and a rotation + NULL src rect // This should not trigger the texture domain code // but it will test a code path in SkGpuDevice::drawBitmap // that handles blurs with rects transformed to non- // orthogonal rects. It also tests the NULL src rect handling mf = SkBlurMaskFilter::Create( 5, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag); paint.setMaskFilter(mf)->unref(); dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f); canvas->translate(550, 550); canvas->rotate(45); canvas->drawBitmapRect(fBM, NULL, dstRect, &paint); }