150a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org#include "Test.h"
250a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
350a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org#include "SkMallocPixelRef.h"
48f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkPixelRef.h"
550a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
650a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.orgclass TestListener : public SkPixelRef::GenIDChangeListener {
750a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.orgpublic:
850a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    explicit TestListener(int* ptr) : fPtr(ptr) {}
936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onChange() override { (*fPtr)++; }
1050a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.orgprivate:
1150a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    int* fPtr;
1250a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org};
1350a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
1450a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.orgDEF_TEST(PixelRef_GenIDChange, r) {
1532678d9a453e2c9fd26e92be429cdd84250b4d85commit-bot@chromium.org    SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
16bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com
17bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    SkAutoTUnref<SkPixelRef> pixelRef(SkMallocPixelRef::NewAllocate(info, 0, NULL));
1850a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
1950a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // Register a listener.
2050a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    int count = 0;
21bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->addGenIDChangeListener(SkNEW_ARGS(TestListener, (&count)));
2250a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    REPORTER_ASSERT(r, 0 == count);
2350a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
2450a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // No one has looked at our pixelRef's generation ID, so invalidating it doesn't make sense.
2550a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // (An SkPixelRef tree falls in the forest but there's nobody around to hear it.  Do we care?)
26bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->notifyPixelsChanged();
2750a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    REPORTER_ASSERT(r, 0 == count);
2850a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
2950a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // Force the generation ID to be calculated.
30bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    REPORTER_ASSERT(r, 0 != pixelRef->getGenerationID());
3150a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
3250a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // Our listener was dropped in the first call to notifyPixelsChanged().  This is a no-op.
33bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->notifyPixelsChanged();
3450a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    REPORTER_ASSERT(r, 0 == count);
3550a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
3650a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // Force the generation ID to be recalculated, then add a listener.
37bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    REPORTER_ASSERT(r, 0 != pixelRef->getGenerationID());
38bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->addGenIDChangeListener(SkNEW_ARGS(TestListener, (&count)));
39bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->notifyPixelsChanged();
4050a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    REPORTER_ASSERT(r, 1 == count);
4150a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org
4250a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org    // Quick check that NULL is safe.
43bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    REPORTER_ASSERT(r, 0 != pixelRef->getGenerationID());
44bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->addGenIDChangeListener(NULL);
45bf790232f6d94b54239dbc210d8beee7411ca458reed@google.com    pixelRef->notifyPixelsChanged();
4650a3043194cf278a74ff51c33c6cdb52cbe1f8f9commit-bot@chromium.org}
47