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