/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* * Error codes used by gmmain.cpp. */ #ifndef gm_error_DEFINED #define gm_error_DEFINED #include "gm.h" namespace skiagm { /** * The complete list of error types we might encounter in GM. */ enum ErrorType { // Even though kNoGpuContext_ErrorType only occurs when SK_SUPPORT_GPU // is turned on, we always include this type in our enum so that // reports will be consistent whether SK_SUPPORT_GPU is turned on // or off (as long as the number of these errors is 0). kNoGpuContext_ErrorType, kIntentionallySkipped_ErrorType, kRenderModeMismatch_ErrorType, kGeneratePdfFailed_ErrorType, kExpectationsMismatch_ErrorType, kMissingExpectations_ErrorType, kWritingReferenceImage_ErrorType, kLast_ErrorType = kWritingReferenceImage_ErrorType }; /** * Returns the name of the given ErrorType. */ static const char *getErrorTypeName(ErrorType type) { switch(type) { case kNoGpuContext_ErrorType: return "NoGpuContext"; case kIntentionallySkipped_ErrorType: return "IntentionallySkipped"; case kRenderModeMismatch_ErrorType: return "RenderModeMismatch"; case kGeneratePdfFailed_ErrorType: return "GeneratePdfFailed"; case kExpectationsMismatch_ErrorType: return "ExpectationsMismatch"; case kMissingExpectations_ErrorType: return "MissingExpectations"; case kWritingReferenceImage_ErrorType: return "WritingReferenceImage"; } // control should never reach here SkDEBUGFAIL("getErrorTypeName() called with unknown type"); return "Unknown"; } /** * Fills in "type" with the ErrorType associated with name "name". * Returns true if we found one, false if it is an unknown type name. */ static bool getErrorTypeByName(const char name[], ErrorType *type) { for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { ErrorType thisType = static_cast(typeInt); const char *thisTypeName = getErrorTypeName(thisType); if (0 == strcmp(thisTypeName, name)) { *type = thisType; return true; } } return false; } /** * A combination of 0 or more ErrorTypes. */ class ErrorCombination { public: ErrorCombination() : fBitfield(0) {} ErrorCombination(const ErrorType type) : fBitfield(1 << type) {} /** * Returns true iff there are NO errors. */ bool isEmpty() const { return (0 == this->fBitfield); } /** * Adds this ErrorType to this ErrorCombination. */ void add(const ErrorType type) { this->fBitfield |= (1 << type); } /** * Adds all ErrorTypes in "other" to this ErrorCombination. */ void add(const ErrorCombination other) { this->fBitfield |= other.fBitfield; } /** * Returns true iff this ErrorCombination includes this ErrorType. */ bool includes(const ErrorType type) const { return !(0 == (this->fBitfield & (1 << type))); } /** * Returns a string representation of all ErrorTypes in this * ErrorCombination. * * @param separator text with which to separate ErrorType names */ SkString asString(const char separator[]) const { SkString s; for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { ErrorType type = static_cast(typeInt); if (this->includes(type)) { if (!s.isEmpty()) { s.append(separator); } s.append(getErrorTypeName(type)); } } return s; } /** * Returns a new ErrorCombination, which includes the union of all * ErrorTypes in two ErrorCombination objects (this and other). */ ErrorCombination plus(const ErrorCombination& other) const { ErrorCombination retval; retval.fBitfield = this->fBitfield | other.fBitfield; return retval; } /** * Returns a new ErrorCombination, which is a copy of "this" * but with all ErrorTypes in "other" removed. */ ErrorCombination minus(const ErrorCombination& other) const { ErrorCombination retval; retval.fBitfield = this->fBitfield & ~(other.fBitfield); return retval; } private: int fBitfield; }; // No errors at all. const static ErrorCombination kEmpty_ErrorCombination; } #endif // ifndef gm_error_DEFINED