158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com/*
258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com * Copyright 2012 Google Inc.
358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com *
458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com * Use of this source code is governed by a BSD-style license that can be
558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com * found in the LICENSE file.
658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com */
758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com#include "SkImage_Base.h"
958b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com#include "SkBitmap.h"
1058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com#include "SkCanvas.h"
1158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com#include "SkData.h"
125965c8ae4ee960275da4bc40189bdba85aab8b5ereed#include "SkImageGenerator.h"
1373953e7d00f0a75a98e985ceed88059d35945327kkinnunen#include "SkImagePriv.h"
1473953e7d00f0a75a98e985ceed88059d35945327kkinnunen#include "SkPixelRef.h"
154af267b11964d4a8acdb232ac46094c84d890e88reed#include "SkSurface.h"
1658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
1758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.comclass SkImage_Raster : public SkImage_Base {
1858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.compublic:
19b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org    static bool ValidArgs(const Info& info, size_t rowBytes) {
2058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        const int maxDimension = SK_MaxS32 >> 2;
2158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        const size_t kMaxPixelByteSize = SK_MaxS32;
2258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
23b2497c2d945c0a5d770865b026e2d5947bf37c91reed        if (info.width() <= 0 || info.height() <= 0) {
2458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
2558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
26e5ea500d4714a7d84de2bf913e81be3b65d2de68reed        if (info.width() > maxDimension || info.height() > maxDimension) {
2758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
2858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
29e5ea500d4714a7d84de2bf913e81be3b65d2de68reed        if ((unsigned)info.colorType() > (unsigned)kLastEnum_SkColorType) {
3058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
3158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
32e5ea500d4714a7d84de2bf913e81be3b65d2de68reed        if ((unsigned)info.alphaType() > (unsigned)kLastEnum_SkAlphaType) {
3358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
3458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
3558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
36a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org        if (kUnknown_SkColorType == info.colorType()) {
3758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
3858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
39fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        // TODO: check colorspace
41fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        if (rowBytes < SkImageMinRowBytes(info)) {
4358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
4458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
45fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
46e5ea500d4714a7d84de2bf913e81be3b65d2de68reed        int64_t size = (int64_t)info.height() * rowBytes;
47d9e0181405c9853ffd20502555200205a5ab09b1bsalomon@google.com        if (size > (int64_t)kMaxPixelByteSize) {
4858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com            return false;
4958b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        }
5058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        return true;
5158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    }
5258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
534af267b11964d4a8acdb232ac46094c84d890e88reed    SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, const SkSurfaceProps*);
5458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    virtual ~SkImage_Raster();
5558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const override;
5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onReadPixels(const SkImageInfo&, void*, size_t, int srcX, int srcY) const override;
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const override;
5936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool getROPixels(SkBitmap*) const override;
6058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
6158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    // exposed for SkSurface_Raster via SkNewImageFromPixelRef
6273953e7d00f0a75a98e985ceed88059d35945327kkinnunen    SkImage_Raster(const SkImageInfo&, SkPixelRef*, const SkIPoint& pixelRefOrigin, size_t rowBytes,
6373953e7d00f0a75a98e985ceed88059d35945327kkinnunen                   const SkSurfaceProps*);
6458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
6597af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); }
6697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
677831a4bbb46a919316efc7c70808dcaaf8ee629atfarina    SkShader* onNewShader(SkShader::TileMode,
687831a4bbb46a919316efc7c70808dcaaf8ee629atfarina                          SkShader::TileMode,
697831a4bbb46a919316efc7c70808dcaaf8ee629atfarina                          const SkMatrix* localMatrix) const override;
70cef04f818820e59fb534eb226f967f72497845d3piotaixr
7136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isOpaque() const override;
72d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr
734af267b11964d4a8acdb232ac46094c84d890e88reed    SkImage_Raster(const SkBitmap& bm, const SkSurfaceProps* props)
744af267b11964d4a8acdb232ac46094c84d890e88reed        : INHERITED(bm.width(), bm.height(), props)
75ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary        , fBitmap(bm) {}
76ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary
7758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.comprivate:
784af267b11964d4a8acdb232ac46094c84d890e88reed    SkImage_Raster() : INHERITED(0, 0, NULL) {}
7958b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
8058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    SkBitmap    fBitmap;
8158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
8258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    typedef SkImage_Base INHERITED;
8358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com};
8458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
8558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com///////////////////////////////////////////////////////////////////////////////
8658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
874f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.comstatic void release_data(void* addr, void* context) {
884f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    SkData* data = static_cast<SkData*>(context);
894f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    data->unref();
904f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com}
914f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com
924af267b11964d4a8acdb232ac46094c84d890e88reedSkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes,
934af267b11964d4a8acdb232ac46094c84d890e88reed                               const SkSurfaceProps* props)
944af267b11964d4a8acdb232ac46094c84d890e88reed    : INHERITED(info.width(), info.height(), props)
954f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com{
964f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    data->ref();
974f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    void* addr = const_cast<void*>(data->data());
9800f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org    SkColorTable* ctable = NULL;
994f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com
10000f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org    fBitmap.installPixels(info, addr, rowBytes, ctable, release_data, data);
10158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    fBitmap.setImmutable();
1024f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    fBitmap.lockPixels();
10358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com}
10458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
10573953e7d00f0a75a98e985ceed88059d35945327kkinnunenSkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, const SkIPoint& pixelRefOrigin,
10673953e7d00f0a75a98e985ceed88059d35945327kkinnunen                               size_t rowBytes,  const SkSurfaceProps* props)
1074af267b11964d4a8acdb232ac46094c84d890e88reed    : INHERITED(info.width(), info.height(), props)
108f1901788d8753332c5748a30e8d14e290c155bd1commit-bot@chromium.org{
109a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org    fBitmap.setInfo(info, rowBytes);
11073953e7d00f0a75a98e985ceed88059d35945327kkinnunen    fBitmap.setPixelRef(pr, pixelRefOrigin);
1114f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    fBitmap.lockPixels();
11258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com}
11358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
11458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.comSkImage_Raster::~SkImage_Raster() {}
11558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
1168572fc01ac4f6bdcf173b05417776abc55f729c1reedSkShader* SkImage_Raster::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY,
1178572fc01ac4f6bdcf173b05417776abc55f729c1reed                                      const SkMatrix* localMatrix) const {
11876d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr    return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix);
119cef04f818820e59fb534eb226f967f72497845d3piotaixr}
120cef04f818820e59fb534eb226f967f72497845d3piotaixr
1214af267b11964d4a8acdb232ac46094c84d890e88reedSkSurface* SkImage_Raster::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const {
1224af267b11964d4a8acdb232ac46094c84d890e88reed    return SkSurface::NewRaster(info, &props);
1234af267b11964d4a8acdb232ac46094c84d890e88reed}
1244af267b11964d4a8acdb232ac46094c84d890e88reed
12596472deea70169396b8e1f576e470138f55fdb1freedbool SkImage_Raster::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
12696472deea70169396b8e1f576e470138f55fdb1freed                                  int srcX, int srcY) const {
127b4f629cd688b680eba21a5a08daeaf82bbe65b28reed    SkBitmap shallowCopy(fBitmap);
128b4f629cd688b680eba21a5a08daeaf82bbe65b28reed    return shallowCopy.readPixels(dstInfo, dstPixels, dstRowBytes, srcX, srcY);
1294f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com}
1304f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com
1318572fc01ac4f6bdcf173b05417776abc55f729c1reedconst void* SkImage_Raster::onPeekPixels(SkImageInfo* infoPtr, size_t* rowBytesPtr) const {
132466f5f3e44e703ca58b43ac1c4ac3bfa0e1ff024commit-bot@chromium.org    const SkImageInfo info = fBitmap.info();
133466f5f3e44e703ca58b43ac1c4ac3bfa0e1ff024commit-bot@chromium.org    if ((kUnknown_SkColorType == info.colorType()) || !fBitmap.getPixels()) {
1342776e01d2c8ae6a23718cd4f4d9a4bf368a8e46breed@google.com        return NULL;
1354f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    }
1364f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    *infoPtr = info;
1374f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    *rowBytesPtr = fBitmap.rowBytes();
1384f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com    return fBitmap.getPixels();
1394f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com}
1404f7c61583b16e3056cf3350fcef42dcc6d3483b7reed@google.com
1414b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.combool SkImage_Raster::getROPixels(SkBitmap* dst) const {
1424b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    *dst = fBitmap;
1434b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    return true;
1444b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com}
1454b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com
14658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com///////////////////////////////////////////////////////////////////////////////
14758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
1482bd8b8100529c96c81c30f749f672f4caf775b04reed@google.comSkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, size_t rowBytes) {
149b2497c2d945c0a5d770865b026e2d5947bf37c91reed    if (!SkImage_Raster::ValidArgs(info, rowBytes) || !pixels) {
15058b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        return NULL;
15158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    }
152fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
15358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    // Here we actually make a copy of the caller's pixel data
154e5ea500d4714a7d84de2bf913e81be3b65d2de68reed    SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.height() * rowBytes));
1554af267b11964d4a8acdb232ac46094c84d890e88reed    return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL));
15658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com}
15758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
15858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
159999da9c5e45fb533efe8782c9096794b9ad1c1b3reed@google.comSkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t rowBytes) {
160b2497c2d945c0a5d770865b026e2d5947bf37c91reed    if (!SkImage_Raster::ValidArgs(info, rowBytes) || !data) {
16158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        return NULL;
16258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    }
163fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
16458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    // did they give us enough data?
165e5ea500d4714a7d84de2bf913e81be3b65d2de68reed    size_t size = info.height() * rowBytes;
166999da9c5e45fb533efe8782c9096794b9ad1c1b3reed@google.com    if (data->size() < size) {
16758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        return NULL;
16858b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    }
169fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1704af267b11964d4a8acdb232ac46094c84d890e88reed    return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL));
17158b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com}
17258b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
173ea4673fde65f15d6f1ca77e24ced7348c4914517halcanarySkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
174ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary    SkBitmap bitmap;
175ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary    if (!SkInstallDiscardablePixelRef(generator, &bitmap)) {
176ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary        return NULL;
177ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary    }
1787983bf914a6df040befe2aafb3657c469b678257reed    if (0 == bitmap.width() || 0 == bitmap.height()) {
1797983bf914a6df040befe2aafb3657c469b678257reed        return NULL;
1807983bf914a6df040befe2aafb3657c469b678257reed    }
1817983bf914a6df040befe2aafb3657c469b678257reed
1824af267b11964d4a8acdb232ac46094c84d890e88reed    return SkNEW_ARGS(SkImage_Raster, (bitmap, NULL));
183ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary}
184ea4673fde65f15d6f1ca77e24ced7348c4914517halcanary
18573953e7d00f0a75a98e985ceed88059d35945327kkinnunenSkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
18673953e7d00f0a75a98e985ceed88059d35945327kkinnunen                                const SkIPoint& pixelRefOrigin, size_t rowBytes,
1874af267b11964d4a8acdb232ac46094c84d890e88reed                                const SkSurfaceProps* props) {
1887983bf914a6df040befe2aafb3657c469b678257reed    if (!SkImage_Raster::ValidArgs(info, rowBytes)) {
1897983bf914a6df040befe2aafb3657c469b678257reed        return NULL;
1907983bf914a6df040befe2aafb3657c469b678257reed    }
19173953e7d00f0a75a98e985ceed88059d35945327kkinnunen    return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props));
19273953e7d00f0a75a98e985ceed88059d35945327kkinnunen}
19373953e7d00f0a75a98e985ceed88059d35945327kkinnunen
19473953e7d00f0a75a98e985ceed88059d35945327kkinnunenSkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef,
19573953e7d00f0a75a98e985ceed88059d35945327kkinnunen                              const SkSurfaceProps* props) {
19673953e7d00f0a75a98e985ceed88059d35945327kkinnunen    if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes())) {
19773953e7d00f0a75a98e985ceed88059d35945327kkinnunen        return NULL;
19873953e7d00f0a75a98e985ceed88059d35945327kkinnunen    }
19973953e7d00f0a75a98e985ceed88059d35945327kkinnunen
20073953e7d00f0a75a98e985ceed88059d35945327kkinnunen    SkImage* image = NULL;
20173953e7d00f0a75a98e985ceed88059d35945327kkinnunen    if (canSharePixelRef || bm.isImmutable()) {
20273953e7d00f0a75a98e985ceed88059d35945327kkinnunen        image = SkNEW_ARGS(SkImage_Raster, (bm, props));
20373953e7d00f0a75a98e985ceed88059d35945327kkinnunen    } else {
20473953e7d00f0a75a98e985ceed88059d35945327kkinnunen        bm.lockPixels();
20573953e7d00f0a75a98e985ceed88059d35945327kkinnunen        if (bm.getPixels()) {
20673953e7d00f0a75a98e985ceed88059d35945327kkinnunen            image = SkImage::NewRasterCopy(bm.info(), bm.getPixels(), bm.rowBytes());
20773953e7d00f0a75a98e985ceed88059d35945327kkinnunen        }
20873953e7d00f0a75a98e985ceed88059d35945327kkinnunen        bm.unlockPixels();
20973953e7d00f0a75a98e985ceed88059d35945327kkinnunen
21073953e7d00f0a75a98e985ceed88059d35945327kkinnunen        // we don't expose props to NewRasterCopy (need a private vers) so post-init it here
21173953e7d00f0a75a98e985ceed88059d35945327kkinnunen        if (image && props) {
21273953e7d00f0a75a98e985ceed88059d35945327kkinnunen            as_IB(image)->initWithProps(*props);
21373953e7d00f0a75a98e985ceed88059d35945327kkinnunen        }
21473953e7d00f0a75a98e985ceed88059d35945327kkinnunen    }
21573953e7d00f0a75a98e985ceed88059d35945327kkinnunen    return image;
21658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com}
21758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
21865151754b9fdb6a968d7307764c20655d1b680a0piotaixrconst SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {
21965151754b9fdb6a968d7307764c20655d1b680a0piotaixr    return ((const SkImage_Raster*)image)->getPixelRef();
22097af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com}
221d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr
222d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixrbool SkImage_Raster::isOpaque() const {
223d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr    return fBitmap.isOpaque();
224d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr}
22596a857ef5a40b3d0751ec9ebaaa96d9f20b82b21reed
226