Add kSkBlendModeCount

I keep bumping into the need for this

Change-Id: I69384f7d590c163fd6244bdc64cc5e48450fecd4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/540171
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/gm/xfermodes2.cpp b/gm/xfermodes2.cpp
index b9b9029..9dcb68a 100644
--- a/gm/xfermodes2.cpp
+++ b/gm/xfermodes2.cpp
@@ -53,7 +53,7 @@
         const int W = 6;
 
         SkScalar x = 0, y = 0;
-        for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; m++) {
+        for (size_t m = 0; m < kSkBlendModeCount; m++) {
             SkBlendMode mode = static_cast<SkBlendMode>(m);
 
             canvas->save();
diff --git a/gm/xfermodes3.cpp b/gm/xfermodes3.cpp
index 44dee16..087541d 100644
--- a/gm/xfermodes3.cpp
+++ b/gm/xfermodes3.cpp
@@ -77,7 +77,7 @@
             {SkPaint::kStroke_Style, SkIntToScalar(kSize) / 2},
         };
         for (size_t s = 0; s < SK_ARRAY_COUNT(kStrokes); ++s) {
-            for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; ++m) {
+            for (size_t m = 0; m < kSkBlendModeCount; ++m) {
                 SkBlendMode mode = static_cast<SkBlendMode>(m);
                 canvas->drawString(SkBlendMode_Name(mode),
                                    SkIntToScalar(x),
diff --git a/include/core/SkBlendMode.h b/include/core/SkBlendMode.h
index 07640cf..4abe915 100644
--- a/include/core/SkBlendMode.h
+++ b/include/core/SkBlendMode.h
@@ -73,6 +73,8 @@
     kLastMode          = kLuminosity, //!< last valid value
 };
 
+static constexpr int kSkBlendModeCount = static_cast<int>(SkBlendMode::kLastMode) + 1;
+
 /**
  * For Porter-Duff SkBlendModes (those <= kLastCoeffMode), these coefficients describe the blend
  * equation used. Coefficient-based blend modes specify an equation:
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 25c3560..37fe697 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -112,10 +112,8 @@
         return nullptr;
     }
 
-    const int COUNT_BLENDMODES = (int)SkBlendMode::kLastMode + 1;
-
-    static SkOnce        once[COUNT_BLENDMODES];
-    static SkXfermode* cached[COUNT_BLENDMODES];
+    static SkOnce        once[kSkBlendModeCount];
+    static SkXfermode* cached[kSkBlendModeCount];
 
     once[(int)mode]([mode] {
         if (auto xfermode = SkOpts::create_xfermode(mode)) {
diff --git a/tests/ColorFilterTest.cpp b/tests/ColorFilterTest.cpp
index e7ed118..02824a7 100644
--- a/tests/ColorFilterTest.cpp
+++ b/tests/ColorFilterTest.cpp
@@ -41,7 +41,7 @@
 DEF_TEST(ColorFilter, reporter) {
     SkRandom rand;
 
-    for (int mode = 0; mode <= (int)SkBlendMode::kLastMode; mode++) {
+    for (int mode = 0; mode < kSkBlendModeCount; mode++) {
         SkColor color = rand.nextU();
 
         // ensure we always get a filter, by avoiding the possibility of a
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 41ea843..afd3df4 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -1829,10 +1829,9 @@
     sk_sp<SkImageFilter> background(new FixedBoundsImageFilter(background_rect));
     sk_sp<SkImageFilter> foreground(new FixedBoundsImageFilter(foreground_rect));
 
-    const int kModeCount = static_cast<int>(SkBlendMode::kLastMode) + 1;
-    SkIRect expectedBounds[kModeCount];
+    SkIRect expectedBounds[kSkBlendModeCount];
     // Expect union of input rects by default.
-    for (int i = 0; i < kModeCount; ++i) {
+    for (int i = 0; i < kSkBlendModeCount; ++i) {
         expectedBounds[i] = background_rect;
         expectedBounds[i].join(foreground_rect);
     }
@@ -1849,7 +1848,7 @@
 
     // The value of this variable doesn't matter because we use inputs with fixed bounds.
     SkIRect src = SkIRect::MakeXYWH(11, 22, 33, 44);
-    for (int i = 0; i < kModeCount; ++i) {
+    for (int i = 0; i < kSkBlendModeCount; ++i) {
         sk_sp<SkImageFilter> xfermode(SkImageFilters::Blend(static_cast<SkBlendMode>(i),
                                                             background, foreground, nullptr));
         auto bounds = xfermode->filterBounds(src, SkMatrix::I(),
diff --git a/tests/RecordingXfermodeTest.cpp b/tests/RecordingXfermodeTest.cpp
index ecd59a2..fcdf346 100644
--- a/tests/RecordingXfermodeTest.cpp
+++ b/tests/RecordingXfermodeTest.cpp
@@ -147,7 +147,7 @@
     SkString errors;
 #endif
 
-    for (int iMode = 0; iMode < int(SkBlendMode::kLastMode); iMode++) {
+    for (int iMode = 0; iMode < kSkBlendModeCount; iMode++) {
         const SkRect& clip = SkRect::MakeXYWH(100, 0, 100, 100);
         SkBlendMode mode = SkBlendMode(iMode);
 
diff --git a/tests/RuntimeBlendTest.cpp b/tests/RuntimeBlendTest.cpp
index 12d921d..f53ed02 100644
--- a/tests/RuntimeBlendTest.cpp
+++ b/tests/RuntimeBlendTest.cpp
@@ -31,7 +31,7 @@
     SkBitmap bitmap;
     REPORTER_ASSERT(r, bitmap.tryAllocPixels(surface->imageInfo()));
 
-    for (int m = 0; m <= (int)SkBlendMode::kLastMode; ++m) {
+    for (int m = 0; m < kSkBlendModeCount; ++m) {
         SkBlendMode mode = (SkBlendMode)m;
         for (int alpha : {0x80, 0xFF}) {
             std::vector<SkColor> colors;