ImageGeneratorTest.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright 2014 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/SkCanvas.h"
  8. #include "include/core/SkData.h"
  9. #include "include/core/SkGraphics.h"
  10. #include "include/core/SkImageGenerator.h"
  11. #include "include/core/SkYUVAIndex.h"
  12. #include "include/private/SkImageInfoPriv.h"
  13. #include "tests/Test.h"
  14. #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
  15. #include "include/ports/SkImageGeneratorCG.h"
  16. #elif defined(SK_BUILD_FOR_WIN)
  17. #include "include/ports/SkImageGeneratorWIC.h"
  18. #endif
  19. static bool gMyFactoryWasCalled;
  20. static std::unique_ptr<SkImageGenerator> my_factory(sk_sp<SkData>) {
  21. gMyFactoryWasCalled = true;
  22. return nullptr;
  23. }
  24. static void test_imagegenerator_factory(skiatest::Reporter* reporter) {
  25. // just need a non-empty data to test things
  26. sk_sp<SkData> data(SkData::MakeWithCString("test_imagegenerator_factory"));
  27. gMyFactoryWasCalled = false;
  28. REPORTER_ASSERT(reporter, !gMyFactoryWasCalled);
  29. std::unique_ptr<SkImageGenerator> gen = SkImageGenerator::MakeFromEncoded(data);
  30. REPORTER_ASSERT(reporter, nullptr == gen);
  31. REPORTER_ASSERT(reporter, !gMyFactoryWasCalled);
  32. // Test is racy, in that it hopes no other thread is changing this global...
  33. auto prev = SkGraphics::SetImageGeneratorFromEncodedDataFactory(my_factory);
  34. gen = SkImageGenerator::MakeFromEncoded(data);
  35. REPORTER_ASSERT(reporter, nullptr == gen);
  36. REPORTER_ASSERT(reporter, gMyFactoryWasCalled);
  37. // This just verifies that the signatures match.
  38. #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
  39. SkGraphics::SetImageGeneratorFromEncodedDataFactory(SkImageGeneratorCG::MakeFromEncodedCG);
  40. #elif defined(SK_BUILD_FOR_WIN)
  41. SkGraphics::SetImageGeneratorFromEncodedDataFactory(SkImageGeneratorWIC::MakeFromEncodedWIC);
  42. #endif
  43. SkGraphics::SetImageGeneratorFromEncodedDataFactory(prev);
  44. }
  45. class MyImageGenerator : public SkImageGenerator {
  46. public:
  47. MyImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
  48. };
  49. DEF_TEST(ImageGenerator, reporter) {
  50. MyImageGenerator ig;
  51. SkYUVASizeInfo sizeInfo;
  52. sizeInfo.fSizes[0] = SkISize::Make(200, 200);
  53. sizeInfo.fSizes[1] = SkISize::Make(100, 100);
  54. sizeInfo.fSizes[2] = SkISize::Make( 50, 50);
  55. sizeInfo.fSizes[3] = SkISize::Make( 25, 25);
  56. sizeInfo.fWidthBytes[0] = 0;
  57. sizeInfo.fWidthBytes[1] = 0;
  58. sizeInfo.fWidthBytes[2] = 0;
  59. sizeInfo.fWidthBytes[3] = 0;
  60. void* planes[4] = { nullptr };
  61. SkYUVAIndex yuvaIndices[4];
  62. SkYUVColorSpace colorSpace;
  63. // Check that the YUV decoding API does not cause any crashes
  64. ig.queryYUVA8(&sizeInfo, yuvaIndices, nullptr);
  65. ig.queryYUVA8(&sizeInfo, yuvaIndices, &colorSpace);
  66. sizeInfo.fWidthBytes[0] = 250;
  67. sizeInfo.fWidthBytes[1] = 250;
  68. sizeInfo.fWidthBytes[2] = 250;
  69. sizeInfo.fWidthBytes[3] = 250;
  70. yuvaIndices[0] = { 0, SkColorChannel::kR };
  71. yuvaIndices[1] = { 1, SkColorChannel::kR };
  72. yuvaIndices[2] = { 2, SkColorChannel::kR };
  73. yuvaIndices[3] = { 3, SkColorChannel::kR };
  74. int dummy;
  75. planes[0] = planes[1] = planes[2] = planes[3] = &dummy;
  76. ig.getYUVA8Planes(sizeInfo, yuvaIndices, planes);
  77. // Suppressed due to https://code.google.com/p/skia/issues/detail?id=4339
  78. if (false) {
  79. test_imagegenerator_factory(reporter);
  80. }
  81. }
  82. #include "include/core/SkPictureRecorder.h"
  83. #include "src/core/SkAutoMalloc.h"
  84. static sk_sp<SkPicture> make_picture() {
  85. SkPictureRecorder recorder;
  86. recorder.beginRecording(100, 100)->drawColor(SK_ColorRED);
  87. return recorder.finishRecordingAsPicture();
  88. }
  89. DEF_TEST(PictureImageGenerator, reporter) {
  90. const struct {
  91. SkColorType fColorType;
  92. SkAlphaType fAlphaType;
  93. } recs[] = {
  94. { kRGBA_8888_SkColorType, kPremul_SkAlphaType },
  95. { kBGRA_8888_SkColorType, kPremul_SkAlphaType },
  96. { kRGBA_F16_SkColorType, kPremul_SkAlphaType },
  97. { kRGBA_F32_SkColorType, kPremul_SkAlphaType },
  98. { kRGBA_1010102_SkColorType, kPremul_SkAlphaType },
  99. { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType },
  100. { kBGRA_8888_SkColorType, kUnpremul_SkAlphaType },
  101. { kRGBA_F16_SkColorType, kUnpremul_SkAlphaType },
  102. { kRGBA_F32_SkColorType, kUnpremul_SkAlphaType },
  103. { kRGBA_1010102_SkColorType, kUnpremul_SkAlphaType },
  104. };
  105. auto colorspace = SkColorSpace::MakeSRGB();
  106. auto picture = make_picture();
  107. auto gen = SkImageGenerator::MakeFromPicture({100, 100}, picture, nullptr, nullptr,
  108. SkImage::BitDepth::kU8, colorspace);
  109. // worst case for all requests
  110. SkAutoMalloc storage(100 * 100 * SkColorTypeBytesPerPixel(kRGBA_F32_SkColorType));
  111. for (const auto& rec : recs) {
  112. SkImageInfo info = SkImageInfo::Make(100, 100, rec.fColorType, rec.fAlphaType, colorspace);
  113. REPORTER_ASSERT(reporter, gen->getPixels(info, storage.get(), info.minRowBytes()));
  114. }
  115. }