DeviceTest.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. #include "include/core/SkBitmap.h"
  8. #include "include/core/SkImage.h"
  9. #include "include/core/SkImageInfo.h"
  10. #include "include/core/SkRect.h"
  11. #include "include/core/SkRefCnt.h"
  12. #include "include/core/SkTypes.h"
  13. #include "include/gpu/GrTypes.h"
  14. #include "src/core/SkDevice.h"
  15. #include "src/core/SkSpecialImage.h"
  16. #include "src/gpu/SkGpuDevice.h"
  17. #include "tests/Test.h"
  18. #include "tools/gpu/GrContextFactory.h"
  19. class SkColorSpace;
  20. class GrContext;
  21. class DeviceTestingAccess {
  22. public:
  23. static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, const SkBitmap& bm) {
  24. return dev->makeSpecial(bm);
  25. }
  26. static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, SkImage* img) {
  27. return dev->makeSpecial(img);
  28. }
  29. static sk_sp<SkSpecialImage> SnapSpecial(SkBaseDevice* dev) {
  30. return dev->snapSpecial();
  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. SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
  39. sk_sp<SkBaseDevice> bmDev(SkBitmapDevice::Create(ii));
  40. SkBitmap bm;
  41. bm.tryAllocN32Pixels(kWidth, kHeight);
  42. // Create a raster-backed special image from a raster-backed SkBitmap
  43. sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(bmDev.get(), bm);
  44. SkASSERT(!special->isTextureBacked());
  45. SkASSERT(kWidth == special->width());
  46. SkASSERT(kHeight == special->height());
  47. SkASSERT(bm.getGenerationID() == special->uniqueID());
  48. SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
  49. // Create a raster-backed special image from a raster-backed SkImage
  50. sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
  51. special = DeviceTestingAccess::MakeSpecial(bmDev.get(), image.get());
  52. SkASSERT(!special->isTextureBacked());
  53. SkASSERT(kWidth == special->width());
  54. SkASSERT(kHeight == special->height());
  55. SkASSERT(bm.getGenerationID() == special->uniqueID());
  56. SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
  57. // Snap the device as a raster-backed special image
  58. special = DeviceTestingAccess::SnapSpecial(bmDev.get());
  59. SkASSERT(!special->isTextureBacked());
  60. SkASSERT(2*kWidth == special->width());
  61. SkASSERT(2*kHeight == special->height());
  62. SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
  63. }
  64. #endif
  65. DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SpecialImage_GPUDevice, reporter, ctxInfo) {
  66. GrContext* context = ctxInfo.grContext();
  67. static const int kWidth = 100;
  68. static const int kHeight = 90;
  69. SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
  70. sk_sp<SkBaseDevice> gpuDev(SkGpuDevice::Make(context, SkBudgeted::kNo, ii,
  71. 1, kBottomLeft_GrSurfaceOrigin, nullptr,
  72. GrMipMapped::kNo,
  73. SkGpuDevice::kClear_InitContents));
  74. SkBitmap bm;
  75. SkAssertResult(bm.tryAllocN32Pixels(kWidth, kHeight));
  76. // Create a gpu-backed special image from a raster-backed SkBitmap
  77. sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), bm);
  78. SkASSERT(special->isTextureBacked());
  79. SkASSERT(kWidth == special->width());
  80. SkASSERT(kHeight == special->height());
  81. SkASSERT(bm.getGenerationID() == special->uniqueID());
  82. SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
  83. // Create a gpu-backed special image from a raster-backed SkImage
  84. sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
  85. special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
  86. SkASSERT(special->isTextureBacked());
  87. SkASSERT(kWidth == special->width());
  88. SkASSERT(kHeight == special->height());
  89. // TODO: Hmmm, this is a bit unexpected
  90. SkASSERT(image->uniqueID() != special->uniqueID());
  91. SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
  92. // Create a gpu-backed special image from a gpu-backed SkImage
  93. SkColorSpace* legacyColorSpace = nullptr;
  94. image = image->makeTextureImage(context, legacyColorSpace);
  95. special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
  96. SkASSERT(special->isTextureBacked());
  97. SkASSERT(kWidth == special->width());
  98. SkASSERT(kHeight == special->height());
  99. SkASSERT(image->uniqueID() == special->uniqueID());
  100. SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
  101. // Snap the device as a gpu-backed special image
  102. special = DeviceTestingAccess::SnapSpecial(gpuDev.get());
  103. SkASSERT(special->isTextureBacked());
  104. SkASSERT(2*kWidth == special->width());
  105. SkASSERT(2*kHeight == special->height());
  106. SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
  107. }