SkGpuDevice.h revision 1a8ddf0a35bfb6c21a1184f81d2fdd50053acf31
1 2/* 3 * Copyright 2010 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 11#ifndef SkGpuDevice_DEFINED 12#define SkGpuDevice_DEFINED 13 14#include "SkGr.h" 15#include "SkBitmap.h" 16#include "SkDevice.h" 17#include "SkRegion.h" 18#include "GrContext.h" 19 20struct SkDrawProcs; 21struct GrSkDrawProcs; 22class GrTextContext; 23 24/** 25 * Subclass of SkDevice, which directs all drawing to the GrGpu owned by the 26 * canvas. 27 */ 28class SK_API SkGpuDevice : public SkDevice { 29public: 30 /** 31 * New device that will create an offscreen renderTarget based on the 32 * config, width, height. 33 * 34 * usage is a special flag that should only be set by SkCanvas 35 * internally. 36 */ 37 SkGpuDevice(GrContext*, SkBitmap::Config, 38 int width, int height, 39 SkDevice::Usage usage = SkDevice::kGeneral_Usage); 40 41 /** 42 * New device that will render to the specified renderTarget. 43 */ 44 SkGpuDevice(GrContext*, GrRenderTarget*); 45 46 /** 47 * New device that will render to the texture (as a rendertarget). 48 * The GrTexture's asRenderTarget() must be non-NULL or device will not 49 * function. 50 */ 51 SkGpuDevice(GrContext*, GrTexture*); 52 53 virtual ~SkGpuDevice(); 54 55 GrContext* context() const { return fContext; } 56 57 /** 58 * Override from SkGpuDevice, so we can set our FBO to be the render target 59 * The canvas parameter must be a SkGpuCanvas 60 */ 61 virtual void gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&, 62 const SkClipStack& clipStack); 63 64 virtual SkGpuRenderTarget* accessRenderTarget() { 65 return (SkGpuRenderTarget*)fRenderTarget; 66 } 67 68 // overrides from SkDevice 69 70 virtual void clear(SkColor color); 71 virtual void writePixels(const SkBitmap& bitmap, int x, int y); 72 73 virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip, 74 const SkClipStack&); 75 76 virtual void drawPaint(const SkDraw&, const SkPaint& paint); 77 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count, 78 const SkPoint[], const SkPaint& paint); 79 virtual void drawRect(const SkDraw&, const SkRect& r, 80 const SkPaint& paint); 81 virtual void drawPath(const SkDraw&, const SkPath& path, 82 const SkPaint& paint, const SkMatrix* prePathMatrix, 83 bool pathIsMutable); 84 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap, 85 const SkIRect* srcRectOrNull, 86 const SkMatrix& matrix, const SkPaint& paint); 87 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap, 88 int x, int y, const SkPaint& paint); 89 virtual void drawText(const SkDraw&, const void* text, size_t len, 90 SkScalar x, SkScalar y, const SkPaint& paint); 91 virtual void drawPosText(const SkDraw&, const void* text, size_t len, 92 const SkScalar pos[], SkScalar constY, 93 int scalarsPerPos, const SkPaint& paint); 94 virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, 95 const SkPath& path, const SkMatrix* matrix, 96 const SkPaint& paint); 97 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount, 98 const SkPoint verts[], const SkPoint texs[], 99 const SkColor colors[], SkXfermode* xmode, 100 const uint16_t indices[], int indexCount, 101 const SkPaint& paint); 102 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y, 103 const SkPaint&); 104 virtual bool filterTextFlags(const SkPaint& paint, TextFlags*); 105 106 virtual void flush() { fContext->flush(false); } 107 108 /** 109 * Make's this device's rendertarget current in the underlying 3D API. 110 * Also implicitly flushes. 111 */ 112 virtual void makeRenderTargetCurrent(); 113 114protected: 115 typedef GrContext::TextureCacheEntry TexCache; 116 enum TexType { 117 kBitmap_TexType, 118 kDeviceRenderTarget_TexType, 119 kSaveLayerDeviceRenderTarget_TexType 120 }; 121 TexCache lockCachedTexture(const SkBitmap& bitmap, 122 const GrSamplerState& sampler, 123 TexType type = kBitmap_TexType); 124 void unlockCachedTexture(TexCache); 125 126 class SkAutoCachedTexture { 127 public: 128 SkAutoCachedTexture(); 129 SkAutoCachedTexture(SkGpuDevice* device, 130 const SkBitmap& bitmap, 131 const GrSamplerState& sampler, 132 GrTexture** texture); 133 ~SkAutoCachedTexture(); 134 135 GrTexture* set(SkGpuDevice*, const SkBitmap&, const GrSamplerState&); 136 137 private: 138 SkGpuDevice* fDevice; 139 TexCache fTex; 140 }; 141 friend class SkAutoTexCache; 142 143 // overrides from SkDevice 144 virtual bool onReadPixels(const SkBitmap* bitmap, 145 int x, int y) SK_OVERRIDE; 146 147 148private: 149 GrContext* fContext; 150 151 GrSkDrawProcs* fDrawProcs; 152 153 // state for our offscreen render-target 154 TexCache fCache; 155 GrTexture* fTexture; 156 GrRenderTarget* fRenderTarget; 157 bool fNeedClear; 158 bool fNeedPrepareRenderTarget; 159 160 // called from rt and tex cons 161 void initFromRenderTarget(GrContext*, GrRenderTarget*); 162 163 // doesn't set the texture/sampler/matrix state 164 // caller needs to null out GrPaint's texture if 165 // non-textured drawing is desired. 166 // Set constantColor to true if a constant color 167 // will be used. This is an optimization, and can 168 // always be set to false. constantColor should 169 // never be true if justAlpha is true. 170 bool skPaint2GrPaintNoShader(const SkPaint& skPaint, 171 bool justAlpha, 172 GrPaint* grPaint, 173 bool constantColor); 174 175 // uses the SkShader to setup paint, act used to 176 // hold lock on cached texture and free it when 177 // destroyed. 178 // If there is no shader, constantColor will 179 // be passed to skPaint2GrPaintNoShader. Otherwise 180 // it is ignored. 181 bool skPaint2GrPaintShader(const SkPaint& skPaint, 182 SkAutoCachedTexture* act, 183 const SkMatrix& ctm, 184 GrPaint* grPaint, 185 bool constantColor); 186 187 // override from SkDevice 188 virtual SkDevice* onCreateCompatibleDevice(SkBitmap::Config config, 189 int width, int height, 190 bool isOpaque, 191 Usage usage); 192 193 SkDrawProcs* initDrawForText(GrTextContext*); 194 bool bindDeviceAsTexture(GrPaint* paint); 195 196 void prepareRenderTarget(const SkDraw&); 197 void internalDrawBitmap(const SkDraw&, const SkBitmap&, 198 const SkIRect&, const SkMatrix&, GrPaint* grPaint); 199 200 typedef SkDevice INHERITED; 201}; 202 203#endif 204 205