1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkBitmapDevice_DEFINED 9 #define SkBitmapDevice_DEFINED 10 11 #include "SkBitmap.h" 12 #include "SkCanvas.h" 13 #include "SkColor.h" 14 #include "SkDevice.h" 15 #include "SkImageInfo.h" 16 #include "SkPixelRef.h" 17 #include "SkRasterClip.h" 18 #include "SkRasterClipStack.h" 19 #include "SkRect.h" 20 #include "SkScalar.h" 21 #include "SkSize.h" 22 #include "SkSurfaceProps.h" 23 24 class SkImageFilterCache; 25 class SkMatrix; 26 class SkPaint; 27 class SkPath; 28 class SkPixelRef; 29 class SkPixmap; 30 class SkRasterHandleAllocator; 31 class SkRRect; 32 class SkSurface; 33 struct SkPoint; 34 35 /////////////////////////////////////////////////////////////////////////////// 36 class SK_API SkBitmapDevice : public SkBaseDevice { 37 public: 38 /** 39 * Construct a new device with the specified bitmap as its backend. It is 40 * valid for the bitmap to have no pixels associated with it. In that case, 41 * any drawing to this device will have no effect. 42 */ 43 SkBitmapDevice(const SkBitmap& bitmap); 44 45 /** 46 * Create a new device along with its requisite pixel memory using 47 * default SkSurfaceProps (i.e., kLegacyFontHost_InitType-style). 48 * Note: this entry point is slated for removal - no one should call it. 49 */ 50 static SkBitmapDevice* Create(const SkImageInfo& info); 51 52 /** 53 * Construct a new device with the specified bitmap as its backend. It is 54 * valid for the bitmap to have no pixels associated with it. In that case, 55 * any drawing to this device will have no effect. 56 */ 57 SkBitmapDevice(const SkBitmap& bitmap, const SkSurfaceProps& surfaceProps, 58 void* externalHandle = nullptr); 59 60 static SkBitmapDevice* Create(const SkImageInfo&, const SkSurfaceProps&, 61 SkRasterHandleAllocator* = nullptr); 62 63 protected: 64 bool onShouldDisableLCD(const SkPaint&) const override; getRasterHandle()65 void* getRasterHandle() const override { return fRasterHandle; } 66 67 /** These are called inside the per-device-layer loop for each draw call. 68 When these are called, we have already applied any saveLayer operations, 69 and are handling any looping from the paint, and any effects from the 70 DrawFilter. 71 */ 72 void drawPaint(const SkPaint& paint) override; 73 void drawPoints(SkCanvas::PointMode mode, size_t count, 74 const SkPoint[], const SkPaint& paint) override; 75 void drawRect(const SkRect& r, const SkPaint& paint) override; 76 void drawOval(const SkRect& oval, const SkPaint& paint) override; 77 void drawRRect(const SkRRect& rr, const SkPaint& paint) override; 78 79 /** 80 * If pathIsMutable, then the implementation is allowed to cast path to a 81 * non-const pointer and modify it in place (as an optimization). Canvas 82 * may do this to implement helpers such as drawOval, by placing a temp 83 * path on the stack to hold the representation of the oval. 84 * 85 * If prePathMatrix is not null, it should logically be applied before any 86 * stroking or other effects. If there are no effects on the paint that 87 * affect the geometry/rasterization, then the pre matrix can just be 88 * pre-concated with the current matrix. 89 */ 90 void drawPath(const SkPath&, const SkPaint&, const SkMatrix* prePathMatrix, 91 bool pathIsMutable) override; 92 void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) override; 93 void drawSprite(const SkBitmap&, int x, int y, const SkPaint&) override; 94 95 /** 96 * The default impl. will create a bitmap-shader from the bitmap, 97 * and call drawRect with it. 98 */ 99 void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, 100 const SkPaint&, SkCanvas::SrcRectConstraint) override; 101 102 /** 103 * Does not handle text decoration. 104 * Decorations (underline and stike-thru) will be handled by SkCanvas. 105 */ 106 void drawText(const void* text, size_t len, SkScalar x, SkScalar y, 107 const SkPaint&) override; 108 void drawPosText(const void* text, size_t len, const SkScalar pos[], 109 int scalarsPerPos, const SkPoint& offset, const SkPaint& paint) override; 110 void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override; 111 void drawDevice(SkBaseDevice*, int x, int y, const SkPaint&) override; 112 113 /////////////////////////////////////////////////////////////////////////// 114 115 void drawSpecial(SkSpecialImage*, int x, int y, const SkPaint&) override; 116 sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override; 117 sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override; 118 sk_sp<SkSpecialImage> snapSpecial() override; 119 120 /////////////////////////////////////////////////////////////////////////// 121 122 bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) override; 123 bool onWritePixels(const SkImageInfo&, const void*, size_t, int, int) override; 124 bool onPeekPixels(SkPixmap*) override; 125 bool onAccessPixels(SkPixmap*) override; 126 127 void onSave() override; 128 void onRestore() override; 129 void onClipRect(const SkRect& rect, SkClipOp, bool aa) override; 130 void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override; 131 void onClipPath(const SkPath& path, SkClipOp, bool aa) override; 132 void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override; 133 void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override; 134 bool onClipIsAA() const override; 135 void onAsRgnClip(SkRegion*) const override; 136 void validateDevBounds(const SkIRect& r) override; 137 ClipType onGetClipType() const override; 138 139 private: 140 friend class SkCanvas; 141 friend struct DeviceCM; //for setMatrixClip 142 friend class SkDraw; 143 friend class SkDrawIter; 144 friend class SkDeviceFilteredPaint; 145 friend class SkSurface_Raster; 146 147 class BDDraw; 148 149 // used to change the backend's pixels (and possibly config/rowbytes) 150 // but cannot change the width/height, so there should be no change to 151 // any clip information. 152 void replaceBitmapBackendForRasterSurface(const SkBitmap&) override; 153 154 SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override; 155 156 sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override; 157 158 SkImageFilterCache* getImageFilterCache() override; 159 160 SkBitmap fBitmap; 161 void* fRasterHandle = nullptr; 162 SkRasterClipStack fRCStack; 163 164 typedef SkBaseDevice INHERITED; 165 }; 166 167 #endif // SkBitmapDevice_DEFINED 168