static void dopatch(SkCanvas* canvas, const SkColor colors[], sk_sp<SkImage> img = nullptr) { SkPaint paint; const SkBlendMode modes[] = { SkBlendMode::kSrc, SkBlendMode::kDst, SkBlendMode::kModulate, }; SkPoint texStorage[4]; const SkPoint* tex = gTexCoords; sk_sp<SkShader> shader; if (img) { SkScalar w = img->width(); SkScalar h = img->height(); shader = img->makeShader(); texStorage[0].set(0, 0); texStorage[1].set(w, 0); texStorage[2].set(w, h); texStorage[3].set(0, h); tex = texStorage; } else { shader = make_shader(); } canvas->save(); for (int y = 0; y < 3; y++) { for (int x = 0; x < 4; x++) { canvas->save(); canvas->translate(x * 350.0f, y * 350.0f); switch (x) { case 0: canvas->drawPatch(gCubics, nullptr, nullptr, modes[y], paint); break; case 1: canvas->drawPatch(gCubics, colors, nullptr, modes[y], paint); break; case 2: paint.setShader(shader); canvas->drawPatch(gCubics, nullptr, tex, modes[y], paint); paint.setShader(nullptr); break; case 3: paint.setShader(shader); canvas->drawPatch(gCubics, colors, tex, modes[y], paint); paint.setShader(nullptr); break; default: break; } draw_control_points(canvas, gCubics); canvas->restore(); } } canvas->restore(); }