180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
7910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "Test.h"
9910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#include "TestClassDef.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColor.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkXfermode.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkPMColor bogusXfermodeProc(SkPMColor src, SkPMColor dst) {
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return 42;
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define ILLEGAL_MODE    ((SkXfermode::Mode)-1)
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_asMode(skiatest::Reporter* reporter) {
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int mode = 0; mode <= SkXfermode::kLastMode; mode++) {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkXfermode* xfer = SkXfermode::Create((SkXfermode::Mode) mode);
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkXfermode::Mode reportedMode = ILLEGAL_MODE;
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, reportedMode != mode);
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // test IsMode
270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        REPORTER_ASSERT(reporter, SkXfermode::AsMode(xfer, &reportedMode));
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, reportedMode == mode);
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // repeat that test, but with asMode instead
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (xfer) {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            reportedMode = (SkXfermode::Mode) -1;
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            REPORTER_ASSERT(reporter, xfer->asMode(&reportedMode));
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            REPORTER_ASSERT(reporter, reportedMode == mode);
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            xfer->unref();
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            REPORTER_ASSERT(reporter, SkXfermode::kSrcOver_Mode == mode);
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkXfermode* bogusXfer = new SkProcXfermode(bogusXfermodeProc);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkXfermode::Mode reportedMode = ILLEGAL_MODE;
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, !bogusXfer->asMode(&reportedMode));
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    REPORTER_ASSERT(reporter, reportedMode == ILLEGAL_MODE);
450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    REPORTER_ASSERT(reporter, !SkXfermode::AsMode(bogusXfer, &reportedMode));
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    REPORTER_ASSERT(reporter, reportedMode == ILLEGAL_MODE);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bogusXfer->unref();
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_IsMode(skiatest::Reporter* reporter) {
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, SkXfermode::IsMode(NULL,
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                 SkXfermode::kSrcOver_Mode));
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i <= SkXfermode::kLastMode; ++i) {
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkXfermode::Mode mode = (SkXfermode::Mode)i;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkXfermode* xfer = SkXfermode::Create(mode);
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, SkXfermode::IsMode(xfer, mode));
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkSafeUnref(xfer);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkXfermode::kSrcOver_Mode != mode) {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            REPORTER_ASSERT(reporter, !SkXfermode::IsMode(NULL, mode));
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
67910f694aefb0b671dd8522a9afe9b6be645701c1Derek SollenbergerDEF_TEST(Xfermode, reporter) {
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    test_asMode(reporter);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    test_IsMode(reporter);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
71