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

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

Issue 68973005: Expand pixelref to return SkImageInfo and rowbytes (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 1 month 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
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 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 SkASSERT(0 == fPixelLockCount); 361 SkASSERT(0 == fPixelLockCount);
362 fPixels = NULL; 362 fPixels = NULL;
363 if (fColorTable) { 363 if (fColorTable) {
364 fColorTable->unref(); 364 fColorTable->unref();
365 fColorTable = NULL; 365 fColorTable = NULL;
366 } 366 }
367 } 367 }
368 } 368 }
369 } 369 }
370 370
371 bool SkBitmap::asImageInfo(SkImageInfo* info) const {
372 SkColorType ct;
373 switch (this->config()) {
374 case kNo_Config:
375 case kA1_Config:
376 return false;
377 case kA8_Config:
378 ct = kAlpha_8_SkColorType;
379 break;
380 case kIndex8_Config:
381 ct = kIndex8_SkColorType;
382 break;
383 case kRGB_565_Config:
384 ct = kRGB_565_SkColorType;
385 break;
386 case kARGB_4444_Config:
387 ct = kARGB_4444_SkColorType;
388 break;
389 case kARGB_8888_Config:
390 ct = kPMColor_SkColorType;
391 break;
392 }
393 if (info) {
394 info->fWidth = fWidth;
395 info->fHeight = fHeight;
396 info->fAlphaType = this->alphaType();
397 info->fColorType = ct;
398 }
399 return true;
400 }
401
371 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, size_t offset) { 402 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, size_t offset) {
372 // do this first, we that we never have a non-zero offset with a null ref 403 // do this first, we that we never have a non-zero offset with a null ref
373 if (NULL == pr) { 404 if (NULL == pr) {
374 offset = 0; 405 offset = 0;
375 } 406 }
376 407
377 if (fPixelRef != pr || fPixelRefOffset != offset) { 408 if (fPixelRef != pr || fPixelRefOffset != offset) {
378 if (fPixelRef != pr) { 409 if (fPixelRef != pr) {
379 this->freePixels(); 410 this->freePixels();
380 SkASSERT(NULL == fPixelRef); 411 SkASSERT(NULL == fPixelRef);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 445
415 void SkBitmap::setPixels(void* p, SkColorTable* ctable) { 446 void SkBitmap::setPixels(void* p, SkColorTable* ctable) {
416 if (NULL == p) { 447 if (NULL == p) {
417 this->setPixelRef(NULL, 0); 448 this->setPixelRef(NULL, 0);
418 return; 449 return;
419 } 450 }
420 451
421 Sk64 size = this->getSize64(); 452 Sk64 size = this->getSize64();
422 SkASSERT(!size.isNeg() && size.is32()); 453 SkASSERT(!size.isNeg() && size.is32());
423 454
424 this->setPixelRef(new SkMallocPixelRef(p, size.get32(), ctable, false))->unr ef(); 455 SkImageInfo info;
456 if (!this->asImageInfo(&info)) {
457 this->setPixelRef(NULL, 0);
458 return;
459 }
460 this->setPixelRef(new SkMallocPixelRef(info, p, fRowBytes, ctable, false))-> unref();
scroggo 2013/11/19 18:17:09 SkNEW_ARGS
reed1 2013/11/20 20:56:56 Done.
425 // since we're already allocated, we lockPixels right away 461 // since we're already allocated, we lockPixels right away
426 this->lockPixels(); 462 this->lockPixels();
427 SkDEBUGCODE(this->validate();) 463 SkDEBUGCODE(this->validate();)
428 } 464 }
429 465
430 bool SkBitmap::allocPixels(Allocator* allocator, SkColorTable* ctable) { 466 bool SkBitmap::allocPixels(Allocator* allocator, SkColorTable* ctable) {
431 HeapAllocator stdalloc; 467 HeapAllocator stdalloc;
432 468
433 if (NULL == allocator) { 469 if (NULL == allocator) {
434 allocator = &stdalloc; 470 allocator = &stdalloc;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 /** We explicitly use the same allocator for our pixels that SkMask does, 520 /** We explicitly use the same allocator for our pixels that SkMask does,
485 so that we can freely assign memory allocated by one class to the other. 521 so that we can freely assign memory allocated by one class to the other.
486 */ 522 */
487 bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst, 523 bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst,
488 SkColorTable* ctable) { 524 SkColorTable* ctable) {
489 Sk64 size = dst->getSize64(); 525 Sk64 size = dst->getSize64();
490 if (size.isNeg() || !size.is32()) { 526 if (size.isNeg() || !size.is32()) {
491 return false; 527 return false;
492 } 528 }
493 529
530 SkImageInfo info;
531 if (!dst->asImageInfo(&info)) {
532 SkDebugf("unsupported config for info %d\n", dst->config());
533 return false;
534 }
535
494 void* addr = sk_malloc_flags(size.get32(), 0); // returns NULL on failure 536 void* addr = sk_malloc_flags(size.get32(), 0); // returns NULL on failure
495 if (NULL == addr) { 537 if (NULL == addr) {
496 return false; 538 return false;
497 } 539 }
498 540
499 dst->setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))->unref(); 541 SkPixelRef* pr = SkNEW_ARGS(SkMallocPixelRef,
542 (info, addr, dst->rowBytes(), ctable, true));
543 dst->setPixelRef(pr, 0)->unref();
500 // since we're already allocated, we lockPixels right away 544 // since we're already allocated, we lockPixels right away
501 dst->lockPixels(); 545 dst->lockPixels();
502 return true; 546 return true;
503 } 547 }
504 548
505 /////////////////////////////////////////////////////////////////////////////// 549 ///////////////////////////////////////////////////////////////////////////////
506 550
507 size_t SkBitmap::getSafeSize() const { 551 size_t SkBitmap::getSafeSize() const {
508 // This is intended to be a size_t version of ComputeSafeSize64(), just 552 // This is intended to be a size_t version of ComputeSafeSize64(), just
509 // faster. The computation is meant to be identical. 553 // faster. The computation is meant to be identical.
(...skipping 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 if (NULL != uri) { 1753 if (NULL != uri) {
1710 str->appendf(" uri:\"%s\"", uri); 1754 str->appendf(" uri:\"%s\"", uri);
1711 } else { 1755 } else {
1712 str->appendf(" pixelref:%p", pr); 1756 str->appendf(" pixelref:%p", pr);
1713 } 1757 }
1714 } 1758 }
1715 1759
1716 str->append(")"); 1760 str->append(")");
1717 } 1761 }
1718 #endif 1762 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698