16f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com/*
26f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com * Copyright 2013 Google Inc.
36f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com *
46f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
56f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com * found in the LICENSE file.
66f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com */
76f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
86f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com/*
96f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com * Error codes used by gmmain.cpp.
106f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com */
116f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
12310478e72c63e639373465216271b81f1e4a9136epoger@google.com#ifndef gm_error_DEFINED
13310478e72c63e639373465216271b81f1e4a9136epoger@google.com#define gm_error_DEFINED
14310478e72c63e639373465216271b81f1e4a9136epoger@google.com
15310478e72c63e639373465216271b81f1e4a9136epoger@google.com#include "gm.h"
16310478e72c63e639373465216271b81f1e4a9136epoger@google.com
176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comnamespace skiagm {
186f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
196f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    /**
206f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com     * The complete list of error types we might encounter in GM.
216f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com     */
226f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    enum ErrorType {
23310478e72c63e639373465216271b81f1e4a9136epoger@google.com        // Even though kNoGpuContext_ErrorType only occurs when SK_SUPPORT_GPU
24310478e72c63e639373465216271b81f1e4a9136epoger@google.com        // is turned on, we always include this type in our enum so that
25310478e72c63e639373465216271b81f1e4a9136epoger@google.com        // reports will be consistent whether SK_SUPPORT_GPU is turned on
26310478e72c63e639373465216271b81f1e4a9136epoger@google.com        // or off (as long as the number of these errors is 0).
276f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        kNoGpuContext_ErrorType,
28310478e72c63e639373465216271b81f1e4a9136epoger@google.com
29c8263e704135436f71a585801966294d6deadeebepoger@google.com        kIntentionallySkipped_ErrorType,
30caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com        kRenderModeMismatch_ErrorType,
315e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        kGeneratePdfFailed_ErrorType,
32caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com        kExpectationsMismatch_ErrorType,
336f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        kMissingExpectations_ErrorType,
346f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        kWritingReferenceImage_ErrorType,
356f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        kLast_ErrorType = kWritingReferenceImage_ErrorType
366f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    };
376f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
386f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    /**
39310478e72c63e639373465216271b81f1e4a9136epoger@google.com     * Returns the name of the given ErrorType.
40310478e72c63e639373465216271b81f1e4a9136epoger@google.com     */
41310478e72c63e639373465216271b81f1e4a9136epoger@google.com    static const char *getErrorTypeName(ErrorType type) {
42310478e72c63e639373465216271b81f1e4a9136epoger@google.com        switch(type) {
43310478e72c63e639373465216271b81f1e4a9136epoger@google.com        case kNoGpuContext_ErrorType:
44310478e72c63e639373465216271b81f1e4a9136epoger@google.com            return "NoGpuContext";
45c8263e704135436f71a585801966294d6deadeebepoger@google.com        case kIntentionallySkipped_ErrorType:
46c8263e704135436f71a585801966294d6deadeebepoger@google.com            return "IntentionallySkipped";
47caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com        case kRenderModeMismatch_ErrorType:
48caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com            return "RenderModeMismatch";
495e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        case kGeneratePdfFailed_ErrorType:
505e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org            return "GeneratePdfFailed";
51caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com        case kExpectationsMismatch_ErrorType:
52caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com            return "ExpectationsMismatch";
53310478e72c63e639373465216271b81f1e4a9136epoger@google.com        case kMissingExpectations_ErrorType:
54310478e72c63e639373465216271b81f1e4a9136epoger@google.com            return "MissingExpectations";
55310478e72c63e639373465216271b81f1e4a9136epoger@google.com        case kWritingReferenceImage_ErrorType:
56310478e72c63e639373465216271b81f1e4a9136epoger@google.com            return "WritingReferenceImage";
57310478e72c63e639373465216271b81f1e4a9136epoger@google.com        }
58310478e72c63e639373465216271b81f1e4a9136epoger@google.com        // control should never reach here
59310478e72c63e639373465216271b81f1e4a9136epoger@google.com        SkDEBUGFAIL("getErrorTypeName() called with unknown type");
60310478e72c63e639373465216271b81f1e4a9136epoger@google.com        return "Unknown";
61310478e72c63e639373465216271b81f1e4a9136epoger@google.com    }
62310478e72c63e639373465216271b81f1e4a9136epoger@google.com
63310478e72c63e639373465216271b81f1e4a9136epoger@google.com    /**
645079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com     * Fills in "type" with the ErrorType associated with name "name".
655079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com     * Returns true if we found one, false if it is an unknown type name.
665079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com     */
675079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com    static bool getErrorTypeByName(const char name[], ErrorType *type) {
685079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) {
695079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            ErrorType thisType = static_cast<ErrorType>(typeInt);
705079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            const char *thisTypeName = getErrorTypeName(thisType);
715079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            if (0 == strcmp(thisTypeName, name)) {
725079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                *type = thisType;
735079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                return true;
745079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            }
755079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        }
765079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        return false;
775079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com    }
785079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com
795079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com    /**
806f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com     * A combination of 0 or more ErrorTypes.
816f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com     */
826f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    class ErrorCombination {
836f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    public:
846f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        ErrorCombination() : fBitfield(0) {}
856f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        ErrorCombination(const ErrorType type) : fBitfield(1 << type) {}
866f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
876f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
886f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Returns true iff there are NO errors.
896f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
906f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        bool isEmpty() const {
916f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            return (0 == this->fBitfield);
926f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
936f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
946f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
956f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Adds this ErrorType to this ErrorCombination.
966f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
976f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        void add(const ErrorType type) {
986f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            this->fBitfield |= (1 << type);
996f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
1006f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1016f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
1026f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Adds all ErrorTypes in "other" to this ErrorCombination.
1036f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
1046f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        void add(const ErrorCombination other) {
1056f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            this->fBitfield |= other.fBitfield;
1066f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
1076f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1086f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
1096f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Returns true iff this ErrorCombination includes this ErrorType.
1106f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
1116f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        bool includes(const ErrorType type) const {
1126f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            return !(0 == (this->fBitfield & (1 << type)));
1136f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
1146f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1156f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
1165079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com         * Returns a string representation of all ErrorTypes in this
1175079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com         * ErrorCombination.
1185079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com         *
1195079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com         * @param separator text with which to separate ErrorType names
1205079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com         */
1215079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        SkString asString(const char separator[]) const {
1225079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            SkString s;
1235079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) {
1245079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                ErrorType type = static_cast<ErrorType>(typeInt);
1255079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                if (this->includes(type)) {
1265079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                    if (!s.isEmpty()) {
1275079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                        s.append(separator);
1285079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                    }
1295079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                    s.append(getErrorTypeName(type));
1305079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com                }
1315079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            }
1325079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com            return s;
1335079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        }
1345079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com
1355079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com        /**
1366f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Returns a new ErrorCombination, which includes the union of all
1376f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * ErrorTypes in two ErrorCombination objects (this and other).
1386f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
1396f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        ErrorCombination plus(const ErrorCombination& other) const {
1406f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            ErrorCombination retval;
1416f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            retval.fBitfield = this->fBitfield | other.fBitfield;
1426f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            return retval;
1436f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
1446f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1456f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        /**
1466f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * Returns a new ErrorCombination, which is a copy of "this"
1476f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         * but with all ErrorTypes in "other" removed.
1486f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com         */
1496f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        ErrorCombination minus(const ErrorCombination& other) const {
1506f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            ErrorCombination retval;
1516f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            retval.fBitfield = this->fBitfield & ~(other.fBitfield);
1526f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com            return retval;
1536f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        }
1546f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1556f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    private:
1566f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com        int fBitfield;
1576f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    };
1586f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com
1596f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    // No errors at all.
1606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com    const static ErrorCombination kEmpty_ErrorCombination;
1616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com}
162310478e72c63e639373465216271b81f1e4a9136epoger@google.com
163310478e72c63e639373465216271b81f1e4a9136epoger@google.com#endif // ifndef gm_error_DEFINED
164