PixelRefTest.cpp revision 0daa1adb03b4b1fc11d854cb7754416ac05a31e8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Test.h"
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "TestClassDef.h"
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPixelRef.h"
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkMallocPixelRef.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_info(skiatest::Reporter* reporter) {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const struct {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkBitmap::Config    fConfig;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkAlphaType         fAlphaType;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkColorType         fExpectedColorType;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool                fExpectedSuccess;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } gRec[] = {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kNo_Config,         kPremul_SkAlphaType,    kPMColor_SkColorType,   false },
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kARGB_8888_Config,  kPremul_SkAlphaType,    kPMColor_SkColorType,   true },
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kARGB_8888_Config,  kOpaque_SkAlphaType,    kPMColor_SkColorType,   true },
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kRGB_565_Config,    kOpaque_SkAlphaType,    kRGB_565_SkColorType,   true },
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kARGB_4444_Config,  kPremul_SkAlphaType,    kARGB_4444_SkColorType, true },
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kARGB_4444_Config,  kOpaque_SkAlphaType,    kARGB_4444_SkColorType, true },
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kA8_Config,         kPremul_SkAlphaType,    kAlpha_8_SkColorType,   true },
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kA8_Config,         kOpaque_SkAlphaType,    kAlpha_8_SkColorType,   true },
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kIndex8_Config,     kPremul_SkAlphaType,    kIndex_8_SkColorType,   true },
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { SkBitmap::kIndex8_Config,     kOpaque_SkAlphaType,    kIndex_8_SkColorType,   true },
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap bitmap;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkImageInfo info;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool success = bitmap.setConfig(gRec[i].fConfig, 10, 10, 0, gRec[i].fAlphaType);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        REPORTER_ASSERT(reporter, success);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = bitmap.asImageInfo(&info);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        REPORTER_ASSERT(reporter, success == gRec[i].fExpectedSuccess);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (gRec[i].fExpectedSuccess) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            REPORTER_ASSERT(reporter, info.fAlphaType == gRec[i].fAlphaType);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            REPORTER_ASSERT(reporter, info.fColorType == gRec[i].fExpectedColorType);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestListener : public SkPixelRef::GenIDChangeListener {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit TestListener(int* ptr) : fPtr(ptr) {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void onChange() SK_OVERRIDE { (*fPtr)++; }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* fPtr;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEF_TEST(PixelRef_GenIDChange, r) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkMallocPixelRef pixelRef(NULL, 0, NULL);  // We don't really care about the pixels here.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register a listener.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int count = 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.addGenIDChangeListener(SkNEW_ARGS(TestListener, (&count)));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 == count);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No one has looked at our pixelRef's generation ID, so invalidating it doesn't make sense.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (An SkPixelRef tree falls in the forest but there's nobody around to hear it.  Do we care?)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.notifyPixelsChanged();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 == count);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Force the generation ID to be calculated.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 != pixelRef.getGenerationID());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Our listener was dropped in the first call to notifyPixelsChanged().  This is a no-op.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.notifyPixelsChanged();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 == count);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Force the generation ID to be recalculated, then add a listener.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 != pixelRef.getGenerationID());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.addGenIDChangeListener(SkNEW_ARGS(TestListener, (&count)));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.notifyPixelsChanged();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 1 == count);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that NULL is safe.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REPORTER_ASSERT(r, 0 != pixelRef.getGenerationID());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.addGenIDChangeListener(NULL);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixelRef.notifyPixelsChanged();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_info(r);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)