static void draw_savelayer_with_paint(const SkIPoint& off, SkCanvas* canvas, const SkPaint& p) { SkPaint redStroked; redStroked.setColor(SK_ColorRED); redStroked.setStyle(SkPaint::kStroke_Style); SkPaint blueStroked; blueStroked.setColor(SK_ColorBLUE); blueStroked.setStyle(SkPaint::kStroke_Style); const SkRect bounds = SkRect::MakeWH(10, 10); SkRect storage; canvas->save(); canvas->translate(30, 30); canvas->translate(SkIntToScalar(off.fX), SkIntToScalar(off.fY)); canvas->scale(1.5f, 1.5f); const SkRect& fastBound = p.computeFastBounds(bounds, &storage); canvas->saveLayer(&fastBound, &p); canvas->restore(); canvas->drawRect(bounds, redStroked); canvas->drawRect(fastBound, blueStroked); canvas->restore(); }
void OpaqueRegionSkia::didDrawPoints(const PlatformContextSkia* context, const AffineTransform& transform, SkCanvas::PointMode mode, int numPoints, const SkPoint points[], const SkPaint& paint) { if (!numPoints) return; SkRect rect; rect.fLeft = points[0].fX; rect.fRight = points[0].fX + 1; rect.fTop = points[0].fY; rect.fBottom = points[0].fY + 1; for (int i = 1; i < numPoints; ++i) { rect.fLeft = std::min(rect.fLeft, points[i].fX); rect.fRight = std::max(rect.fRight, points[i].fX + 1); rect.fTop = std::min(rect.fTop, points[i].fY); rect.fBottom = std::max(rect.fBottom, points[i].fY + 1); } bool opaque = paintIsOpaque(paint); bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint, opaque); else { rect = paint.computeFastBounds(rect, &rect); didDraw(context, transform, rect, paint, opaque, fillsBounds); } }
static void draw_geom_with_paint(drawMth draw, const SkIPoint& off, SkCanvas* canvas, const SkPaint& p) { SkPaint redStroked; redStroked.setColor(SK_ColorRED); redStroked.setStyle(SkPaint::kStroke_Style); SkPaint blueStroked; blueStroked.setColor(SK_ColorBLUE); blueStroked.setStyle(SkPaint::kStroke_Style); const SkRect r = SkRect::MakeLTRB(20, 20, 30, 30); SkRect storage; canvas->save(); canvas->translate(SkIntToScalar(off.fX), SkIntToScalar(off.fY)); canvas->scale(1.5f, 1.5f); const SkRect& fastBound = p.computeFastBounds(r, &storage); canvas->save(); canvas->clipRect(fastBound); (*draw)(canvas, r, p); canvas->restore(); canvas->drawRect(r, redStroked); canvas->drawRect(fastBound, blueStroked); canvas->restore(); }
void OpaqueRegionSkia::didDrawPoints(const GraphicsContext* context, SkCanvas::PointMode mode, int numPoints, const SkPoint points[], const SkPaint& paint) { if (!numPoints) return; SkRect rect; rect.fLeft = points[0].fX; rect.fRight = points[0].fX + 1; rect.fTop = points[0].fY; rect.fBottom = points[0].fY + 1; for (int i = 1; i < numPoints; ++i) { rect.fLeft = std::min(rect.fLeft, points[i].fX); rect.fRight = std::max(rect.fRight, points[i].fX + 1); rect.fTop = std::min(rect.fTop, points[i].fY); rect.fBottom = std::max(rect.fBottom, points[i].fY + 1); } bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(context, paint, FillOrStroke); else { rect = paint.computeFastBounds(rect, &rect); didDraw(context, rect, paint, 0, fillsBounds, FillOrStroke); } }
// Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been // tweaked by paint.computeFastBounds(). // static void computeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) { SkPaint::FontMetrics metrics; paint.getFontMetrics(&metrics); SkRect bounds; // construct a rect so we can see any adjustments from the paint. // we use 0,1 for left,right, just so the rect isn't empty bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); (void)paint.computeFastBounds(bounds, &bounds); topbot[0] = bounds.fTop; topbot[1] = bounds.fBottom; }
void OpaqueRegionSkia::didDrawBounded(const PlatformContextSkia* context, const SkRect& bounds, const SkPaint& paint) { bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint); else { SkRect rect; rect = paint.computeFastBounds(bounds, &rect); didDraw(context, rect, paint, 0, fillsBounds, FillOrStroke); } }
void OpaqueRegionSkia::didDrawBounded(const PlatformContextSkia* context, const AffineTransform& transform, const SkRect& bounds, const SkPaint& paint) { bool opaque = paintIsOpaque(paint); bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint, opaque); else { SkRect rect; rect = paint.computeFastBounds(bounds, &rect); didDraw(context, transform, rect, paint, opaque, fillsBounds); } }
void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, SkScalar baselineY) { SkPaint::FontMetrics metrics; paint.getFontMetrics(&metrics); SkRect bounds; // construct a rect so we can see any adjustments from the paint. // we use 0,1 for left,right, just so the rect isn't empty bounds.set(0, metrics.fTop + baselineY, SK_Scalar1, metrics.fBottom + baselineY); (void)paint.computeFastBounds(bounds, &bounds); // now record the top and bottom addScalar(bounds.fTop); addScalar(bounds.fBottom); }
void OpaqueRegionSkia::didDrawPath(const PlatformContextSkia* context, const SkPath& path, const SkPaint& paint) { SkRect rect; if (path.isRect(&rect)) { didDrawRect(context, rect, paint, 0); return; } bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint); else { rect = paint.computeFastBounds(path.getBounds(), &rect); didDraw(context, rect, paint, 0, fillsBounds, FillOrStroke); } }
void OpaqueRegionSkia::didDrawPath(const PlatformContextSkia* context, const AffineTransform& transform, const SkPath& path, const SkPaint& paint) { SkRect rect; if (path.isRect(&rect)) { didDrawRect(context, transform, rect, paint, 0); return; } bool opaque = paintIsOpaque(paint); bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint, opaque); else { rect = paint.computeFastBounds(path.getBounds(), &rect); didDraw(context, transform, rect, paint, opaque, fillsBounds); } }
void OpaqueRegionSkia::didDrawRect(const PlatformContextSkia* context, const SkRect& fillRect, const SkPaint& paint, const SkBitmap* sourceBitmap) { // Any stroking may put alpha in pixels even if the filling part does not. if (paint.getStyle() != SkPaint::kFill_Style) { bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint); else { SkRect strokeRect; strokeRect = paint.computeFastBounds(fillRect, &strokeRect); didDraw(context, strokeRect, paint, sourceBitmap, fillsBounds, FillOrStroke); } } bool fillsBounds = paint.getStyle() != SkPaint::kStroke_Style; didDraw(context, fillRect, paint, sourceBitmap, fillsBounds, FillOnly); }
void OpaqueRegionSkia::didDrawRect(const PlatformContextSkia* context, const AffineTransform& transform, const SkRect& fillRect, const SkPaint& paint, const SkBitmap* bitmap) { // Any stroking may put alpha in pixels even if the filling part does not. if (paint.getStyle() != SkPaint::kFill_Style) { bool opaque = paintIsOpaque(paint, bitmap); bool fillsBounds = false; if (!paint.canComputeFastBounds()) didDrawUnbounded(paint, opaque); else { SkRect strokeRect; strokeRect = paint.computeFastBounds(fillRect, &strokeRect); didDraw(context, transform, strokeRect, paint, opaque, fillsBounds); } } bool checkFillOnly = true; bool opaque = paintIsOpaque(paint, bitmap, checkFillOnly); bool fillsBounds = paint.getStyle() != SkPaint::kStroke_Style; didDraw(context, transform, fillRect, paint, opaque, fillsBounds); }