Home | History | Annotate | Download | only in tests
      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 
     15 static SkImageGenerator* my_factory(SkData*) {
     16     gMyFactoryWasCalled = true;
     17     return nullptr;
     18 }
     19 
     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:
     44     MyImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
     45 };
     46 
     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