| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file | 5 * found in the LICENSE file |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkSpecialImage.h" | 9 #include "SkSpecialImage.h" |
| 10 #include "SkSpecialSurface.h" | 10 #include "SkSpecialSurface.h" |
| 11 #include "SkSurfacePriv.h" | 11 #include "SkSurfacePriv.h" |
| 12 | 12 |
| 13 /////////////////////////////////////////////////////////////////////////////// | 13 /////////////////////////////////////////////////////////////////////////////// |
| 14 class SkSpecialSurface_Base : public SkSpecialSurface { | 14 class SkSpecialSurface_Base : public SkSpecialSurface { |
| 15 public: | 15 public: |
| 16 SkSpecialSurface_Base(SkImageFilter::Proxy* proxy, | 16 SkSpecialSurface_Base(const SkIRect& subset, const SkSurfaceProps* props) |
| 17 const SkIRect& subset, const SkSurfaceProps* props) | 17 : INHERITED(subset, props) |
| 18 : INHERITED(proxy, subset, props) | |
| 19 , fCanvas(nullptr) { | 18 , fCanvas(nullptr) { |
| 20 } | 19 } |
| 21 | 20 |
| 22 virtual ~SkSpecialSurface_Base() { } | 21 virtual ~SkSpecialSurface_Base() { } |
| 23 | 22 |
| 24 // reset is called after an SkSpecialImage has been snapped | 23 // reset is called after an SkSpecialImage has been snapped |
| 25 void reset() { fCanvas.reset(); } | 24 void reset() { fCanvas.reset(); } |
| 26 | 25 |
| 27 // This can return nullptr if reset has already been called or something whe
n wrong in the ctor | 26 // This can return nullptr if reset has already been called or something whe
n wrong in the ctor |
| 28 SkCanvas* onGetCanvas() { return fCanvas; } | 27 SkCanvas* onGetCanvas() { return fCanvas; } |
| 29 | 28 |
| 30 virtual sk_sp<SkSpecialImage> onMakeImageSnapshot() = 0; | 29 virtual sk_sp<SkSpecialImage> onMakeImageSnapshot() = 0; |
| 31 | 30 |
| 32 protected: | 31 protected: |
| 33 SkAutoTUnref<SkCanvas> fCanvas; // initialized by derived classes in ctors | 32 SkAutoTUnref<SkCanvas> fCanvas; // initialized by derived classes in ctors |
| 34 | 33 |
| 35 private: | 34 private: |
| 36 typedef SkSpecialSurface INHERITED; | 35 typedef SkSpecialSurface INHERITED; |
| 37 }; | 36 }; |
| 38 | 37 |
| 39 /////////////////////////////////////////////////////////////////////////////// | 38 /////////////////////////////////////////////////////////////////////////////// |
| 40 static SkSpecialSurface_Base* as_SB(SkSpecialSurface* surface) { | 39 static SkSpecialSurface_Base* as_SB(SkSpecialSurface* surface) { |
| 41 return static_cast<SkSpecialSurface_Base*>(surface); | 40 return static_cast<SkSpecialSurface_Base*>(surface); |
| 42 } | 41 } |
| 43 | 42 |
| 44 SkSpecialSurface::SkSpecialSurface(SkImageFilter::Proxy* proxy, | 43 SkSpecialSurface::SkSpecialSurface(const SkIRect& subset, |
| 45 const SkIRect& subset, | |
| 46 const SkSurfaceProps* props) | 44 const SkSurfaceProps* props) |
| 47 : fProps(SkSurfacePropsCopyOrDefault(props).flags(), kUnknown_SkPixelGeometr
y) | 45 : fProps(SkSurfacePropsCopyOrDefault(props).flags(), kUnknown_SkPixelGeometr
y) |
| 48 , fSubset(subset) | 46 , fSubset(subset) { |
| 49 , fProxy(proxy) { | |
| 50 SkASSERT(fSubset.width() > 0); | 47 SkASSERT(fSubset.width() > 0); |
| 51 SkASSERT(fSubset.height() > 0); | 48 SkASSERT(fSubset.height() > 0); |
| 52 } | 49 } |
| 53 | 50 |
| 54 SkCanvas* SkSpecialSurface::getCanvas() { | 51 SkCanvas* SkSpecialSurface::getCanvas() { |
| 55 return as_SB(this)->onGetCanvas(); | 52 return as_SB(this)->onGetCanvas(); |
| 56 } | 53 } |
| 57 | 54 |
| 58 sk_sp<SkSpecialImage> SkSpecialSurface::makeImageSnapshot() { | 55 sk_sp<SkSpecialImage> SkSpecialSurface::makeImageSnapshot() { |
| 59 sk_sp<SkSpecialImage> image(as_SB(this)->onMakeImageSnapshot()); | 56 sk_sp<SkSpecialImage> image(as_SB(this)->onMakeImageSnapshot()); |
| 60 as_SB(this)->reset(); | 57 as_SB(this)->reset(); |
| 61 return image; // the caller gets the creation ref | 58 return image; // the caller gets the creation ref |
| 62 } | 59 } |
| 63 | 60 |
| 64 /////////////////////////////////////////////////////////////////////////////// | 61 /////////////////////////////////////////////////////////////////////////////// |
| 65 #include "SkMallocPixelRef.h" | 62 #include "SkMallocPixelRef.h" |
| 66 | 63 |
| 67 class SkSpecialSurface_Raster : public SkSpecialSurface_Base { | 64 class SkSpecialSurface_Raster : public SkSpecialSurface_Base { |
| 68 public: | 65 public: |
| 69 SkSpecialSurface_Raster(SkImageFilter::Proxy* proxy, | 66 SkSpecialSurface_Raster(SkPixelRef* pr, |
| 70 SkPixelRef* pr, | |
| 71 const SkIRect& subset, | 67 const SkIRect& subset, |
| 72 const SkSurfaceProps* props) | 68 const SkSurfaceProps* props) |
| 73 : INHERITED(proxy, subset, props) { | 69 : INHERITED(subset, props) { |
| 74 const SkImageInfo& info = pr->info(); | 70 const SkImageInfo& info = pr->info(); |
| 75 | 71 |
| 76 fBitmap.setInfo(info, info.minRowBytes()); | 72 fBitmap.setInfo(info, info.minRowBytes()); |
| 77 fBitmap.setPixelRef(pr); | 73 fBitmap.setPixelRef(pr); |
| 78 | 74 |
| 79 fCanvas.reset(new SkCanvas(fBitmap, this->props())); | 75 fCanvas.reset(new SkCanvas(fBitmap, this->props())); |
| 80 fCanvas->clipRect(SkRect::Make(subset)); | 76 fCanvas->clipRect(SkRect::Make(subset)); |
| 81 } | 77 } |
| 82 | 78 |
| 83 ~SkSpecialSurface_Raster() override { } | 79 ~SkSpecialSurface_Raster() override { } |
| 84 | 80 |
| 85 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { | 81 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { |
| 86 return SkSpecialImage::MakeFromRaster(this->proxy(), this->subset(), fBi
tmap, | 82 return SkSpecialImage::MakeFromRaster(this->subset(), fBitmap, &this->pr
ops()); |
| 87 &this->props()); | |
| 88 } | 83 } |
| 89 | 84 |
| 90 private: | 85 private: |
| 91 SkBitmap fBitmap; | 86 SkBitmap fBitmap; |
| 92 | 87 |
| 93 typedef SkSpecialSurface_Base INHERITED; | 88 typedef SkSpecialSurface_Base INHERITED; |
| 94 }; | 89 }; |
| 95 | 90 |
| 96 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromBitmap(SkImageFilter::Proxy* p
roxy, | 91 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromBitmap(const SkIRect& subset,
SkBitmap& bm, |
| 97 const SkIRect& subset,
SkBitmap& bm, | |
| 98 const SkSurfaceProps* p
rops) { | 92 const SkSurfaceProps* p
rops) { |
| 99 return sk_make_sp<SkSpecialSurface_Raster>(proxy, bm.pixelRef(), subset, pro
ps); | 93 return sk_make_sp<SkSpecialSurface_Raster>(bm.pixelRef(), subset, props); |
| 100 } | 94 } |
| 101 | 95 |
| 102 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(SkImageFilter::Proxy* proxy
, | 96 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(const SkImageInfo& info, |
| 103 const SkImageInfo& info, | |
| 104 const SkSurfaceProps* props
) { | 97 const SkSurfaceProps* props
) { |
| 105 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, 0, nullptr)); | 98 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, 0, nullptr)); |
| 106 if (nullptr == pr.get()) { | 99 if (nullptr == pr.get()) { |
| 107 return nullptr; | 100 return nullptr; |
| 108 } | 101 } |
| 109 | 102 |
| 110 const SkIRect subset = SkIRect::MakeWH(pr->info().width(), pr->info().height
()); | 103 const SkIRect subset = SkIRect::MakeWH(pr->info().width(), pr->info().height
()); |
| 111 | 104 |
| 112 return sk_make_sp<SkSpecialSurface_Raster>(proxy, pr, subset, props); | 105 return sk_make_sp<SkSpecialSurface_Raster>(pr, subset, props); |
| 113 } | 106 } |
| 114 | 107 |
| 115 #if SK_SUPPORT_GPU | 108 #if SK_SUPPORT_GPU |
| 116 /////////////////////////////////////////////////////////////////////////////// | 109 /////////////////////////////////////////////////////////////////////////////// |
| 117 #include "GrContext.h" | 110 #include "GrContext.h" |
| 118 #include "SkGpuDevice.h" | 111 #include "SkGpuDevice.h" |
| 119 | 112 |
| 120 class SkSpecialSurface_Gpu : public SkSpecialSurface_Base { | 113 class SkSpecialSurface_Gpu : public SkSpecialSurface_Base { |
| 121 public: | 114 public: |
| 122 SkSpecialSurface_Gpu(SkImageFilter::Proxy* proxy, | 115 SkSpecialSurface_Gpu(GrTexture* texture, |
| 123 GrTexture* texture, | |
| 124 const SkIRect& subset, | 116 const SkIRect& subset, |
| 125 const SkSurfaceProps* props) | 117 const SkSurfaceProps* props) |
| 126 : INHERITED(proxy, subset, props) | 118 : INHERITED(subset, props) |
| 127 , fTexture(SkRef(texture)) { | 119 , fTexture(SkRef(texture)) { |
| 128 | 120 |
| 129 SkASSERT(fTexture->asRenderTarget()); | 121 SkASSERT(fTexture->asRenderTarget()); |
| 130 | 122 |
| 131 SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(fTexture->asRenderT
arget(), props, | 123 SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(fTexture->asRenderT
arget(), props, |
| 132 SkGpuDevice::kUnini
t_InitContents)); | 124 SkGpuDevice::kUnini
t_InitContents)); |
| 133 if (!device) { | 125 if (!device) { |
| 134 return; | 126 return; |
| 135 } | 127 } |
| 136 | 128 |
| 137 fCanvas.reset(new SkCanvas(device)); | 129 fCanvas.reset(new SkCanvas(device)); |
| 138 fCanvas->clipRect(SkRect::Make(subset)); | 130 fCanvas->clipRect(SkRect::Make(subset)); |
| 139 } | 131 } |
| 140 | 132 |
| 141 ~SkSpecialSurface_Gpu() override { } | 133 ~SkSpecialSurface_Gpu() override { } |
| 142 | 134 |
| 143 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { | 135 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { |
| 144 return SkSpecialImage::MakeFromGpu(this->proxy(), this->subset(), | 136 return SkSpecialImage::MakeFromGpu(this->subset(), |
| 145 kNeedNewImageUniqueID_SpecialImage, f
Texture, | 137 kNeedNewImageUniqueID_SpecialImage, f
Texture, |
| 146 &this->props()); | 138 &this->props()); |
| 147 } | 139 } |
| 148 | 140 |
| 149 private: | 141 private: |
| 150 SkAutoTUnref<GrTexture> fTexture; | 142 SkAutoTUnref<GrTexture> fTexture; |
| 151 | 143 |
| 152 typedef SkSpecialSurface_Base INHERITED; | 144 typedef SkSpecialSurface_Base INHERITED; |
| 153 }; | 145 }; |
| 154 | 146 |
| 155 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy*
proxy, | 147 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(const SkIRect& subset, |
| 156 const SkIRect& subset, | |
| 157 GrTexture* texture, | 148 GrTexture* texture, |
| 158 const SkSurfaceProps*
props) { | 149 const SkSurfaceProps*
props) { |
| 159 if (!texture->asRenderTarget()) { | 150 if (!texture->asRenderTarget()) { |
| 160 return nullptr; | 151 return nullptr; |
| 161 } | 152 } |
| 162 | 153 |
| 163 return sk_make_sp<SkSpecialSurface_Gpu>(proxy, texture, subset, props); | 154 return sk_make_sp<SkSpecialSurface_Gpu>(texture, subset, props); |
| 164 } | 155 } |
| 165 | 156 |
| 166 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(SkImageFilter::Proxy*
proxy, | 157 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(GrContext* context, |
| 167 GrContext* context, | |
| 168 const GrSurfaceDesc&
desc, | 158 const GrSurfaceDesc&
desc, |
| 169 const SkSurfaceProps*
props) { | 159 const SkSurfaceProps*
props) { |
| 170 if (!context || !SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) { | 160 if (!context || !SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) { |
| 171 return nullptr; | 161 return nullptr; |
| 172 } | 162 } |
| 173 | 163 |
| 174 SkAutoTUnref<GrTexture> temp(context->textureProvider()->createApproxTexture
(desc)); | 164 SkAutoTUnref<GrTexture> temp(context->textureProvider()->createApproxTexture
(desc)); |
| 175 if (!temp) { | 165 if (!temp) { |
| 176 return nullptr; | 166 return nullptr; |
| 177 } | 167 } |
| 178 | 168 |
| 179 const SkIRect subset = SkIRect::MakeWH(desc.fWidth, desc.fHeight); | 169 const SkIRect subset = SkIRect::MakeWH(desc.fWidth, desc.fHeight); |
| 180 | 170 |
| 181 return sk_make_sp<SkSpecialSurface_Gpu>(proxy, temp, subset, props); | 171 return sk_make_sp<SkSpecialSurface_Gpu>(temp, subset, props); |
| 182 } | 172 } |
| 183 | 173 |
| 184 #else | 174 #else |
| 185 | 175 |
| 186 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy*
proxy, | 176 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(const SkIRect& subset, |
| 187 const SkIRect& subset, | |
| 188 GrTexture*, | 177 GrTexture*, |
| 189 const SkSurfaceProps*)
{ | 178 const SkSurfaceProps*)
{ |
| 190 return nullptr; | 179 return nullptr; |
| 191 } | 180 } |
| 192 | 181 |
| 193 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(SkImageFilter::Proxy*
proxy, | 182 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(GrContext* context, |
| 194 GrContext* context, | |
| 195 const GrSurfaceDesc&
desc, | 183 const GrSurfaceDesc&
desc, |
| 196 const SkSurfaceProps*
props) { | 184 const SkSurfaceProps*
props) { |
| 197 return nullptr; | 185 return nullptr; |
| 198 } | 186 } |
| 199 | 187 |
| 200 #endif | 188 #endif |
| OLD | NEW |