| 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 } | 76 } |
| 81 | 77 |
| 82 ~SkSpecialSurface_Raster() override { } | 78 ~SkSpecialSurface_Raster() override { } |
| 83 | 79 |
| 84 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { | 80 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { |
| 85 return SkSpecialImage::MakeFromRaster(this->proxy(), this->subset(), fBi
tmap, | 81 return SkSpecialImage::MakeFromRaster(this->subset(), fBitmap, &this->pr
ops()); |
| 86 &this->props()); | |
| 87 } | 82 } |
| 88 | 83 |
| 89 private: | 84 private: |
| 90 SkBitmap fBitmap; | 85 SkBitmap fBitmap; |
| 91 | 86 |
| 92 typedef SkSpecialSurface_Base INHERITED; | 87 typedef SkSpecialSurface_Base INHERITED; |
| 93 }; | 88 }; |
| 94 | 89 |
| 95 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromBitmap(SkImageFilter::Proxy* p
roxy, | 90 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromBitmap(const SkIRect& subset,
SkBitmap& bm, |
| 96 const SkIRect& subset,
SkBitmap& bm, | |
| 97 const SkSurfaceProps* p
rops) { | 91 const SkSurfaceProps* p
rops) { |
| 98 return sk_make_sp<SkSpecialSurface_Raster>(proxy, bm.pixelRef(), subset, pro
ps); | 92 return sk_make_sp<SkSpecialSurface_Raster>(bm.pixelRef(), subset, props); |
| 99 } | 93 } |
| 100 | 94 |
| 101 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(SkImageFilter::Proxy* proxy
, | 95 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(const SkImageInfo& info, |
| 102 const SkImageInfo& info, | |
| 103 const SkSurfaceProps* props
) { | 96 const SkSurfaceProps* props
) { |
| 104 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, 0, nullptr)); | 97 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, 0, nullptr)); |
| 105 if (nullptr == pr.get()) { | 98 if (nullptr == pr.get()) { |
| 106 return nullptr; | 99 return nullptr; |
| 107 } | 100 } |
| 108 | 101 |
| 109 const SkIRect subset = SkIRect::MakeWH(pr->info().width(), pr->info().height
()); | 102 const SkIRect subset = SkIRect::MakeWH(pr->info().width(), pr->info().height
()); |
| 110 | 103 |
| 111 return sk_make_sp<SkSpecialSurface_Raster>(proxy, pr, subset, props); | 104 return sk_make_sp<SkSpecialSurface_Raster>(pr, subset, props); |
| 112 } | 105 } |
| 113 | 106 |
| 114 #if SK_SUPPORT_GPU | 107 #if SK_SUPPORT_GPU |
| 115 /////////////////////////////////////////////////////////////////////////////// | 108 /////////////////////////////////////////////////////////////////////////////// |
| 116 #include "GrContext.h" | 109 #include "GrContext.h" |
| 117 #include "SkGpuDevice.h" | 110 #include "SkGpuDevice.h" |
| 118 | 111 |
| 119 class SkSpecialSurface_Gpu : public SkSpecialSurface_Base { | 112 class SkSpecialSurface_Gpu : public SkSpecialSurface_Base { |
| 120 public: | 113 public: |
| 121 SkSpecialSurface_Gpu(SkImageFilter::Proxy* proxy, | 114 SkSpecialSurface_Gpu(GrTexture* texture, |
| 122 GrTexture* texture, | |
| 123 const SkIRect& subset, | 115 const SkIRect& subset, |
| 124 const SkSurfaceProps* props) | 116 const SkSurfaceProps* props) |
| 125 : INHERITED(proxy, subset, props) | 117 : INHERITED(subset, props) |
| 126 , fTexture(SkRef(texture)) { | 118 , fTexture(SkRef(texture)) { |
| 127 | 119 |
| 128 SkASSERT(fTexture->asRenderTarget()); | 120 SkASSERT(fTexture->asRenderTarget()); |
| 129 | 121 |
| 130 SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(fTexture->asRenderT
arget(), props, | 122 SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(fTexture->asRenderT
arget(), props, |
| 131 SkGpuDevice::kUnini
t_InitContents)); | 123 SkGpuDevice::kUnini
t_InitContents)); |
| 132 if (!device) { | 124 if (!device) { |
| 133 return; | 125 return; |
| 134 } | 126 } |
| 135 | 127 |
| 136 fCanvas.reset(new SkCanvas(device)); | 128 fCanvas.reset(new SkCanvas(device)); |
| 137 } | 129 } |
| 138 | 130 |
| 139 ~SkSpecialSurface_Gpu() override { } | 131 ~SkSpecialSurface_Gpu() override { } |
| 140 | 132 |
| 141 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { | 133 sk_sp<SkSpecialImage> onMakeImageSnapshot() override { |
| 142 return SkSpecialImage::MakeFromGpu(this->proxy(), this->subset(), | 134 return SkSpecialImage::MakeFromGpu(this->subset(), |
| 143 kNeedNewImageUniqueID_SpecialImage, f
Texture, | 135 kNeedNewImageUniqueID_SpecialImage, f
Texture, |
| 144 &this->props()); | 136 &this->props()); |
| 145 } | 137 } |
| 146 | 138 |
| 147 private: | 139 private: |
| 148 SkAutoTUnref<GrTexture> fTexture; | 140 SkAutoTUnref<GrTexture> fTexture; |
| 149 | 141 |
| 150 typedef SkSpecialSurface_Base INHERITED; | 142 typedef SkSpecialSurface_Base INHERITED; |
| 151 }; | 143 }; |
| 152 | 144 |
| 153 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy*
proxy, | 145 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(const SkIRect& subset, |
| 154 const SkIRect& subset, | |
| 155 GrTexture* texture, | 146 GrTexture* texture, |
| 156 const SkSurfaceProps*
props) { | 147 const SkSurfaceProps*
props) { |
| 157 if (!texture->asRenderTarget()) { | 148 if (!texture->asRenderTarget()) { |
| 158 return nullptr; | 149 return nullptr; |
| 159 } | 150 } |
| 160 | 151 |
| 161 return sk_make_sp<SkSpecialSurface_Gpu>(proxy, texture, subset, props); | 152 return sk_make_sp<SkSpecialSurface_Gpu>(texture, subset, props); |
| 162 } | 153 } |
| 163 | 154 |
| 164 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(SkImageFilter::Proxy*
proxy, | 155 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(GrContext* context, |
| 165 GrContext* context, | |
| 166 const GrSurfaceDesc&
desc, | 156 const GrSurfaceDesc&
desc, |
| 167 const SkSurfaceProps*
props) { | 157 const SkSurfaceProps*
props) { |
| 168 if (!context || !SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) { | 158 if (!context || !SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) { |
| 169 return nullptr; | 159 return nullptr; |
| 170 } | 160 } |
| 171 | 161 |
| 172 SkAutoTUnref<GrTexture> temp(context->textureProvider()->createApproxTexture
(desc)); | 162 SkAutoTUnref<GrTexture> temp(context->textureProvider()->createApproxTexture
(desc)); |
| 173 if (!temp) { | 163 if (!temp) { |
| 174 return nullptr; | 164 return nullptr; |
| 175 } | 165 } |
| 176 | 166 |
| 177 const SkIRect subset = SkIRect::MakeWH(desc.fWidth, desc.fHeight); | 167 const SkIRect subset = SkIRect::MakeWH(desc.fWidth, desc.fHeight); |
| 178 | 168 |
| 179 return sk_make_sp<SkSpecialSurface_Gpu>(proxy, temp, subset, props); | 169 return sk_make_sp<SkSpecialSurface_Gpu>(temp, subset, props); |
| 180 } | 170 } |
| 181 | 171 |
| 182 #else | 172 #else |
| 183 | 173 |
| 184 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy*
proxy, | 174 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(const SkIRect& subset, |
| 185 const SkIRect& subset, | |
| 186 GrTexture*, | 175 GrTexture*, |
| 187 const SkSurfaceProps*)
{ | 176 const SkSurfaceProps*)
{ |
| 188 return nullptr; | 177 return nullptr; |
| 189 } | 178 } |
| 190 | 179 |
| 191 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(SkImageFilter::Proxy*
proxy, | 180 sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRenderTarget(GrContext* context, |
| 192 GrContext* context, | |
| 193 const GrSurfaceDesc&
desc, | 181 const GrSurfaceDesc&
desc, |
| 194 const SkSurfaceProps*
props) { | 182 const SkSurfaceProps*
props) { |
| 195 return nullptr; | 183 return nullptr; |
| 196 } | 184 } |
| 197 | 185 |
| 198 #endif | 186 #endif |
| OLD | NEW |