skia2/include/utils/SkNoDrawCanvas.h
Michael Ludwig b0cee9bf9a Remove drawBitmap et al. from SkDevice
SkCanvas keeps its non-exotic drawBitmap calls for now but they
immediately wrap the bitmap in SkImage::MakeFromBitmap. This will
add a copy for mutable bitmaps, but this can be worked around by using
images directly (preferred), or marking the bitmap as immutable. In
practice, mutable bitmaps do not seem to be widely used so this is
deemed acceptable for now.

Several GMs are updated to mark the bitmaps as immutable in order to
avoid pixel churn in how CPU vs. GPU mipmaps are generated. As we move
towards explicit mipmap generation, this distinction will become less
critical, so I'm just avoiding it for now. See skbug.com/9337 for mipmap
proposal. The image diffs encountered in this CL directly related to
generating mipmaps for bitmaps already cached on the GPU vs. not on the
GPU yet.

It was decided to copy if mutable vs. never copying the bitmap because
it preserves the image guarantees the devices and canvas' rely on,
and imposing the need to inspect an image for mutability is undesired.

Bug: skia:10037, skia:9337
Change-Id: If152e6cae1e155ccf6bd2cd755895f3c7a0135a5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/276004
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
2020-03-12 15:28:00 +00:00

84 lines
3.8 KiB
C++

/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkNoDrawCanvas_DEFINED
#define SkNoDrawCanvas_DEFINED
#include "include/core/SkCanvas.h"
#include "include/core/SkCanvasVirtualEnforcer.h"
#include "include/core/SkVertices.h"
struct SkIRect;
// SkNoDrawCanvas is a helper for SkCanvas subclasses which do not need to
// actually rasterize (e.g., analysis of the draw calls).
//
// It provides the following simplifications:
//
// * not backed by any device/pixels
// * conservative clipping (clipping calls only use rectangles)
//
class SK_API SkNoDrawCanvas : public SkCanvasVirtualEnforcer<SkCanvas> {
public:
SkNoDrawCanvas(int width, int height);
SkNoDrawCanvas(const SkIRect&);
explicit SkNoDrawCanvas(sk_sp<SkBaseDevice> device);
// Optimization to reset state to be the same as after construction.
void resetCanvas(int w, int h) { this->resetForNextPicture(SkIRect::MakeWH(w, h)); }
void resetCanvas(const SkIRect& rect) { this->resetForNextPicture(rect); }
protected:
SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override;
bool onDoSaveBehind(const SkRect*) override;
// No-op overrides for aborting rasterization earlier than SkNullBlitter.
void onDrawAnnotation(const SkRect&, const char[], SkData*) override {}
void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override {}
void onDrawDrawable(SkDrawable*, const SkMatrix*) override {}
void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint&) override {}
void onDrawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4], SkBlendMode,
const SkPaint&) override {}
void onDrawPaint(const SkPaint&) override {}
void onDrawBehind(const SkPaint&) override {}
void onDrawPoints(PointMode, size_t, const SkPoint[], const SkPaint&) override {}
void onDrawRect(const SkRect&, const SkPaint&) override {}
void onDrawRegion(const SkRegion&, const SkPaint&) override {}
void onDrawOval(const SkRect&, const SkPaint&) override {}
void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override {}
void onDrawRRect(const SkRRect&, const SkPaint&) override {}
void onDrawPath(const SkPath&, const SkPaint&) override {}
void onDrawImage(const SkImage*, SkScalar, SkScalar, const SkPaint*) override {}
void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
SrcRectConstraint) override {}
void onDrawImageNine(const SkImage*, const SkIRect&, const SkRect&, const SkPaint*) override {}
void onDrawImageLattice(const SkImage*, const Lattice&, const SkRect&,
const SkPaint*) override {}
#ifdef SK_SUPPORT_LEGACY_DRAWVERTS_VIRTUAL
void onDrawVerticesObject(const SkVertices*, const SkVertices::Bone bones[], int boneCount,
SkBlendMode, const SkPaint&) override {}
#else
void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override {}
#endif
void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
int, SkBlendMode, const SkRect*, const SkPaint*) override {}
void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override {}
void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override {}
void onDrawEdgeAAQuad(const SkRect&, const SkPoint[4], QuadAAFlags, const SkColor4f&,
SkBlendMode) override {}
void onDrawEdgeAAImageSet(const ImageSetEntry[], int, const SkPoint[],
const SkMatrix[], const SkPaint*, SrcRectConstraint) override {}
private:
typedef SkCanvasVirtualEnforcer<SkCanvas> INHERITED;
};
#endif // SkNoDrawCanvas_DEFINED