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

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

Issue 195223003: Fixing SkPicture serialization (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fixed comments Created 6 years, 9 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
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2007 The Android Open Source Project 3 * Copyright 2007 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 "SkPictureFlat.h" 10 #include "SkPictureFlat.h"
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 if (fPlayback) { 253 if (fPlayback) {
254 fPlayback->draw(*surface, callback); 254 fPlayback->draw(*surface, callback);
255 } 255 }
256 } 256 }
257 257
258 /////////////////////////////////////////////////////////////////////////////// 258 ///////////////////////////////////////////////////////////////////////////////
259 259
260 #include "SkStream.h" 260 #include "SkStream.h"
261 261
262 static const char kMagic[] = { 's', 'k', 'i', 'a', 'p', 'i', 'c', 't' }; 262 static const char kMagic[] = { 's', 'k', 'i', 'a', 'p', 'i', 'c', 't' };
263 static const size_t kHeaderSize = sizeof(kMagic) + sizeof(SkPictInfo); 263 struct SkPictureHeader {
264 char fMagic[sizeof(kMagic)];
265 SkPictInfo fInfo;
266 };
264 267
265 bool SkPicture::InternalOnly_StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) { 268 bool SkPicture::InternalOnly_StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) {
266 if (NULL == stream) { 269 if (NULL == stream) {
267 return false; 270 return false;
268 } 271 }
269 272
270 // Check magic bytes. 273 // Check magic bytes.
271 char magic[sizeof(kMagic)]; 274 SkPictureHeader header;
272 if (!stream->read(magic, sizeof(kMagic)) || 275 if (!stream->read(&header, sizeof(header)) ||
273 (0 != memcmp(magic, kMagic, sizeof(kMagic)))) { 276 (0 != memcmp(header.fMagic, kMagic, sizeof(kMagic)))) {
274 return false; 277 return false;
275 } 278 }
276 279
277 SkPictInfo info; 280 if (header.fInfo.fVersion < MIN_PICTURE_VERSION ||
278 if (!stream->read(&info, sizeof(SkPictInfo))) { 281 header.fInfo.fVersion > CURRENT_PICTURE_VERSION) {
279 return false;
280 }
281
282 if (info.fVersion < MIN_PICTURE_VERSION || info.fVersion > CURRENT_PICTURE_V ERSION) {
283 return false; 282 return false;
284 } 283 }
285 284
286 if (pInfo != NULL) { 285 if (pInfo != NULL) {
287 *pInfo = info; 286 *pInfo = header.fInfo;
288 } 287 }
289 return true; 288 return true;
290 } 289 }
291 290
292 bool SkPicture::InternalOnly_BufferIsSKP(SkReadBuffer& buffer, SkPictInfo* pInfo ) { 291 bool SkPicture::InternalOnly_BufferIsSKP(SkReadBuffer& buffer, SkPictInfo* pInfo ) {
293 // Check magic bytes. 292 // Check magic bytes.
294 char magic[sizeof(kMagic)]; 293 SkPictureHeader header;
295 294
296 if (!buffer.readByteArray(magic, sizeof(kMagic)) || 295 if (!buffer.readByteArray(&header, sizeof(header)) ||
297 (0 != memcmp(magic, kMagic, sizeof(kMagic)))) { 296 (0 != memcmp(header.fMagic, kMagic, sizeof(kMagic)))) {
298 return false; 297 return false;
299 } 298 }
300 299
301 SkPictInfo info; 300 if (header.fInfo.fVersion < MIN_PICTURE_VERSION ||
302 if (!buffer.readByteArray(&info, sizeof(SkPictInfo))) { 301 header.fInfo.fVersion > CURRENT_PICTURE_VERSION) {
303 return false;
304 }
305
306 if (info.fVersion < MIN_PICTURE_VERSION || info.fVersion > CURRENT_PICTURE_V ERSION) {
307 return false; 302 return false;
308 } 303 }
309 304
310 if (pInfo != NULL) { 305 if (pInfo != NULL) {
311 *pInfo = info; 306 *pInfo = header.fInfo;
312 } 307 }
313 return true; 308 return true;
314 } 309 }
315 310
316 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height) 311 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height)
317 : fPlayback(playback) 312 : fPlayback(playback)
318 , fRecord(NULL) 313 , fRecord(NULL)
319 , fWidth(width) 314 , fWidth(width)
320 , fHeight(height) {} 315 , fHeight(height) {}
321 316
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 if (NULL == playback) { 349 if (NULL == playback) {
355 return NULL; 350 return NULL;
356 } 351 }
357 } else { 352 } else {
358 playback = NULL; 353 playback = NULL;
359 } 354 }
360 355
361 return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight)); 356 return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight));
362 } 357 }
363 358
364 void SkPicture::createHeader(void* header) const { 359 void SkPicture::createHeader(SkPictureHeader* header) const {
365 // Copy magic bytes at the beginning of the header 360 // Copy magic bytes at the beginning of the header
366 SkASSERT(sizeof(kMagic) == 8); 361 SkASSERT(sizeof(kMagic) == 8);
367 memcpy(header, kMagic, sizeof(kMagic)); 362 memcpy(header->fMagic, kMagic, sizeof(kMagic));
368 363
369 // Set picture info after magic bytes in the header 364 // Set picture info after magic bytes in the header
370 SkPictInfo* info = (SkPictInfo*)(((char*)header) + sizeof(kMagic)); 365 header->fInfo.fVersion = CURRENT_PICTURE_VERSION;
371 info->fVersion = CURRENT_PICTURE_VERSION; 366 header->fInfo.fWidth = fWidth;
372 info->fWidth = fWidth; 367 header->fInfo.fHeight = fHeight;
373 info->fHeight = fHeight; 368 header->fInfo.fFlags = SkPictInfo::kCrossProcess_Flag;
374 info->fFlags = SkPictInfo::kCrossProcess_Flag;
375 // TODO: remove this flag, since we're always float (now) 369 // TODO: remove this flag, since we're always float (now)
376 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; 370 header->fInfo.fFlags |= SkPictInfo::kScalarIsFloat_Flag;
377 371
378 if (8 == sizeof(void*)) { 372 if (8 == sizeof(void*)) {
379 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; 373 header->fInfo.fFlags |= SkPictInfo::kPtrIs64Bit_Flag;
380 } 374 }
381 } 375 }
382 376
383 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { 377 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const {
384 SkPicturePlayback* playback = fPlayback; 378 SkPicturePlayback* playback = fPlayback;
385 379
386 if (NULL == playback && fRecord) { 380 if (NULL == playback && fRecord) {
387 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); 381 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord));
388 } 382 }
389 383
390 char header[kHeaderSize]; 384 SkPictureHeader header;
391 this->createHeader(&header); 385 this->createHeader(&header);
392 stream->write(header, kHeaderSize); 386 stream->write(&header, sizeof(header));
393 if (playback) { 387 if (playback) {
394 stream->writeBool(true); 388 stream->writeBool(true);
395 playback->serialize(stream, encoder); 389 playback->serialize(stream, encoder);
396 // delete playback if it is a local version (i.e. cons'd up just now) 390 // delete playback if it is a local version (i.e. cons'd up just now)
397 if (playback != fPlayback) { 391 if (playback != fPlayback) {
398 SkDELETE(playback); 392 SkDELETE(playback);
399 } 393 }
400 } else { 394 } else {
401 stream->writeBool(false); 395 stream->writeBool(false);
402 } 396 }
403 } 397 }
404 398
405 void SkPicture::flatten(SkWriteBuffer& buffer) const { 399 void SkPicture::flatten(SkWriteBuffer& buffer) const {
406 SkPicturePlayback* playback = fPlayback; 400 SkPicturePlayback* playback = fPlayback;
407 401
408 if (NULL == playback && fRecord) { 402 if (NULL == playback && fRecord) {
409 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); 403 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord));
410 } 404 }
411 405
412 char header[kHeaderSize]; 406 SkPictureHeader header;
413 this->createHeader(&header); 407 this->createHeader(&header);
414 buffer.writeByteArray(header, kHeaderSize); 408 buffer.writeByteArray(&header, sizeof(header));
415 if (playback) { 409 if (playback) {
416 buffer.writeBool(true); 410 buffer.writeBool(true);
417 playback->flatten(buffer); 411 playback->flatten(buffer);
418 // delete playback if it is a local version (i.e. cons'd up just now) 412 // delete playback if it is a local version (i.e. cons'd up just now)
419 if (playback != fPlayback) { 413 if (playback != fPlayback) {
420 SkDELETE(playback); 414 SkDELETE(playback);
421 } 415 }
422 } else { 416 } else {
423 buffer.writeBool(false); 417 buffer.writeBool(false);
424 } 418 }
425 } 419 }
426 420
427 bool SkPicture::willPlayBackBitmaps() const { 421 bool SkPicture::willPlayBackBitmaps() const {
428 if (!fPlayback) return false; 422 if (!fPlayback) return false;
429 return fPlayback->containsBitmaps(); 423 return fPlayback->containsBitmaps();
430 } 424 }
431 425
432 #ifdef SK_BUILD_FOR_ANDROID 426 #ifdef SK_BUILD_FOR_ANDROID
433 void SkPicture::abortPlayback() { 427 void SkPicture::abortPlayback() {
434 if (NULL == fPlayback) { 428 if (NULL == fPlayback) {
435 return; 429 return;
436 } 430 }
437 fPlayback->abort(); 431 fPlayback->abort();
438 } 432 }
439 #endif 433 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698