Index: gm/gm_error.h |
diff --git a/gm/gm_error.h b/gm/gm_error.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e2274c4ffaccbd3cccc2e510a7f90007d2ade663 |
--- /dev/null |
+++ b/gm/gm_error.h |
@@ -0,0 +1,163 @@ |
+/* |
+ * 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 |