| /* |
| * 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<ErrorType>(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<ErrorType>(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 |