Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2016 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkBitmapDevice.h"
      9 #include "SkDevice.h"
     10 #include "SkSpecialImage.h"
     11 
     12 #if SK_SUPPORT_GPU
     13 #include "SkGpuDevice.h"
     14 #endif
     15 
     16 #include "Test.h"
     17 
     18 class DeviceTestingAccess {
     19 public:
     20     static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, const SkBitmap& bm) {
     21         return dev->makeSpecial(bm);
     22     }
     23 
     24     static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, SkImage* img) {
     25         return dev->makeSpecial(img);
     26     }
     27 
     28     static sk_sp<SkSpecialImage> SnapSpecial(SkBaseDevice* dev) {
     29         return dev->snapSpecial();
     30     }
     31 };
     32 
     33 // TODO: re-enable this when Raster methods are implemented
     34 #if 0
     35 DEF_TEST(SpecialImage_BitmapDevice, reporter) {
     36     static const int kWidth = 100;
     37     static const int kHeight = 90;
     38 
     39     SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
     40 
     41     sk_sp<SkBaseDevice> bmDev(SkBitmapDevice::Create(ii));
     42 
     43     SkBitmap bm;
     44     bm.tryAllocN32Pixels(kWidth, kHeight);
     45 
     46     // Create a raster-backed special image from a raster-backed SkBitmap
     47     sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(bmDev.get(), bm);
     48     SkASSERT(!special->isTextureBacked());
     49     SkASSERT(kWidth == special->width());
     50     SkASSERT(kHeight == special->height());
     51     SkASSERT(bm.getGenerationID() == special->uniqueID());
     52     SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
     53 
     54     // Create a raster-backed special image from a raster-backed SkImage
     55     sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
     56     special = DeviceTestingAccess::MakeSpecial(bmDev.get(), image.get());
     57     SkASSERT(!special->isTextureBacked());
     58     SkASSERT(kWidth == special->width());
     59     SkASSERT(kHeight == special->height());
     60     SkASSERT(bm.getGenerationID() == special->uniqueID());
     61     SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
     62 
     63     // Snap the device as a raster-backed special image
     64     special = DeviceTestingAccess::SnapSpecial(bmDev.get());
     65     SkASSERT(!special->isTextureBacked());
     66     SkASSERT(2*kWidth == special->width());
     67     SkASSERT(2*kHeight == special->height());
     68     SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
     69 }
     70 #endif
     71 
     72 
     73 #if SK_SUPPORT_GPU
     74 
     75 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SpecialImage_GPUDevice, reporter, ctxInfo) {
     76     GrContext* context = ctxInfo.grContext();
     77 
     78     static const int kWidth = 100;
     79     static const int kHeight = 90;
     80 
     81     SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
     82 
     83     sk_sp<SkBaseDevice> gpuDev(SkGpuDevice::Make(context, SkBudgeted::kNo, ii,
     84                                                  0, kBottomLeft_GrSurfaceOrigin, nullptr,
     85                                                  SkGpuDevice::kClear_InitContents));
     86 
     87     SkBitmap bm;
     88     SkAssertResult(bm.tryAllocN32Pixels(kWidth, kHeight));
     89 
     90     // Create a gpu-backed special image from a raster-backed SkBitmap
     91     sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), bm);
     92     SkASSERT(special->isTextureBacked());
     93     SkASSERT(kWidth == special->width());
     94     SkASSERT(kHeight == special->height());
     95     SkASSERT(bm.getGenerationID() == special->uniqueID());
     96     SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
     97 
     98     // Create a gpu-backed special image from a raster-backed SkImage
     99     sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
    100     special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
    101     SkASSERT(special->isTextureBacked());
    102     SkASSERT(kWidth == special->width());
    103     SkASSERT(kHeight == special->height());
    104     // TODO: Hmmm, this is a bit unexpected
    105     SkASSERT(image->uniqueID() != special->uniqueID());
    106     SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
    107 
    108     // Create a gpu-backed special image from a gpu-backed SkImage
    109     SkColorSpace* legacyColorSpace = nullptr;
    110     image = image->makeTextureImage(context, legacyColorSpace);
    111     special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
    112     SkASSERT(special->isTextureBacked());
    113     SkASSERT(kWidth == special->width());
    114     SkASSERT(kHeight == special->height());
    115     SkASSERT(image->uniqueID() == special->uniqueID());
    116     SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
    117 
    118     // Snap the device as a gpu-backed special image
    119     special = DeviceTestingAccess::SnapSpecial(gpuDev.get());
    120     SkASSERT(special->isTextureBacked());
    121     SkASSERT(2*kWidth == special->width());
    122     SkASSERT(2*kHeight == special->height());
    123     SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
    124 }
    125 
    126 #endif
    127