virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE;
- /**
- * Make's this device's rendertarget current in the underlying 3D API.
- * Also implicitly flushes.
- */
- virtual void makeRenderTargetCurrent();
-
virtual bool canHandleImageFilter(const SkImageFilter*) SK_OVERRIDE;
virtual bool filterImage(const SkImageFilter*, const SkBitmap&,
const SkImageFilter::Context&,
// remove when our clients don't rely on accessBitmap()
SkBitmap fLegacyBitmap;
- SkGpuDevice(GrContext*, GrRenderTarget*, unsigned flags = 0);
-
- SkGpuDevice(GrContext*, GrTexture*, unsigned flags = 0);
-
- // called from rt and tex cons
- void initFromRenderTarget(GrContext*, GrRenderTarget*, unsigned flags);
+ SkGpuDevice(GrSurface*, unsigned flags = 0);
virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE;
SkGpuDevice* SkGpuDevice::Create(GrSurface* surface, unsigned flags) {
SkASSERT(NULL != surface);
- if (NULL == surface->asRenderTarget() || NULL == surface->getContext()) {
+ if (NULL == surface->asRenderTarget() || surface->wasDestroyed()) {
return NULL;
}
- if (surface->asTexture()) {
- return SkNEW_ARGS(SkGpuDevice, (surface->getContext(), surface->asTexture(), flags));
- } else {
- return SkNEW_ARGS(SkGpuDevice, (surface->getContext(), surface->asRenderTarget(), flags));
- }
-}
-
-SkGpuDevice::SkGpuDevice(GrContext* context, GrTexture* texture, unsigned flags) {
- this->initFromRenderTarget(context, texture->asRenderTarget(), flags);
+ return SkNEW_ARGS(SkGpuDevice, (surface, flags));
}
-SkGpuDevice::SkGpuDevice(GrContext* context, GrRenderTarget* renderTarget, unsigned flags) {
- this->initFromRenderTarget(context, renderTarget, flags);
-}
+SkGpuDevice::SkGpuDevice(GrSurface* surface, unsigned flags) {
-void SkGpuDevice::initFromRenderTarget(GrContext* context,
- GrRenderTarget* renderTarget,
- unsigned flags) {
fDrawProcs = NULL;
- fContext = context;
- fContext->ref();
+ fContext = SkRef(surface->getContext());
- fRenderTarget = NULL;
fNeedClear = flags & kNeedClear_Flag;
- SkASSERT(NULL != renderTarget);
- fRenderTarget = renderTarget;
- fRenderTarget->ref();
+ fRenderTarget = SkRef(surface->asRenderTarget());
// Hold onto to the texture in the pixel ref (if there is one) because the texture holds a ref
// on the RT but not vice-versa.
// TODO: Remove this trickery once we figure out how to make SkGrPixelRef do this without
// busting chrome (for a currently unknown reason).
- GrSurface* surface = fRenderTarget->asTexture();
+ surface = fRenderTarget->asTexture();
if (NULL == surface) {
surface = fRenderTarget;
}
return NULL;
}
- return SkNEW_ARGS(SkGpuDevice, (context, texture.get()));
+ return SkNEW_ARGS(SkGpuDevice, (texture.get()));
}
SkGpuDevice::~SkGpuDevice() {
fContext->setClip(NULL);
}
- SkSafeUnref(fRenderTarget);
+ fRenderTarget->unref();
fContext->unref();
}
///////////////////////////////////////////////////////////////////////////////
-void SkGpuDevice::makeRenderTargetCurrent() {
- DO_DEFERRED_CLEAR();
- fContext->setRenderTarget(fRenderTarget);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
int x, int y) {
DO_DEFERRED_CLEAR();