virtual void onDraw(SkCanvas* canvas) { SkBitmap src = make_src(); SkBitmap dst = make_dst(); const SkScalar one = SK_Scalar1; static const SkScalar K[] = { 0, 0, 0, 0, 0, 0, 0, one, 0, one, 0, 0, 0, 0, one, 0, 0, one, one, 0, 0, one, -one, 0, 0, one/2, one/2, 0, 0, one/2, one/2, one/4, 0, one/2, one/2, -one/4, one/4, one/2, one/2, 0, -one/4, one/2, one/2, 0, }; const SkScalar* k = K; const SkScalar* stop = k + SK_ARRAY_COUNT(K); SkScalar y = 0; SkScalar gap = SkIntToScalar(src.width() + 20); while (k < stop) { SkScalar x = 0; canvas->drawBitmap(src, x, y, NULL); x += gap; canvas->drawBitmap(dst, x, y, NULL); x += gap; SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH)); canvas->saveLayer(&rect, NULL); canvas->drawBitmap(dst, x, y, NULL); SkXfermode* xfer = SkArithmeticMode::Create(k[0], k[1], k[2], k[3]); SkPaint paint; paint.setXfermode(xfer)->unref(); canvas->drawBitmap(src, x, y, &paint); canvas->restore(); x += gap; show_k_text(canvas, x, y, k); k += 4; y += SkIntToScalar(src.height() + 12); } }
virtual void onDraw(SkCanvas* canvas) { SkBitmap src = make_src(); SkBitmap dst = make_dst(); const SkScalar one = SK_Scalar1; static const SkScalar K[] = { 0, 0, 0, 0, 0, 0, 0, one, 0, one, 0, 0, 0, 0, one, 0, 0, one, one, 0, 0, one, -one, 0, 0, one/2, one/2, 0, 0, one/2, one/2, one/4, 0, one/2, one/2, -one/4, one/4, one/2, one/2, 0, -one/4, one/2, one/2, 0, }; const SkScalar* k = K; const SkScalar* stop = k + SK_ARRAY_COUNT(K); SkScalar y = 0; SkScalar gap = SkIntToScalar(src.width() + 20); while (k < stop) { SkScalar x = 0; SkBitmap res = make_arith(src, dst, k); canvas->drawBitmap(src, x, y, NULL); x += gap; canvas->drawBitmap(dst, x, y, NULL); x += gap; canvas->drawBitmap(res, x, y, NULL); x += gap; show_k_text(canvas, x, y, k); k += 4; y += SkIntToScalar(src.height() + 12); } }
virtual void onDraw(SkCanvas* canvas) { SkBitmap src = make_src(); SkBitmap dst = make_dst(); const SkScalar one = SK_Scalar1; static const SkScalar K[] = { 0, 0, 0, 0, 0, 0, 0, one, 0, one, 0, 0, 0, 0, one, 0, 0, one, one, 0, 0, one, -one, 0, 0, one/2, one/2, 0, 0, one/2, one/2, one/4, 0, one/2, one/2, -one/4, one/4, one/2, one/2, 0, -one/4, one/2, one/2, 0, }; const SkScalar* k = K; const SkScalar* stop = k + SK_ARRAY_COUNT(K); SkScalar y = 0; SkScalar gap = SkIntToScalar(src.width() + 20); while (k < stop) { SkScalar x = 0; canvas->drawBitmap(src, x, y, nullptr); x += gap; canvas->drawBitmap(dst, x, y, nullptr); x += gap; SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH)); canvas->saveLayer(&rect, nullptr); canvas->drawBitmap(dst, x, y, nullptr); SkXfermode* xfer = SkArithmeticMode::Create(k[0], k[1], k[2], k[3]); SkPaint paint; paint.setXfermode(xfer)->unref(); canvas->drawBitmap(src, x, y, &paint); canvas->restore(); x += gap; show_k_text(canvas, x, y, k); k += 4; y += SkIntToScalar(src.height() + 12); } // Draw two special cases to test enforcePMColor. In these cases, we // draw the dst bitmap twice, the first time it is halved and inverted, // leading to invalid premultiplied colors. If we enforcePMColor, these // invalid values should be clamped, and will not contribute to the // second draw. for (int i = 0; i < 2; i++) { const bool enforcePMColor = (i == 0); SkScalar x = gap; canvas->drawBitmap(dst, x, y, nullptr); x += gap; SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(WW), SkIntToScalar(HH)); canvas->saveLayer(&rect, nullptr); SkXfermode* xfer1 = SkArithmeticMode::Create(0, -one / 2, 0, 1, enforcePMColor); SkPaint paint1; paint1.setXfermode(xfer1)->unref(); canvas->drawBitmap(dst, x, y, &paint1); SkXfermode* xfer2 = SkArithmeticMode::Create(0, one / 2, -one, 1); SkPaint paint2; paint2.setXfermode(xfer2)->unref(); canvas->drawBitmap(dst, x, y, &paint2); canvas->restore(); x += gap; // Label SkPaint paint; paint.setTextSize(SkIntToScalar(24)); paint.setAntiAlias(true); sk_tool_utils::set_portable_typeface(&paint); SkString str(enforcePMColor ? "enforcePM" : "no enforcePM"); canvas->drawText(str.c_str(), str.size(), x, y + paint.getTextSize(), paint); y += SkIntToScalar(src.height() + 12); } }