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
8 #include "SkData.h"
9 #include "SkGraphics.h"
10 #include "SkImageGenerator.h"
11 #include "Test.h"
12
13 static bool gMyFactoryWasCalled;
14
my_factory(SkData *)15 static SkImageGenerator* my_factory(SkData*) {
16 gMyFactoryWasCalled = true;
17 return nullptr;
18 }
19
test_imagegenerator_factory(skiatest::Reporter * reporter)20 static void test_imagegenerator_factory(skiatest::Reporter* reporter) {
21 // just need a non-empty data to test things
22 SkAutoTUnref<SkData> data(SkData::NewWithCString("test_imagegenerator_factory"));
23
24 gMyFactoryWasCalled = false;
25
26 SkImageGenerator* gen;
27 REPORTER_ASSERT(reporter, !gMyFactoryWasCalled);
28
29 gen = SkImageGenerator::NewFromEncoded(data);
30 REPORTER_ASSERT(reporter, nullptr == gen);
31 REPORTER_ASSERT(reporter, !gMyFactoryWasCalled);
32
33 // Test is racy, in that it hopes no other thread is changing this global...
34 SkGraphics::ImageGeneratorFromEncodedFactory prev =
35 SkGraphics::SetImageGeneratorFromEncodedFactory(my_factory);
36 gen = SkImageGenerator::NewFromEncoded(data);
37 REPORTER_ASSERT(reporter, nullptr == gen);
38 REPORTER_ASSERT(reporter, gMyFactoryWasCalled);
39 SkGraphics::SetImageGeneratorFromEncodedFactory(prev);
40 }
41
42 class MyImageGenerator : public SkImageGenerator {
43 public:
MyImageGenerator()44 MyImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
45 };
46
DEF_TEST(ImageGenerator,reporter)47 DEF_TEST(ImageGenerator, reporter) {
48 MyImageGenerator ig;
49 SkISize sizes[3];
50 sizes[0] = SkISize::Make(200, 200);
51 sizes[1] = SkISize::Make(100, 100);
52 sizes[2] = SkISize::Make( 50, 50);
53 void* planes[3] = { nullptr };
54 size_t rowBytes[3] = { 0 };
55 SkYUVColorSpace colorSpace;
56
57 // Check that the YUV decoding API does not cause any crashes
58 ig.getYUV8Planes(sizes, nullptr, nullptr, &colorSpace);
59 ig.getYUV8Planes(sizes, nullptr, nullptr, nullptr);
60 ig.getYUV8Planes(sizes, planes, nullptr, nullptr);
61 ig.getYUV8Planes(sizes, nullptr, rowBytes, nullptr);
62 ig.getYUV8Planes(sizes, planes, rowBytes, nullptr);
63 ig.getYUV8Planes(sizes, planes, rowBytes, &colorSpace);
64
65 int dummy;
66 planes[0] = planes[1] = planes[2] = &dummy;
67 rowBytes[0] = rowBytes[1] = rowBytes[2] = 250;
68
69 ig.getYUV8Planes(sizes, planes, rowBytes, &colorSpace);
70
71 // Suppressed due to https://code.google.com/p/skia/issues/detail?id=4339
72 if (false) {
73 test_imagegenerator_factory(reporter);
74 }
75 }
76