Reland "add skvm for tablecolorfilter"

This is a reland of bf3087f65d6a5b9df03bfd40b0dbf4eb0d15758c

Original change's description:
> add skvm for tablecolorfilter
> 
> Change-Id: I712bf165a8af956f7447cb4c43949a4abcb2fea6
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268308
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Mike Klein <mtklein@google.com>

Change-Id: I76be0303a7df1db2ecd95a49ff6f29db2b8e41c0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268502
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index f5f2e28..678c7a2 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -16,6 +16,7 @@
 #include "src/core/SkEffectPriv.h"
 #include "src/core/SkRasterPipeline.h"
 #include "src/core/SkReadBuffer.h"
+#include "src/core/SkVM.h"
 #include "src/core/SkWriteBuffer.h"
 
 static const uint8_t gIdentityTable[] = {
@@ -122,6 +123,41 @@
         return true;
     }
 
+    bool onProgram(skvm::Builder* p, SkColorSpace* dstCS, skvm::Uniforms* uniforms,
+                   skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override {
+
+        auto apply_table_to_component = [&](skvm::F32 c, const uint8_t* bytePtr) -> skvm::F32 {
+            c = p->clamp(c, p->splat(0.f), p->splat(1.0f));
+            skvm::I32 index = p->unorm(8, c);
+
+            skvm::Builder::Uniform table = uniforms->pushPtr(bytePtr);
+            skvm::I32 byte = p->gather8(table, index);
+            return p->unorm(8, byte);
+        };
+
+        p->unpremul(r,g,b,*a);
+
+        const uint8_t* ptr = fStorage;
+        if (fFlags & kA_Flag) {
+            *a = apply_table_to_component(*a, ptr);
+            ptr += 256;
+        }
+        if (fFlags & kR_Flag) {
+            *r = apply_table_to_component(*r, ptr);
+            ptr += 256;
+        }
+        if (fFlags & kG_Flag) {
+            *g = apply_table_to_component(*g, ptr);
+            ptr += 256;
+        }
+        if (fFlags & kB_Flag) {
+            *b = apply_table_to_component(*b, ptr);
+        }
+
+        p->premul(r,g,b,*a);
+        return true;
+    }
+
 protected:
     void flatten(SkWriteBuffer&) const override;