Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/image/SkSurface_Raster.cpp

Issue 1643873002: allow the caller to specified raster-surface rowbytes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: update dox for snapped image rowbytes Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/core/SkSurface.h ('k') | tests/SurfaceTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « include/core/SkSurface.h ('k') | tests/SurfaceTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698