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

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: Including fMagic into SkPictInfo 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
« no previous file with comments | « include/core/SkReadBuffer.h ('k') | src/core/SkPicturePlayback.h » ('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 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);
264 263
265 bool SkPicture::InternalOnly_StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) { 264 bool SkPicture::InternalOnly_StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) {
266 if (NULL == stream) { 265 if (NULL == stream) {
267 return false; 266 return false;
268 } 267 }
269 268
270 // Check magic bytes. 269 // Check magic bytes.
reed1 2014/03/11 21:13:12 should we have a static helper static bool is_va
271 char magic[sizeof(kMagic)]; 270 SkPictInfo header;
272 if (!stream->read(magic, sizeof(kMagic)) || 271 SkASSERT(sizeof(kMagic) == sizeof(header.fMagic));
273 (0 != memcmp(magic, kMagic, sizeof(kMagic)))) { 272 if (!stream->read(&header, sizeof(header)) ||
273 (0 != memcmp(header.fMagic, kMagic, sizeof(kMagic)))) {
274 return false; 274 return false;
275 } 275 }
276 276
277 SkPictInfo info; 277 if (header.fVersion < MIN_PICTURE_VERSION ||
278 if (!stream->read(&info, sizeof(SkPictInfo))) { 278 header.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; 279 return false;
284 } 280 }
285 281
286 if (pInfo != NULL) { 282 if (pInfo != NULL) {
287 *pInfo = info; 283 *pInfo = header;
288 } 284 }
289 return true; 285 return true;
290 } 286 }
291 287
292 bool SkPicture::InternalOnly_BufferIsSKP(SkReadBuffer& buffer, SkPictInfo* pInfo ) { 288 bool SkPicture::InternalOnly_BufferIsSKP(SkReadBuffer& buffer, SkPictInfo* pInfo ) {
293 // Check magic bytes. 289 // Check magic bytes.
294 char magic[sizeof(kMagic)]; 290 SkPictInfo header;
295 291 SkASSERT(sizeof(kMagic) == sizeof(header.fMagic));
296 if (!buffer.readByteArray(magic, sizeof(kMagic)) || 292 if (!buffer.readByteArray(&header, sizeof(header)) ||
297 (0 != memcmp(magic, kMagic, sizeof(kMagic)))) { 293 (0 != memcmp(header.fMagic, kMagic, sizeof(kMagic)))) {
298 return false; 294 return false;
299 } 295 }
300 296
301 SkPictInfo info; 297 if (header.fVersion < MIN_PICTURE_VERSION ||
302 if (!buffer.readByteArray(&info, sizeof(SkPictInfo))) { 298 header.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; 299 return false;
308 } 300 }
309 301
310 if (pInfo != NULL) { 302 if (pInfo != NULL) {
311 *pInfo = info; 303 *pInfo = header;
312 } 304 }
313 return true; 305 return true;
314 } 306 }
315 307
316 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height) 308 SkPicture::SkPicture(SkPicturePlayback* playback, int width, int height)
317 : fPlayback(playback) 309 : fPlayback(playback)
318 , fRecord(NULL) 310 , fRecord(NULL)
319 , fWidth(width) 311 , fWidth(width)
320 , fHeight(height) {} 312 , fHeight(height) {}
321 313
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 if (NULL == playback) { 346 if (NULL == playback) {
355 return NULL; 347 return NULL;
356 } 348 }
357 } else { 349 } else {
358 playback = NULL; 350 playback = NULL;
359 } 351 }
360 352
361 return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight)); 353 return SkNEW_ARGS(SkPicture, (playback, info.fWidth, info.fHeight));
362 } 354 }
363 355
364 void SkPicture::createHeader(void* header) const { 356 void SkPicture::createHeader(SkPictInfo* header) const {
365 // Copy magic bytes at the beginning of the header 357 // Copy magic bytes at the beginning of the header
366 SkASSERT(sizeof(kMagic) == 8); 358 SkASSERT(sizeof(kMagic) == 8);
367 memcpy(header, kMagic, sizeof(kMagic)); 359 SkASSERT(sizeof(kMagic) == sizeof(header->fMagic));
360 memcpy(header->fMagic, kMagic, sizeof(kMagic));
368 361
369 // Set picture info after magic bytes in the header 362 // Set picture info after magic bytes in the header
370 SkPictInfo* info = (SkPictInfo*)(((char*)header) + sizeof(kMagic)); 363 header->fVersion = CURRENT_PICTURE_VERSION;
reed1 2014/03/11 21:13:12 nit: calling this info instead of header would be
371 info->fVersion = CURRENT_PICTURE_VERSION; 364 header->fWidth = fWidth;
372 info->fWidth = fWidth; 365 header->fHeight = fHeight;
373 info->fHeight = fHeight; 366 header->fFlags = SkPictInfo::kCrossProcess_Flag;
374 info->fFlags = SkPictInfo::kCrossProcess_Flag;
375 // TODO: remove this flag, since we're always float (now) 367 // TODO: remove this flag, since we're always float (now)
376 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; 368 header->fFlags |= SkPictInfo::kScalarIsFloat_Flag;
377 369
378 if (8 == sizeof(void*)) { 370 if (8 == sizeof(void*)) {
379 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; 371 header->fFlags |= SkPictInfo::kPtrIs64Bit_Flag;
380 } 372 }
381 } 373 }
382 374
383 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { 375 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const {
384 SkPicturePlayback* playback = fPlayback; 376 SkPicturePlayback* playback = fPlayback;
385 377
386 if (NULL == playback && fRecord) { 378 if (NULL == playback && fRecord) {
387 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); 379 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord));
388 } 380 }
389 381
390 char header[kHeaderSize]; 382 SkPictInfo header;
391 this->createHeader(&header); 383 this->createHeader(&header);
392 stream->write(header, kHeaderSize); 384 stream->write(&header, sizeof(header));
393 if (playback) { 385 if (playback) {
394 stream->writeBool(true); 386 stream->writeBool(true);
395 playback->serialize(stream, encoder); 387 playback->serialize(stream, encoder);
396 // delete playback if it is a local version (i.e. cons'd up just now) 388 // delete playback if it is a local version (i.e. cons'd up just now)
397 if (playback != fPlayback) { 389 if (playback != fPlayback) {
398 SkDELETE(playback); 390 SkDELETE(playback);
399 } 391 }
400 } else { 392 } else {
401 stream->writeBool(false); 393 stream->writeBool(false);
402 } 394 }
403 } 395 }
404 396
405 void SkPicture::flatten(SkWriteBuffer& buffer) const { 397 void SkPicture::flatten(SkWriteBuffer& buffer) const {
406 SkPicturePlayback* playback = fPlayback; 398 SkPicturePlayback* playback = fPlayback;
407 399
408 if (NULL == playback && fRecord) { 400 if (NULL == playback && fRecord) {
409 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); 401 playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord));
410 } 402 }
411 403
412 char header[kHeaderSize]; 404 SkPictInfo header;
413 this->createHeader(&header); 405 this->createHeader(&header);
414 buffer.writeByteArray(header, kHeaderSize); 406 buffer.writeByteArray(&header, sizeof(header));
415 if (playback) { 407 if (playback) {
416 buffer.writeBool(true); 408 buffer.writeBool(true);
417 playback->flatten(buffer); 409 playback->flatten(buffer);
418 // delete playback if it is a local version (i.e. cons'd up just now) 410 // delete playback if it is a local version (i.e. cons'd up just now)
419 if (playback != fPlayback) { 411 if (playback != fPlayback) {
420 SkDELETE(playback); 412 SkDELETE(playback);
421 } 413 }
422 } else { 414 } else {
423 buffer.writeBool(false); 415 buffer.writeBool(false);
424 } 416 }
425 } 417 }
426 418
427 bool SkPicture::willPlayBackBitmaps() const { 419 bool SkPicture::willPlayBackBitmaps() const {
428 if (!fPlayback) return false; 420 if (!fPlayback) return false;
429 return fPlayback->containsBitmaps(); 421 return fPlayback->containsBitmaps();
430 } 422 }
431 423
432 #ifdef SK_BUILD_FOR_ANDROID 424 #ifdef SK_BUILD_FOR_ANDROID
433 void SkPicture::abortPlayback() { 425 void SkPicture::abortPlayback() {
434 if (NULL == fPlayback) { 426 if (NULL == fPlayback) {
435 return; 427 return;
436 } 428 }
437 fPlayback->abort(); 429 fPlayback->abort();
438 } 430 }
439 #endif 431 #endif
OLDNEW
« no previous file with comments | « include/core/SkReadBuffer.h ('k') | src/core/SkPicturePlayback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698