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