1/* 2 * Copyright 2013 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 "include/core/SkBitmap.h" 9#include "include/core/SkCanvas.h" 10#include "include/core/SkColor.h" 11#include "include/core/SkImage.h" 12#include "include/core/SkImageGenerator.h" 13#include "include/core/SkImageInfo.h" 14#include "include/core/SkRefCnt.h" 15#include "include/core/SkTypes.h" 16#include "include/private/SkColorData.h" 17#include "src/core/SkOpts.h" 18#include "tests/Test.h" 19#include "tools/ToolUtils.h" 20 21#include <utility> 22 23class TestImageGenerator : public SkImageGenerator { 24public: 25 enum TestType { 26 kFailGetPixels_TestType, 27 kSucceedGetPixels_TestType, 28 kLast_TestType = kSucceedGetPixels_TestType 29 }; 30 static int Width() { return 10; } 31 static int Height() { return 10; } 32 // value choosen so that there is no loss when converting to to RGB565 and back 33 static SkColor Color() { return ToolUtils::color_to_565(0xffaabbcc); } 34 static SkPMColor PMColor() { return SkPreMultiplyColor(Color()); } 35 36 TestImageGenerator(TestType type, skiatest::Reporter* reporter, 37 SkColorType colorType = kN32_SkColorType) 38 : INHERITED(GetMyInfo(colorType)), fType(type), fReporter(reporter) { 39 SkASSERT((fType <= kLast_TestType) && (fType >= 0)); 40 } 41 ~TestImageGenerator() override {} 42 43protected: 44 static SkImageInfo GetMyInfo(SkColorType colorType) { 45 return SkImageInfo::Make(TestImageGenerator::Width(), TestImageGenerator::Height(), 46 colorType, kOpaque_SkAlphaType); 47 } 48 49 bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 50 const Options& options) override { 51 REPORTER_ASSERT(fReporter, pixels != nullptr); 52 REPORTER_ASSERT(fReporter, rowBytes >= info.minRowBytes()); 53 if (fType != kSucceedGetPixels_TestType) { 54 return false; 55 } 56 if (info.colorType() != kN32_SkColorType && info.colorType() != getInfo().colorType()) { 57 return false; 58 } 59 char* bytePtr = static_cast<char*>(pixels); 60 switch (info.colorType()) { 61 case kN32_SkColorType: 62 for (int y = 0; y < info.height(); ++y) { 63 sk_memset32((uint32_t*)bytePtr, 64 TestImageGenerator::PMColor(), info.width()); 65 bytePtr += rowBytes; 66 } 67 break; 68 case kRGB_565_SkColorType: 69 for (int y = 0; y < info.height(); ++y) { 70 sk_memset16((uint16_t*)bytePtr, 71 SkPixel32ToPixel16(TestImageGenerator::PMColor()), info.width()); 72 bytePtr += rowBytes; 73 } 74 break; 75 default: 76 return false; 77 } 78 return true; 79 } 80 81private: 82 const TestType fType; 83 skiatest::Reporter* const fReporter; 84 85 using INHERITED = SkImageGenerator; 86}; 87 88//////////////////////////////////////////////////////////////////////////////// 89 90DEF_TEST(Image_NewFromGenerator, r) { 91 const TestImageGenerator::TestType testTypes[] = { 92 TestImageGenerator::kFailGetPixels_TestType, 93 TestImageGenerator::kSucceedGetPixels_TestType, 94 }; 95 const SkColorType testColorTypes[] = { 96 kN32_SkColorType, 97 kRGB_565_SkColorType 98 }; 99 for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) { 100 TestImageGenerator::TestType test = testTypes[i]; 101 for (const SkColorType testColorType : testColorTypes) { 102 auto gen = std::make_unique<TestImageGenerator>(test, r, testColorType); 103 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen))); 104 if (nullptr == image) { 105 ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed [%zu]", i); 106 continue; 107 } 108 REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width()); 109 REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height()); 110 REPORTER_ASSERT(r, image->isLazyGenerated()); 111 112 SkBitmap bitmap; 113 bitmap.allocN32Pixels(TestImageGenerator::Width(), TestImageGenerator::Height()); 114 SkCanvas canvas(bitmap); 115 const SkColor kDefaultColor = 0xffabcdef; 116 canvas.clear(kDefaultColor); 117 canvas.drawImage(image, 0, 0); 118 if (TestImageGenerator::kSucceedGetPixels_TestType == test) { 119 REPORTER_ASSERT( 120 r, TestImageGenerator::Color() == bitmap.getColor(0, 0)); 121 } 122 else { 123 REPORTER_ASSERT(r, kDefaultColor == bitmap.getColor(0, 0)); 124 } 125 } 126 } 127} 128