1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org#include "SkColor.h"
948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org#include "SkXfermode.h"
108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
1148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
12c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com#define ILLEGAL_MODE    ((SkXfermode::Mode)-1)
13c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com
1448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.orgstatic void test_asMode(skiatest::Reporter* reporter) {
1548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org    for (int mode = 0; mode <= SkXfermode::kLastMode; mode++) {
1648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org        SkXfermode* xfer = SkXfermode::Create((SkXfermode::Mode) mode);
17c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com
18c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        SkXfermode::Mode reportedMode = ILLEGAL_MODE;
19c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        REPORTER_ASSERT(reporter, reportedMode != mode);
20c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com
21c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        // test IsMode
224469938e92d779dff05e745559e67907bbf21e78reed@google.com        REPORTER_ASSERT(reporter, SkXfermode::AsMode(xfer, &reportedMode));
23c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        REPORTER_ASSERT(reporter, reportedMode == mode);
24c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com
25c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        // repeat that test, but with asMode instead
2648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org        if (xfer) {
27c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com            reportedMode = (SkXfermode::Mode) -1;
28c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com            REPORTER_ASSERT(reporter, xfer->asMode(&reportedMode));
29c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com            REPORTER_ASSERT(reporter, reportedMode == mode);
30c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com            xfer->unref();
31c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com        } else {
32d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com            REPORTER_ASSERT(reporter, SkXfermode::kSrcOver_Mode == mode);
3348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org        }
3448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org    }
3548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org}
3648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
373565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.orgstatic void test_IsMode(skiatest::Reporter* reporter) {
383565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(NULL,
393565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org                                                 SkXfermode::kSrcOver_Mode));
403565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org
413565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org    for (int i = 0; i <= SkXfermode::kLastMode; ++i) {
423565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        SkXfermode::Mode mode = (SkXfermode::Mode)i;
43d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
443565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        SkXfermode* xfer = SkXfermode::Create(mode);
453565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        REPORTER_ASSERT(reporter, SkXfermode::IsMode(xfer, mode));
463565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        SkSafeUnref(xfer);
473565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org
483565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        if (SkXfermode::kSrcOver_Mode != mode) {
493565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org            REPORTER_ASSERT(reporter, !SkXfermode::IsMode(NULL, mode));
503565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org        }
513565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org    }
523565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org}
533565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org
54e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Xfermode, reporter) {
553565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org    test_asMode(reporter);
563565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org    test_IsMode(reporter);
573565f0fd25afad52b4a9dbb808d877e957475c6cmike@reedtribe.org}
58