blob: e442f5d894376436773a8bc8372b9a096b485671 [file] [log] [blame]
epoger@google.com6f6568b2013-03-22 17:29:46 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8/*
9 * Error codes used by gmmain.cpp.
10 */
11
epoger@google.com310478e2013-04-03 18:00:39 +000012#ifndef gm_error_DEFINED
13#define gm_error_DEFINED
14
15#include "gm.h"
16
epoger@google.com6f6568b2013-03-22 17:29:46 +000017namespace skiagm {
18
19 /**
20 * The complete list of error types we might encounter in GM.
21 */
22 enum ErrorType {
epoger@google.com310478e2013-04-03 18:00:39 +000023 // Even though kNoGpuContext_ErrorType only occurs when SK_SUPPORT_GPU
24 // is turned on, we always include this type in our enum so that
25 // reports will be consistent whether SK_SUPPORT_GPU is turned on
26 // or off (as long as the number of these errors is 0).
epoger@google.com6f6568b2013-03-22 17:29:46 +000027 kNoGpuContext_ErrorType,
epoger@google.com310478e2013-04-03 18:00:39 +000028
epoger@google.comc8263e72013-04-10 12:17:34 +000029 kIntentionallySkipped_ErrorType,
epoger@google.comcaac3db2013-04-04 19:23:11 +000030 kRenderModeMismatch_ErrorType,
31 kExpectationsMismatch_ErrorType,
epoger@google.com6f6568b2013-03-22 17:29:46 +000032 kMissingExpectations_ErrorType,
33 kWritingReferenceImage_ErrorType,
34 kLast_ErrorType = kWritingReferenceImage_ErrorType
35 };
36
37 /**
epoger@google.com310478e2013-04-03 18:00:39 +000038 * Returns the name of the given ErrorType.
39 */
40 static const char *getErrorTypeName(ErrorType type) {
41 switch(type) {
42 case kNoGpuContext_ErrorType:
43 return "NoGpuContext";
epoger@google.comc8263e72013-04-10 12:17:34 +000044 case kIntentionallySkipped_ErrorType:
45 return "IntentionallySkipped";
epoger@google.comcaac3db2013-04-04 19:23:11 +000046 case kRenderModeMismatch_ErrorType:
47 return "RenderModeMismatch";
48 case kExpectationsMismatch_ErrorType:
49 return "ExpectationsMismatch";
epoger@google.com310478e2013-04-03 18:00:39 +000050 case kMissingExpectations_ErrorType:
51 return "MissingExpectations";
52 case kWritingReferenceImage_ErrorType:
53 return "WritingReferenceImage";
54 }
55 // control should never reach here
56 SkDEBUGFAIL("getErrorTypeName() called with unknown type");
57 return "Unknown";
58 }
59
60 /**
epoger@google.com5079d2c2013-04-12 14:11:21 +000061 * Fills in "type" with the ErrorType associated with name "name".
62 * Returns true if we found one, false if it is an unknown type name.
63 */
64 static bool getErrorTypeByName(const char name[], ErrorType *type) {
65 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) {
66 ErrorType thisType = static_cast<ErrorType>(typeInt);
67 const char *thisTypeName = getErrorTypeName(thisType);
68 if (0 == strcmp(thisTypeName, name)) {
69 *type = thisType;
70 return true;
71 }
72 }
73 return false;
74 }
75
76 /**
epoger@google.com6f6568b2013-03-22 17:29:46 +000077 * A combination of 0 or more ErrorTypes.
78 */
79 class ErrorCombination {
80 public:
81 ErrorCombination() : fBitfield(0) {}
82 ErrorCombination(const ErrorType type) : fBitfield(1 << type) {}
83
84 /**
85 * Returns true iff there are NO errors.
86 */
87 bool isEmpty() const {
88 return (0 == this->fBitfield);
89 }
90
91 /**
92 * Adds this ErrorType to this ErrorCombination.
93 */
94 void add(const ErrorType type) {
95 this->fBitfield |= (1 << type);
96 }
97
98 /**
99 * Adds all ErrorTypes in "other" to this ErrorCombination.
100 */
101 void add(const ErrorCombination other) {
102 this->fBitfield |= other.fBitfield;
103 }
104
105 /**
106 * Returns true iff this ErrorCombination includes this ErrorType.
107 */
108 bool includes(const ErrorType type) const {
109 return !(0 == (this->fBitfield & (1 << type)));
110 }
111
112 /**
epoger@google.com5079d2c2013-04-12 14:11:21 +0000113 * Returns a string representation of all ErrorTypes in this
114 * ErrorCombination.
115 *
116 * @param separator text with which to separate ErrorType names
117 */
118 SkString asString(const char separator[]) const {
119 SkString s;
120 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) {
121 ErrorType type = static_cast<ErrorType>(typeInt);
122 if (this->includes(type)) {
123 if (!s.isEmpty()) {
124 s.append(separator);
125 }
126 s.append(getErrorTypeName(type));
127 }
128 }
129 return s;
130 }
131
132 /**
epoger@google.com6f6568b2013-03-22 17:29:46 +0000133 * Returns a new ErrorCombination, which includes the union of all
134 * ErrorTypes in two ErrorCombination objects (this and other).
135 */
136 ErrorCombination plus(const ErrorCombination& other) const {
137 ErrorCombination retval;
138 retval.fBitfield = this->fBitfield | other.fBitfield;
139 return retval;
140 }
141
142 /**
143 * Returns a new ErrorCombination, which is a copy of "this"
144 * but with all ErrorTypes in "other" removed.
145 */
146 ErrorCombination minus(const ErrorCombination& other) const {
147 ErrorCombination retval;
148 retval.fBitfield = this->fBitfield & ~(other.fBitfield);
149 return retval;
150 }
151
152 private:
153 int fBitfield;
154 };
155
156 // No errors at all.
157 const static ErrorCombination kEmpty_ErrorCombination;
158}
epoger@google.com310478e2013-04-03 18:00:39 +0000159
160#endif // ifndef gm_error_DEFINED