| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "SkSurface_Base.h" | 8 #include "SkSurface_Base.h" |
| 9 #include "SkImagePriv.h" | 9 #include "SkImagePriv.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 SkCanvas* onNewCanvas() override; | 25 SkCanvas* onNewCanvas() override; |
| 26 SkSurface* onNewSurface(const SkImageInfo&) override; | 26 SkSurface* onNewSurface(const SkImageInfo&) override; |
| 27 SkImage* onNewImageSnapshot(Budgeted) override; | 27 SkImage* onNewImageSnapshot(Budgeted) override; |
| 28 void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) override; | 28 void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) override; |
| 29 void onCopyOnWrite(ContentChangeMode) override; | 29 void onCopyOnWrite(ContentChangeMode) override; |
| 30 void onRestoreBackingMutability() override; | 30 void onRestoreBackingMutability() override; |
| 31 | 31 |
| 32 private: | 32 private: |
| 33 SkBitmap fBitmap; | 33 SkBitmap fBitmap; |
| 34 size_t fRowBytes; |
| 34 bool fWeOwnThePixels; | 35 bool fWeOwnThePixels; |
| 35 | 36 |
| 36 typedef SkSurface_Base INHERITED; | 37 typedef SkSurface_Base INHERITED; |
| 37 }; | 38 }; |
| 38 | 39 |
| 39 /////////////////////////////////////////////////////////////////////////////// | 40 /////////////////////////////////////////////////////////////////////////////// |
| 40 | 41 |
| 41 bool SkSurface_Raster::Valid(const SkImageInfo& info, size_t rowBytes) { | 42 bool SkSurface_Raster::Valid(const SkImageInfo& info, size_t rowBytes) { |
| 42 if (info.isEmpty()) { | 43 if (info.isEmpty()) { |
| 43 return false; | 44 return false; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 82 |
| 82 return true; | 83 return true; |
| 83 } | 84 } |
| 84 | 85 |
| 85 SkSurface_Raster::SkSurface_Raster(const SkImageInfo& info, void* pixels, size_t
rb, | 86 SkSurface_Raster::SkSurface_Raster(const SkImageInfo& info, void* pixels, size_t
rb, |
| 86 void (*releaseProc)(void* pixels, void* conte
xt), void* context, | 87 void (*releaseProc)(void* pixels, void* conte
xt), void* context, |
| 87 const SkSurfaceProps* props) | 88 const SkSurfaceProps* props) |
| 88 : INHERITED(info, props) | 89 : INHERITED(info, props) |
| 89 { | 90 { |
| 90 fBitmap.installPixels(info, pixels, rb, nullptr, releaseProc, context); | 91 fBitmap.installPixels(info, pixels, rb, nullptr, releaseProc, context); |
| 92 fRowBytes = 0; // don't need to track the rowbytes |
| 91 fWeOwnThePixels = false; // We are "Direct" | 93 fWeOwnThePixels = false; // We are "Direct" |
| 92 } | 94 } |
| 93 | 95 |
| 94 SkSurface_Raster::SkSurface_Raster(SkPixelRef* pr, const SkSurfaceProps* props) | 96 SkSurface_Raster::SkSurface_Raster(SkPixelRef* pr, const SkSurfaceProps* props) |
| 95 : INHERITED(pr->info().width(), pr->info().height(), props) | 97 : INHERITED(pr->info().width(), pr->info().height(), props) |
| 96 { | 98 { |
| 97 const SkImageInfo& info = pr->info(); | 99 const SkImageInfo& info = pr->info(); |
| 98 | 100 |
| 99 fBitmap.setInfo(info, info.minRowBytes()); | 101 fBitmap.setInfo(info, pr->rowBytes()); |
| 100 fBitmap.setPixelRef(pr); | 102 fBitmap.setPixelRef(pr); |
| 103 fRowBytes = pr->rowBytes(); // we track this, so that subsequent re-allocs w
ill match |
| 101 fWeOwnThePixels = true; | 104 fWeOwnThePixels = true; |
| 102 } | 105 } |
| 103 | 106 |
| 104 SkCanvas* SkSurface_Raster::onNewCanvas() { return new SkCanvas(fBitmap, this->p
rops()); } | 107 SkCanvas* SkSurface_Raster::onNewCanvas() { return new SkCanvas(fBitmap, this->p
rops()); } |
| 105 | 108 |
| 106 SkSurface* SkSurface_Raster::onNewSurface(const SkImageInfo& info) { | 109 SkSurface* SkSurface_Raster::onNewSurface(const SkImageInfo& info) { |
| 107 return SkSurface::NewRaster(info, &this->props()); | 110 return SkSurface::NewRaster(info, &this->props()); |
| 108 } | 111 } |
| 109 | 112 |
| 110 void SkSurface_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, | 113 void SkSurface_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 132 pr->restoreMutability(); | 135 pr->restoreMutability(); |
| 133 } | 136 } |
| 134 } | 137 } |
| 135 | 138 |
| 136 void SkSurface_Raster::onCopyOnWrite(ContentChangeMode mode) { | 139 void SkSurface_Raster::onCopyOnWrite(ContentChangeMode mode) { |
| 137 // are we sharing pixelrefs with the image? | 140 // are we sharing pixelrefs with the image? |
| 138 SkASSERT(this->getCachedImage(kNo_Budgeted)); | 141 SkASSERT(this->getCachedImage(kNo_Budgeted)); |
| 139 if (SkBitmapImageGetPixelRef(this->getCachedImage(kNo_Budgeted)) == fBitmap.
pixelRef()) { | 142 if (SkBitmapImageGetPixelRef(this->getCachedImage(kNo_Budgeted)) == fBitmap.
pixelRef()) { |
| 140 SkASSERT(fWeOwnThePixels); | 143 SkASSERT(fWeOwnThePixels); |
| 141 if (kDiscard_ContentChangeMode == mode) { | 144 if (kDiscard_ContentChangeMode == mode) { |
| 142 fBitmap.setPixelRef(nullptr); | |
| 143 fBitmap.allocPixels(); | 145 fBitmap.allocPixels(); |
| 144 } else { | 146 } else { |
| 145 SkBitmap prev(fBitmap); | 147 SkBitmap prev(fBitmap); |
| 146 prev.deepCopyTo(&fBitmap); | 148 fBitmap.allocPixels(); |
| 149 prev.lockPixels(); |
| 150 SkASSERT(prev.info() == fBitmap.info()); |
| 151 SkASSERT(prev.rowBytes() == fBitmap.rowBytes()); |
| 152 memcpy(fBitmap.getPixels(), prev.getPixels(), fBitmap.getSafeSize())
; |
| 147 } | 153 } |
| 154 SkASSERT(fBitmap.rowBytes() == fRowBytes); // be sure we always use the
same value |
| 155 |
| 148 // Now fBitmap is a deep copy of itself (and therefore different from | 156 // Now fBitmap is a deep copy of itself (and therefore different from |
| 149 // what is being used by the image. Next we update the canvas to use | 157 // what is being used by the image. Next we update the canvas to use |
| 150 // this as its backend, so we can't modify the image's pixels anymore. | 158 // this as its backend, so we can't modify the image's pixels anymore. |
| 151 SkASSERT(this->getCachedCanvas()); | 159 SkASSERT(this->getCachedCanvas()); |
| 152 this->getCachedCanvas()->getDevice()->replaceBitmapBackendForRasterSurfa
ce(fBitmap); | 160 this->getCachedCanvas()->getDevice()->replaceBitmapBackendForRasterSurfa
ce(fBitmap); |
| 153 } | 161 } |
| 154 } | 162 } |
| 155 | 163 |
| 156 /////////////////////////////////////////////////////////////////////////////// | 164 /////////////////////////////////////////////////////////////////////////////// |
| 157 | 165 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 169 } | 177 } |
| 170 | 178 |
| 171 return new SkSurface_Raster(info, pixels, rb, releaseProc, context, props); | 179 return new SkSurface_Raster(info, pixels, rb, releaseProc, context, props); |
| 172 } | 180 } |
| 173 | 181 |
| 174 SkSurface* SkSurface::NewRasterDirect(const SkImageInfo& info, void* pixels, siz
e_t rowBytes, | 182 SkSurface* SkSurface::NewRasterDirect(const SkImageInfo& info, void* pixels, siz
e_t rowBytes, |
| 175 const SkSurfaceProps* props) { | 183 const SkSurfaceProps* props) { |
| 176 return NewRasterDirectReleaseProc(info, pixels, rowBytes, nullptr, nullptr,
props); | 184 return NewRasterDirectReleaseProc(info, pixels, rowBytes, nullptr, nullptr,
props); |
| 177 } | 185 } |
| 178 | 186 |
| 179 SkSurface* SkSurface::NewRaster(const SkImageInfo& info, const SkSurfaceProps* p
rops) { | 187 SkSurface* SkSurface::NewRaster(const SkImageInfo& info, size_t rowBytes, |
| 188 const SkSurfaceProps* props) { |
| 180 if (!SkSurface_Raster::Valid(info)) { | 189 if (!SkSurface_Raster::Valid(info)) { |
| 181 return nullptr; | 190 return nullptr; |
| 182 } | 191 } |
| 183 | 192 |
| 184 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, 0, nullptr)); | 193 SkAutoTUnref<SkPixelRef> pr(SkMallocPixelRef::NewZeroed(info, rowBytes, null
ptr)); |
| 185 if (nullptr == pr.get()) { | 194 if (nullptr == pr.get()) { |
| 186 return nullptr; | 195 return nullptr; |
| 187 } | 196 } |
| 197 if (rowBytes) { |
| 198 SkASSERT(pr->rowBytes() == rowBytes); |
| 199 } |
| 188 return new SkSurface_Raster(pr, props); | 200 return new SkSurface_Raster(pr, props); |
| 189 } | 201 } |
| 202 |
| 203 SkSurface* SkSurface::NewRaster(const SkImageInfo& info, const SkSurfaceProps* p
rops) { |
| 204 return NewRaster(info, 0, props); |
| 205 } |
| OLD | NEW |