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;