SkBitmapProvider.cpp revision 013e9e3bb0495ab0b5aff011429a6ac983464d34
1/*
2 * Copyright 2015 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
8#include "SkBitmapProvider.h"
9#include "SkImage_Base.h"
10#include "SkPixelRef.h"
11
12int SkBitmapProvider::width() const {
13    return fImage ? fImage->width() : fBitmap.width();
14}
15
16int SkBitmapProvider::height() const {
17    return fImage ? fImage->height() : fBitmap.height();
18}
19
20uint32_t SkBitmapProvider::getID() const {
21    return fImage ? fImage->uniqueID() : fBitmap.getGenerationID();
22}
23
24bool SkBitmapProvider::validForDrawing() const {
25    if (!fImage) {
26        if (0 == fBitmap.width() || 0 == fBitmap.height()) {
27            return false;
28        }
29        if (nullptr == fBitmap.pixelRef()) {
30            return false;   // no pixels to read
31        }
32        if (fBitmap.getTexture()) {
33            // we can handle texture (ugh) since lockPixels will perform a read-back
34            return true;
35        }
36        if (kIndex_8_SkColorType == fBitmap.colorType()) {
37            SkAutoLockPixels alp(fBitmap); // but we need to call it before getColorTable() is safe.
38            if (!fBitmap.getColorTable()) {
39                return false;
40            }
41        }
42    }
43    return true;
44}
45
46SkImageInfo SkBitmapProvider::info() const {
47    if (fImage) {
48        SkAlphaType at = fImage->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
49        return SkImageInfo::MakeN32(fImage->width(), fImage->height(), at);
50    } else {
51        return fBitmap.info();
52    }
53}
54
55SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc(int w, int h) const {
56    return fImage ? SkBitmapCacheDesc::Make(fImage, w, h) : SkBitmapCacheDesc::Make(fBitmap, w, h);
57}
58
59SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc() const {
60    return fImage ? SkBitmapCacheDesc::Make(fImage) : SkBitmapCacheDesc::Make(fBitmap);
61}
62
63void SkBitmapProvider::notifyAddedToCache() const {
64    if (fImage) {
65        // TODO
66    } else {
67        fBitmap.pixelRef()->notifyAddedToCache();
68    }
69}
70
71bool SkBitmapProvider::asBitmap(SkBitmap* bm) const {
72    if (fImage) {
73        return as_IB(fImage)->getROPixels(bm);
74    } else {
75        *bm = fBitmap;
76        return true;
77    }
78}
79
80