SkBitmapKey.h revision 895f3f0544ce38d35999771754cbb1d876c14b5a
1/* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7#ifndef SkBitmapKey_DEFINED 8#define SkBitmapKey_DEFINED 9 10#include "SkBitmap.h" 11#include "SkImage.h" 12#include "SkCanvas.h" 13 14class SkBitmapKey { 15public: 16 SkBitmapKey() : fSubset(SkIRect::MakeEmpty()), fID(0) {} 17 explicit SkBitmapKey(const SkBitmap& bm) 18 : fSubset(bm.getSubset()), fID(bm.getGenerationID()) {} 19 explicit SkBitmapKey(const SkImage* img) 20 : fSubset(img ? img->bounds() : SkIRect::MakeEmpty()) 21 , fID(img ? img->uniqueID() : 0) {} 22 explicit SkBitmapKey(const sk_sp<SkImage> img) 23 : fSubset(img->bounds()), fID(img->uniqueID()) {} 24 bool operator==(const SkBitmapKey& rhs) const { 25 return fID == rhs.fID && fSubset == rhs.fSubset; 26 } 27 bool operator!=(const SkBitmapKey& rhs) const { return !(*this == rhs); } 28 uint32_t id() const { return fID; } 29 30private: 31 SkIRect fSubset; 32 uint32_t fID; 33}; 34 35/** 36 This wraps a thing that could either be a bitmap or a image and 37 abstracts out some common tasks. 38 */ 39class SkImageBitmap { 40public: 41 explicit SkImageBitmap(const SkBitmap& b) : fBitmap(b), fImage(nullptr) {} 42 explicit SkImageBitmap(SkImage* i) : fImage(i) { SkASSERT(fImage); } 43 SkIRect bounds() const { return fImage ? fImage->bounds() : fBitmap.bounds(); } 44 SkISize dimensions() const { 45 return fImage ? fImage->dimensions() : fBitmap.dimensions(); 46 } 47 sk_sp<SkImage> makeImage() const { 48 return fImage ? sk_ref_sp(fImage) : SkImage::MakeFromBitmap(fBitmap); 49 } 50 SkBitmapKey getKey() const { 51 return fImage ? SkBitmapKey(fImage) : SkBitmapKey(fBitmap); 52 } 53 void draw(SkCanvas* canvas, SkPaint* paint) const { 54 if (fImage) { 55 canvas->drawImage(fImage, 0, 0, paint); 56 } else { 57 canvas->drawBitmap(fBitmap, 0, 0, paint); 58 } 59 } 60 61private: 62 SkBitmap fBitmap; 63 SkImage* fImage; // non-owning; when drawImage starts passing a sk_sp<>, 64 // we can take a const ref to that sk_sp<>. 65}; 66 67#endif // SkBitmapKey_DEFINED 68