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

Side by Side Diff: src/core/SkBitmap.cpp

Issue 295793002: stop calling SkBitmap::flatten (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « include/core/SkReadBuffer.h ('k') | src/core/SkReadBuffer.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 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 offset->set(dstM.fBounds.fLeft, dstM.fBounds.fTop); 1251 offset->set(dstM.fBounds.fLeft, dstM.fBounds.fTop);
1252 } 1252 }
1253 SkDEBUGCODE(tmpBitmap.validate();) 1253 SkDEBUGCODE(tmpBitmap.validate();)
1254 1254
1255 tmpBitmap.swap(*dst); 1255 tmpBitmap.swap(*dst);
1256 return true; 1256 return true;
1257 } 1257 }
1258 1258
1259 /////////////////////////////////////////////////////////////////////////////// 1259 ///////////////////////////////////////////////////////////////////////////////
1260 1260
1261 void SkBitmap::WriteRawPixels(SkWriteBuffer* buffer, const SkBitmap& bitmap) {
1262 const SkImageInfo info = bitmap.info();
1263 SkAutoLockPixels alp(bitmap);
1264 if (0 == info.width() || 0 == info.height() || NULL == bitmap.getPixels()) {
1265 buffer->writeUInt(0); // instead of snugRB, signaling no pixels
1266 return;
1267 }
1268
1269 const size_t snugRB = info.width() * info.bytesPerPixel();
1270 const char* srcP = (const char*)bitmap.getPixels();
1271 const size_t ramRB = bitmap.rowBytes();
1272
1273 buffer->write32(SkToU32(snugRB));
1274 info.flatten(*buffer);
1275
1276 const size_t size = snugRB * info.height();
1277 SkAutoMalloc storage(size);
1278 char* srcBytes = (char*)storage.get();
scroggo 2014/05/21 14:48:01 srcBytes is confusing here. How about dstBytes?
reed1 2014/05/21 20:33:04 Done.
1279 for (int y = 0; y < info.height(); ++y) {
1280 memcpy(srcBytes, srcP, snugRB);
1281 srcBytes += snugRB;
1282 srcP += ramRB;
1283 }
1284 buffer->writeByteArray(storage.get(), size);
1285
1286 SkColorTable* ct = bitmap.getColorTable();
1287 if (kIndex_8_SkColorType == info.colorType() && ct) {
1288 buffer->writeBool(true);
1289 ct->writeToBuffer(*buffer);
1290 } else {
1291 buffer->writeBool(false);
1292 }
1293 }
1294
1295 SkPixelRef* SkBitmap::ReadRawPixels(SkReadBuffer* buffer) {
hal.canary 2014/05/21 15:18:11 void SkBitmap::WriteRawPixels(SkWriteBuffer* buffe
reed1 2014/05/21 20:33:04 Done.
1296 const size_t snugRB = buffer->readUInt();
1297 if (0 == snugRB) { // no pixels
1298 return NULL;
1299 }
1300
1301 SkImageInfo info;
1302 info.unflatten(*buffer);
1303
1304 const size_t ramRB = info.minRowBytes();
hal.canary 2014/05/21 15:20:29 When is ramRB != snugRB?
reed1 2014/05/21 20:33:04 snugRB is the smallest that they *could* be (used
hal.canary 2014/05/21 20:39:49 But you set `ramRB = info.minRowBytes()`, which is
1305 const int height = info.height();
1306 const size_t snugSize = snugRB * height;
1307 const size_t ramSize = ramRB * height;
1308 SkASSERT(snugSize <= ramSize);
1309
1310 char* srcBytes = (char*)sk_malloc_throw(ramSize);
scroggo 2014/05/21 14:48:01 Again, I find srcBytes confusing here. dstBytes? r
reed1 2014/05/21 20:33:04 Done.
1311 buffer->readByteArray(srcBytes, snugSize);
1312 SkAutoDataUnref data(SkData::NewFromMalloc(srcBytes, ramSize));
1313
1314 if (snugSize != ramSize) {
1315 const char* srcRow = srcBytes + snugRB * (height - 1);
1316 char* dstRow = srcBytes + ramRB * (height - 1);
1317 for (int y = height - 1; y >= 1; --y) {
1318 memmove(dstRow, srcRow, snugRB);
1319 srcRow -= snugRB;
1320 dstRow -= ramRB;
1321 }
1322 SkASSERT(srcRow == dstRow); // first row does not need to be moved
1323 }
1324
1325 SkAutoTUnref<SkColorTable> ctable;
1326 if (buffer->readBool()) {
1327 ctable.reset(SkNEW_ARGS(SkColorTable, (*buffer)));
1328 }
1329
1330 return SkMallocPixelRef::NewWithData(info, info.minRowBytes(), ctable.get(), data.get());
1331 }
1332
1261 enum { 1333 enum {
1262 SERIALIZE_PIXELTYPE_NONE, 1334 SERIALIZE_PIXELTYPE_NONE,
1263 SERIALIZE_PIXELTYPE_REF_DATA 1335 SERIALIZE_PIXELTYPE_REF_DATA
1264 }; 1336 };
1265 1337
1338 #ifdef SK_SUPPORT_LEGACY_BITMAPFLATTEN
1266 void SkBitmap::flatten(SkWriteBuffer& buffer) const { 1339 void SkBitmap::flatten(SkWriteBuffer& buffer) const {
1267 fInfo.flatten(buffer); 1340 fInfo.flatten(buffer);
1268 buffer.writeInt(fRowBytes); 1341 buffer.writeInt(fRowBytes);
1269 1342
1270 if (fPixelRef) { 1343 if (fPixelRef) {
1271 if (fPixelRef->getFactory()) { 1344 if (fPixelRef->getFactory()) {
1272 buffer.writeInt(SERIALIZE_PIXELTYPE_REF_DATA); 1345 buffer.writeInt(SERIALIZE_PIXELTYPE_REF_DATA);
1273 buffer.writeInt(fPixelRefOrigin.fX); 1346 buffer.writeInt(fPixelRefOrigin.fX);
1274 buffer.writeInt(fPixelRefOrigin.fY); 1347 buffer.writeInt(fPixelRefOrigin.fY);
1275 buffer.writeFlattenable(fPixelRef); 1348 buffer.writeFlattenable(fPixelRef);
1276 return; 1349 return;
1277 } 1350 }
1278 // if we get here, we can't record the pixels 1351 // if we get here, we can't record the pixels
1279 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE); 1352 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE);
1280 } else { 1353 } else {
1281 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE); 1354 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE);
1282 } 1355 }
1283 } 1356 }
1357 #endif
1284 1358
1285 void SkBitmap::unflatten(SkReadBuffer& buffer) { 1359 void SkBitmap::unflatten(SkReadBuffer& buffer) {
1286 this->reset(); 1360 this->reset();
1287 1361
1288 SkImageInfo info; 1362 SkImageInfo info;
1289 info.unflatten(buffer); 1363 info.unflatten(buffer);
1290 size_t rowBytes = buffer.readInt(); 1364 size_t rowBytes = buffer.readInt();
1291 if (!buffer.validate((info.width() >= 0) && (info.height() >= 0) && 1365 if (!buffer.validate((info.width() >= 0) && (info.height() >= 0) &&
1292 SkColorTypeIsValid(info.fColorType) && 1366 SkColorTypeIsValid(info.fColorType) &&
1293 SkAlphaTypeIsValid(info.fAlphaType) && 1367 SkAlphaTypeIsValid(info.fAlphaType) &&
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 /////////////////////////////////////////////////////////////////////////////// 1489 ///////////////////////////////////////////////////////////////////////////////
1416 1490
1417 #ifdef SK_DEBUG 1491 #ifdef SK_DEBUG
1418 void SkImageInfo::validate() const { 1492 void SkImageInfo::validate() const {
1419 SkASSERT(fWidth >= 0); 1493 SkASSERT(fWidth >= 0);
1420 SkASSERT(fHeight >= 0); 1494 SkASSERT(fHeight >= 0);
1421 SkASSERT(SkColorTypeIsValid(fColorType)); 1495 SkASSERT(SkColorTypeIsValid(fColorType));
1422 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); 1496 SkASSERT(SkAlphaTypeIsValid(fAlphaType));
1423 } 1497 }
1424 #endif 1498 #endif
OLDNEW
« no previous file with comments | « include/core/SkReadBuffer.h ('k') | src/core/SkReadBuffer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698