virtual void onDraw(SkCanvas* canvas) { SkRect r; r.setWH(SkIntToScalar(fRectWidth), SkIntToScalar(fRectHeight)); SkISize canvas_size = canvas->getDeviceSize(); int center_x = (canvas_size.fWidth - (int)(r.width()))/2; int center_y = (canvas_size.fHeight - (int)(r.height()))/2; SkMask mask; if (!this->makeMask(&mask, r)) { SkPaint paint; r.offset( SkIntToScalar(center_x), SkIntToScalar(center_y) ); canvas->drawRect(r,paint); return; } SkAutoMaskFreeImage amfi(mask.fImage); SkBitmap bm; bm.installMaskPixels(mask); center_x = (canvas_size.fWidth - mask.fBounds.width())/2; center_y = (canvas_size.fHeight - mask.fBounds.height())/2; canvas->drawBitmap(bm, SkIntToScalar(center_x), SkIntToScalar(center_y), NULL); }
virtual void onDraw(SkCanvas* canvas) { const int widths[] = {25, 5, 5, 100, 150, 25}; const int heights[] = {100, 100, 5, 25, 150, 25}; const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle}; const float radii[] = {20, 5, 10}; canvas->translate(50,20); int cur_x = 0; int cur_y = 0; int max_height = 0; for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) { int width = widths[i]; int height = heights[i]; SkRect r; r.setWH(SkIntToScalar(width), SkIntToScalar(height)); SkAutoCanvasRestore autoRestore(canvas, true); for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) { float radius = radii[j]; for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) { SkBlurStyle style = styles[k]; SkMask mask; SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius), &mask, r, style); SkAutoMaskFreeImage amfi(mask.fImage); SkBitmap bm; bm.installMaskPixels(mask); if (cur_x + bm.width() >= fGMWidth - fMargin) { cur_x = 0; cur_y += max_height + fPadding; max_height = 0; } canvas->save(); canvas->translate((SkScalar)cur_x, (SkScalar)cur_y); canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2); canvas->drawBitmap(bm, 0.f, 0.f, NULL); canvas->restore(); cur_x += bm.width() + fPadding; if (bm.height() > max_height) max_height = bm.height(); } } } }
bool makeMask(SkMask *m, const SkRect& r) override { SkMask src; r.roundOut(&src.fBounds); src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin src.fFormat = SkMask::kA8_Format; src.fRowBytes = src.fBounds.width(); src.fImage = SkMask::AllocImage(src.computeTotalImageSize()); SkAutoMaskFreeImage amfi(src.fImage); memset(src.fImage, 0xff, src.computeTotalImageSize()); return SkBlurMask::BlurGroundTruth(SkBlurMask::ConvertRadiusToSigma(this->radius()), m, src, this->style()); }
static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { SkMask mask; SkBitmap bm; clip.copyToMask(&mask); SkAutoMaskFreeImage amfi(mask.fImage); bm.installMaskPixels(mask); SkPaint paint; canvas->drawBitmap(bm, SK_Scalar1 * mask.fBounds.fLeft, SK_Scalar1 * mask.fBounds.fTop, &paint); }
static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { SkMask mask; SkBitmap bm; clip.copyToMask(&mask); SkAutoMaskFreeImage amfi(mask.fImage); bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(), mask.fBounds.height(), mask.fRowBytes); bm.setPixels(mask.fImage); SkPaint paint; canvas->drawBitmap(bm, SK_Scalar1 * mask.fBounds.fLeft, SK_Scalar1 * mask.fBounds.fTop, &paint); }