19241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com/* 29241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * Copyright 2013 Google Inc. 39241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * 49241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 59241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * found in the LICENSE file. 69241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com */ 79241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com 89241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#ifndef SkBitmapDevice_DEFINED 99241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#define SkBitmapDevice_DEFINED 109241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com 11986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkBitmap.h" 12986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkCanvas.h" 13986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkColor.h" 14986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkDevice.h" 15986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkImageInfo.h" 16986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkPixelRef.h" 177627fa51044e35dc21251f925b56f6dd6887df97Mike Reed#include "SkRasterClip.h" 18c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed#include "SkRasterClipStack.h" 19986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkRect.h" 20986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkScalar.h" 21986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkSize.h" 22986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkSurfaceProps.h" 23986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 24986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkImageFilterCache; 25986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkMatrix; 26986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPaint; 27986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPath; 28986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPixelRef; 29986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPixmap; 30986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkRasterHandleAllocator; 31986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkRRect; 32986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkSurface; 33986480a71f4e860663ced7ad90a1fe346a164afbMike Reedstruct SkPoint; 34986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 35986480a71f4e860663ced7ad90a1fe346a164afbMike Reed/////////////////////////////////////////////////////////////////////////////// 36986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SK_API SkBitmapDevice : public SkBaseDevice { 37986480a71f4e860663ced7ad90a1fe346a164afbMike Reedpublic: 38986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 39986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Construct a new device with the specified bitmap as its backend. It is 40986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * valid for the bitmap to have no pixels associated with it. In that case, 41986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * any drawing to this device will have no effect. 42986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 43986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkBitmapDevice(const SkBitmap& bitmap); 44986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 45986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 46986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Create a new device along with its requisite pixel memory using 47986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * default SkSurfaceProps (i.e., kLegacyFontHost_InitType-style). 48986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Note: this entry point is slated for removal - no one should call it. 49986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 50986480a71f4e860663ced7ad90a1fe346a164afbMike Reed static SkBitmapDevice* Create(const SkImageInfo& info); 51986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 52986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 53986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Construct a new device with the specified bitmap as its backend. It is 54986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * valid for the bitmap to have no pixels associated with it. In that case, 55986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * any drawing to this device will have no effect. 56986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 57986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkBitmapDevice(const SkBitmap& bitmap, const SkSurfaceProps& surfaceProps, 58986480a71f4e860663ced7ad90a1fe346a164afbMike Reed void* externalHandle = nullptr); 59986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 60986480a71f4e860663ced7ad90a1fe346a164afbMike Reed static SkBitmapDevice* Create(const SkImageInfo&, const SkSurfaceProps&, 61986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkRasterHandleAllocator* = nullptr); 62986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 63986480a71f4e860663ced7ad90a1fe346a164afbMike Reedprotected: 64986480a71f4e860663ced7ad90a1fe346a164afbMike Reed bool onShouldDisableLCD(const SkPaint&) const override; 65986480a71f4e860663ced7ad90a1fe346a164afbMike Reed void* getRasterHandle() const override { return fRasterHandle; } 66986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 67986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** These are called inside the per-device-layer loop for each draw call. 68986480a71f4e860663ced7ad90a1fe346a164afbMike Reed When these are called, we have already applied any saveLayer operations, 69986480a71f4e860663ced7ad90a1fe346a164afbMike Reed and are handling any looping from the paint, and any effects from the 70986480a71f4e860663ced7ad90a1fe346a164afbMike Reed DrawFilter. 71986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 72a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawPaint(const SkPaint& paint) override; 73a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawPoints(SkCanvas::PointMode mode, size_t count, 74986480a71f4e860663ced7ad90a1fe346a164afbMike Reed const SkPoint[], const SkPaint& paint) override; 75a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawRect(const SkRect& r, const SkPaint& paint) override; 76a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawOval(const SkRect& oval, const SkPaint& paint) override; 77a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawRRect(const SkRRect& rr, const SkPaint& paint) override; 78986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 79986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 80986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * If pathIsMutable, then the implementation is allowed to cast path to a 81986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * non-const pointer and modify it in place (as an optimization). Canvas 82986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * may do this to implement helpers such as drawOval, by placing a temp 83986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * path on the stack to hold the representation of the oval. 84986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * 85986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * If prePathMatrix is not null, it should logically be applied before any 86986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * stroking or other effects. If there are no effects on the paint that 87986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * affect the geometry/rasterization, then the pre matrix can just be 88986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * pre-concated with the current matrix. 89986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 90a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawPath(const SkPath&, const SkPaint&, const SkMatrix* prePathMatrix, 911e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed bool pathIsMutable) override; 92a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) override; 93a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawSprite(const SkBitmap&, int x, int y, const SkPaint&) override; 94986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 95986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 96986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * The default impl. will create a bitmap-shader from the bitmap, 97986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * and call drawRect with it. 98986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 99a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, 100986480a71f4e860663ced7ad90a1fe346a164afbMike Reed const SkPaint&, SkCanvas::SrcRectConstraint) override; 101986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 102986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /** 103986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Does not handle text decoration. 104986480a71f4e860663ced7ad90a1fe346a164afbMike Reed * Decorations (underline and stike-thru) will be handled by SkCanvas. 105986480a71f4e860663ced7ad90a1fe346a164afbMike Reed */ 106a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawText(const void* text, size_t len, SkScalar x, SkScalar y, 1071e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed const SkPaint&) override; 108a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawPosText(const void* text, size_t len, const SkScalar pos[], 1091e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed int scalarsPerPos, const SkPoint& offset, const SkPaint& paint) override; 1102f6b5a47a50cdd218bc3302273be3a4a71add8fbMike Reed void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override; 111a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawDevice(SkBaseDevice*, int x, int y, const SkPaint&) override; 112986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 113986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /////////////////////////////////////////////////////////////////////////// 114986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 115a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void drawSpecial(SkSpecialImage*, int x, int y, const SkPaint&) override; 116986480a71f4e860663ced7ad90a1fe346a164afbMike Reed sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override; 117986480a71f4e860663ced7ad90a1fe346a164afbMike Reed sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override; 118986480a71f4e860663ced7ad90a1fe346a164afbMike Reed sk_sp<SkSpecialImage> snapSpecial() override; 119986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 120986480a71f4e860663ced7ad90a1fe346a164afbMike Reed /////////////////////////////////////////////////////////////////////////// 121986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 122986480a71f4e860663ced7ad90a1fe346a164afbMike Reed bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) override; 123986480a71f4e860663ced7ad90a1fe346a164afbMike Reed bool onWritePixels(const SkImageInfo&, const void*, size_t, int, int) override; 124986480a71f4e860663ced7ad90a1fe346a164afbMike Reed bool onPeekPixels(SkPixmap*) override; 125986480a71f4e860663ced7ad90a1fe346a164afbMike Reed bool onAccessPixels(SkPixmap*) override; 126986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 1277627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onSave() override; 1287627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onRestore() override; 1297627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onClipRect(const SkRect& rect, SkClipOp, bool aa) override; 1307627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override; 1317627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onClipPath(const SkPath& path, SkClipOp, bool aa) override; 1327627fa51044e35dc21251f925b56f6dd6887df97Mike Reed void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override; 133c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override; 134a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed bool onClipIsAA() const override; 135a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed void onAsRgnClip(SkRegion*) const override; 136c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed void validateDevBounds(const SkIRect& r) override; 137a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed ClipType onGetClipType() const override; 1387627fa51044e35dc21251f925b56f6dd6887df97Mike Reed 139986480a71f4e860663ced7ad90a1fe346a164afbMike Reedprivate: 140986480a71f4e860663ced7ad90a1fe346a164afbMike Reed friend class SkCanvas; 141986480a71f4e860663ced7ad90a1fe346a164afbMike Reed friend struct DeviceCM; //for setMatrixClip 142986480a71f4e860663ced7ad90a1fe346a164afbMike Reed friend class SkDraw; 143986480a71f4e860663ced7ad90a1fe346a164afbMike Reed friend class SkDrawIter; 144986480a71f4e860663ced7ad90a1fe346a164afbMike Reed friend class SkDeviceFilteredPaint; 14527d07f0acb85eea4062075dfbe9148ce12d92c66Mike Reed friend class SkSurface_Raster; 146025e2444c1f5a0c3cdc0bf60d1fa59941a0b5db4Mike Reed 147a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed class BDDraw; 148a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed 149986480a71f4e860663ced7ad90a1fe346a164afbMike Reed // used to change the backend's pixels (and possibly config/rowbytes) 150986480a71f4e860663ced7ad90a1fe346a164afbMike Reed // but cannot change the width/height, so there should be no change to 151986480a71f4e860663ced7ad90a1fe346a164afbMike Reed // any clip information. 152986480a71f4e860663ced7ad90a1fe346a164afbMike Reed void replaceBitmapBackendForRasterSurface(const SkBitmap&) override; 153986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 154986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override; 155986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 156986480a71f4e860663ced7ad90a1fe346a164afbMike Reed sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override; 157986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 158986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkImageFilterCache* getImageFilterCache() override; 159986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 160986480a71f4e860663ced7ad90a1fe346a164afbMike Reed SkBitmap fBitmap; 161986480a71f4e860663ced7ad90a1fe346a164afbMike Reed void* fRasterHandle = nullptr; 162c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed SkRasterClipStack fRCStack; 163986480a71f4e860663ced7ad90a1fe346a164afbMike Reed 164986480a71f4e860663ced7ad90a1fe346a164afbMike Reed typedef SkBaseDevice INHERITED; 165986480a71f4e860663ced7ad90a1fe346a164afbMike Reed}; 1669241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com 1679241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#endif // SkBitmapDevice_DEFINED 168