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); } }
void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { size_t points = paint.countText(text, byteLength); if (0 == points) return; bool fast = paint.canComputeFastBounds(); addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRAW_POS_TEXT_H); addPaint(paint); addText(text, byteLength); addInt(points); #ifdef SK_DEBUG_SIZE size_t start = fWriter.size(); #endif if (fast) { addFontMetricsTopBottom(paint, constY); } addScalar(constY); fWriter.writeMul4(xpos, points * sizeof(SkScalar)); #ifdef SK_DEBUG_SIZE fPointBytes += fWriter.size() - start; fPointWrites += points; #endif validate(); }
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); } }
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::drawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint) { size_t points = paint.countText(text, byteLength); if (0 == points) return; bool canUseDrawH = true; // check if the caller really should have used drawPosTextH() { const SkScalar firstY = pos[0].fY; for (size_t index = 1; index < points; index++) { if (pos[index].fY != firstY) { canUseDrawH = false; break; } } } bool fast = canUseDrawH && paint.canComputeFastBounds(); if (fast) { addDraw(DRAW_POS_TEXT_H_TOP_BOTTOM); } else { addDraw(canUseDrawH ? DRAW_POS_TEXT_H : DRAW_POS_TEXT); } addPaint(paint); addText(text, byteLength); addInt(points); #ifdef SK_DEBUG_SIZE size_t start = fWriter.size(); #endif if (canUseDrawH) { if (fast) { addFontMetricsTopBottom(paint, pos[0].fY); } addScalar(pos[0].fY); SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); for (size_t index = 0; index < points; index++) *xptr++ = pos[index].fX; } else { fWriter.writeMul4(pos, points * sizeof(SkPoint)); } #ifdef SK_DEBUG_SIZE fPointBytes += fWriter.size() - start; fPointWrites += points; #endif validate(); }
void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { bool fast = paint.canComputeFastBounds(); addDraw(fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT); addPaint(paint); addText(text, byteLength); addScalar(x); addScalar(y); if (fast) { addFontMetricsTopBottom(paint, y); } validate(); }
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); }