예제 #1
0
        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);

            }
예제 #2
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);
    }