1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| void HelloWorld::onPaint(SkSurface* surface) { auto canvas = surface->getCanvas(); canvas->save(); canvas->clear(SK_ColorWHITE);
SkPaint paint; paint.setColor(SK_ColorRED);
static constexpr auto kRect = SkRect::MakeLTRB(20, 20, 120, 120); static constexpr auto kUV = SkRect::MakeLTRB(0, 0, 20, 20);
static constexpr ColorVertex kColorQuad[]{ {0, 0x00FFFF00, {kRect.left(), kUV.left(), kRect.top(), kUV.top()}}, {0, 0x00FFFFFF, {kRect.right(), kUV.right(), kRect.top(), kUV.top()}}, {0, 0xFFFF00FF, {kRect.left(), kUV.left(), kRect.bottom(), kUV.bottom()}}, {0, 0xFFFFFF00, {kRect.right(), kUV.right(), kRect.bottom(), kUV.bottom()}}, }; static constexpr ColorVertex kColorIndexedQuad[]{ {0, 0x00FFFF00, {kRect.left(), kUV.left(), kRect.top(), kUV.top()}}, {0, 0x00000000, {100.f, 0.f, 100.f, 5.f}}, {0, 0x00FFFFFF, {kRect.right(), kUV.right(), kRect.top(), kUV.top()}}, {0, 0x00000000, {200.f, 10.f, 200.f, 10.f}}, {0, 0xFFFF00FF, {kRect.left(), kUV.left(), kRect.bottom(), kUV.bottom()}}, {0, 0xFFFFFF00, {kRect.right(), kUV.right(), kRect.bottom(), kUV.bottom()}}, }; static constexpr size_t kColorIndexedOffset = 2 * sizeof(ColorVertex); static constexpr uint16_t kIndices[]{0, 2, 4, 2, 5, 4}; static constexpr size_t kIndexOffset = 6;
sk_sp<SkMesh::VertexBuffer> fColorVB = SkMeshes::MakeVertexBuffer(kColorQuad, sizeof(kColorQuad));
auto data = SkData::MakeUninitialized(sizeof(kColorIndexedQuad) + kColorIndexedOffset); sk_sp<SkMesh::VertexBuffer> fColorIndexedVB = SkMeshes::MakeVertexBuffer(data->data(), data->size());
static constexpr SkColor kColors[] = {SK_ColorTRANSPARENT, SK_ColorWHITE};
static const Attribute kAttributes[]{ {Attribute::Type::kFloat4, 8, SkString{"xuyv"}}, {Attribute::Type::kUByte4_unorm, 4, SkString{"brag"}}, }; static const Varying kVaryings[]{ {Varying::Type::kHalf4, SkString{"color"}}, {Varying::Type::kFloat2, SkString{"uv"}}, }; static constexpr char kVS[] = R"( half4 unswizzle_color(half4 color) { return color.garb; }
Varyings main(const in Attributes attributes) { Varyings varyings; varyings.color = unswizzle_color(attributes.brag); varyings.uv = attributes.xuyv.yw; varyings.position = attributes.xuyv.xz; varyings.position.x += 500.0; return varyings; } )"; static constexpr char kFS[] = R"( uniform colorFilter filter;
float2 main(const in Varyings varyings, out float4 color) { color = filter.eval(varyings.color); return varyings.uv; } )"; auto [spec, error] = SkMeshSpecification::Make( kAttributes, sizeof(ColorVertex), kVaryings, SkString(kVS), SkString(kFS));
if (!spec) { SkDebugf("%s\n", error.c_str()); } sk_sp<SkMeshSpecification> fSpecWithColor = std::move(spec);
sk_sp<SkShader> fShader = SkGradientShader::MakeRadial({10, 10}, 3, kColors, nullptr, 2, SkTileMode::kMirror); SkRuntimeEffect::ChildPtr nullChild[1] = {}; SkMesh::Result result = SkMesh::Make(fSpecWithColor, SkMesh::Mode::kTriangleStrip, fColorVB, 4, 0, nullptr, nullChild, kRect);
if (!result.mesh.isValid()) { SkDebugf("Mesh creation failed: %s\n", result.error.c_str()); }
paint.setAlpha(0x40); canvas->drawMesh(result.mesh, SkBlender::Mode(SkBlendMode::kDst), paint); canvas->translate(0, 150); canvas->restore(); }
|