1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmapCache.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkData.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageEncoder.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageFilter.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageFilterCache.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageGenerator.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImagePriv.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageShader.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage_Base.h" 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkNextID.h" 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPicture.h" 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPixelRef.h" 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkReadPixelsRec.h" 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSpecialImage.h" 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTexture.h" 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContext.h" 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage_Gpu.h" 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkImage::SkImage(int width, int height, uint32_t uniqueID) 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fWidth(width) 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fHeight(height) 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID) 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot{ 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(width > 0); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(height > 0); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::peekPixels(SkPixmap* pm) const { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap tmp; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!pm) { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pm = &tmp; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onPeekPixels(pm); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int srcX, int srcY, CachingHint chint) const { 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onReadPixels(dstInfo, dstPixels, dstRowBytes, srcX, srcY, chint); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::scalePixels(const SkPixmap& dst, SkFilterQuality quality, CachingHint chint) const { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (this->width() == dst.width() && this->height() == dst.height()) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->readPixels(dst, 0, 0, chint); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Idea: If/when SkImageGenerator supports a native-scaling API (where the generator itself 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // can scale more efficiently) we should take advantage of it here. 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bm; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (as_IB(this)->getROPixels(&bm, dst.info().colorSpace(), chint)) { 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap pmap; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Note: By calling the pixmap scaler, we never cache the final result, so the chint 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // is (currently) only being applied to the getROPixels. If we get a request to 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // also attempt to cache the final (scaled) result, we would add that logic here. 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return bm.peekPixels(&pmap) && pmap.scalePixels(dst, quality); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkAlphaType SkImage::alphaType() const { 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onAlphaType(); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkColorSpace* SkImage::colorSpace() const { 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onImageInfo().colorSpace(); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkColorSpace> SkImage::refColorSpace() const { 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onImageInfo().refColorSpace(); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkShader> SkImage::makeShader(SkShader::TileMode tileX, SkShader::TileMode tileY, 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix* localMatrix) const { 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkImageShader::Make(sk_ref_sp(const_cast<SkImage*>(this)), tileX, tileY, localMatrix); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkData> SkImage::encodeToData(SkEncodedImageFormat type, int quality) const { 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bm; 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpace* legacyColorSpace = nullptr; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (as_IB(this)->getROPixels(&bm, legacyColorSpace)) { 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkEncodeBitmap(bm, type, quality); 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkData> SkImage::encodeToData() const { 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (auto encoded = this->refEncodedData()) { 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return encoded; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bm; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap pmap; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpace* legacyColorSpace = nullptr; 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (as_IB(this)->getROPixels(&bm, legacyColorSpace) && bm.peekPixels(&pmap)) { 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkEncodePixmap(pmap, SkEncodedImageFormat::kPNG, 100); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkData> SkImage::refEncodedData() const { 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_sp<SkData>(as_IB(this)->onRefEncoded()); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset) { 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == encoded || 0 == encoded->size()) { 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkImage::MakeFromGenerator(SkImageGenerator::MakeFromEncoded(encoded), subset); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst char* SkImage::toString(SkString* str) const { 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot str->appendf("image: (id:%d (%d, %d) %s)", this->uniqueID(), this->width(), this->height(), 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->isOpaque() ? "opaque" : ""); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return str->c_str(); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeSubset(const SkIRect& subset) const { 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (subset.isEmpty()) { 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkIRect bounds = SkIRect::MakeWH(this->width(), this->height()); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!bounds.contains(subset)) { 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // optimization : return self if the subset == our bounds 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (bounds == subset) { 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_ref_sp(const_cast<SkImage*>(this)); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onMakeSubset(subset); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrTexture* SkImage::getTexture() const { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onGetTexture(); 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekProxy()); } 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextIO, 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin* origin) const { 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onGetTextureHandle(flushPendingGrContextIO, origin); 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isValid(GrContext* context) const { 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (context && context->abandoned()) { 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onIsValid(context); 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#else 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrTexture* SkImage::getTexture() const { return nullptr; } 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isTextureBacked() const { return false; } 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrBackendObject SkImage::getTextureHandle(bool, GrSurfaceOrigin*) const { return 0; } 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isValid(GrContext* context) const { 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (context) { 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onIsValid(context); 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkImage_Base::SkImage_Base(int width, int height, uint32_t uniqueID) 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(width, height, uniqueID) 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fAddedToCache(false) 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot{} 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkImage_Base::~SkImage_Base() { 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fAddedToCache.load()) { 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkNotifyBitmapGenIDIsStale(this->uniqueID()); 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::readPixels(const SkPixmap& pmap, int srcX, int srcY, CachingHint chint) const { 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->readPixels(pmap.info(), pmap.writable_addr(), pmap.rowBytes(), srcX, srcY, chint); 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromBitmap(const SkBitmap& bm) { 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixelRef* pr = bm.pixelRef(); 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == pr) { 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkMakeImageFromRasterBitmap(bm, kIfMutable_SkCopyPixelsMode); 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const { 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onAsLegacyBitmap(bitmap, mode); 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage_Base::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const { 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // As the base-class, all we can do is make a copy (regardless of mode). 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Subclasses that want to be more optimal should override. 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = this->onImageInfo().makeColorType(kN32_SkColorType).makeColorSpace(nullptr); 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!bitmap->tryAllocPixels(info)) { 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!this->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), 0, 0)) { 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bitmap->reset(); 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kRO_LegacyBitmapMode == mode) { 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bitmap->setImmutable(); 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix* matrix, const SkPaint* paint, 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace) { 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return MakeFromGenerator(SkImageGenerator::MakeFromPicture(dimensions, std::move(picture), 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix, paint, bitDepth, 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::move(colorSpace))); 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRect& subset, 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkIRect& clipBounds, SkIRect* outSubset, 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIPoint* offset) const { 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!filter || !outSubset || !offset || !this->bounds().contains(subset)) { 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpace* colorSpace = as_IB(this)->onImageInfo().colorSpace(); 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSpecialImage> srcSpecialImage = SkSpecialImage::MakeFromImage( 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot subset, sk_ref_sp(const_cast<SkImage*>(this)), colorSpace); 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!srcSpecialImage) { 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImageFilterCache> cache( 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageFilterCache::Create(SkImageFilterCache::kDefaultTransientSize)); 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageFilter::OutputProperties outputProperties(colorSpace); 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageFilter::Context context(SkMatrix::I(), clipBounds, cache.get(), outputProperties); 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSpecialImage> result = filter->filterImage(srcSpecialImage.get(), context, offset); 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!result) { 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *outSubset = SkIRect::MakeWH(result->width(), result->height()); 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!outSubset->intersect(clipBounds.makeOffset(-offset->x(), -offset->y()))) { 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot offset->fX += outSubset->x(); 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot offset->fY += outSubset->y(); 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Note that here we're returning the special image's entire backing store, loose padding 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // and all! 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return result->asImage(); 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isLazyGenerated() const { 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onIsLazyGenerated(); 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::isAlphaOnly() const { 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onImageInfo().colorType() == kAlpha_8_SkColorType; 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeColorSpace(sk_sp<SkColorSpace> target, 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTransferFunctionBehavior premulBehavior) const { 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpaceTransferFn fn; 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!target || !target->isNumericalTransferFn(&fn)) { 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // No need to create a new image if: 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // (1) The color spaces are equal. 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // (2) The color type is kAlpha8. 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SkColorSpace::Equals(this->colorSpace(), target.get()) || 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAlpha_8_SkColorType == as_IB(this)->onImageInfo().colorType()) { 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_ref_sp(const_cast<SkImage*>(this)); 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType targetColorType = kN32_SkColorType; 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SkTransferFunctionBehavior::kRespect == premulBehavior && target->gammaIsLinear()) { 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot targetColorType = kRGBA_F16_SkColorType; 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // TODO: We might consider making this a deferred conversion? 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(this)->onMakeColorSpace(std::move(target), targetColorType, premulBehavior); 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeNonTextureImage() const { 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!this->isTextureBacked()) { 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_ref_sp(const_cast<SkImage*>(this)); 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->makeRasterImage(); 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeRasterImage() const { 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap pm; 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (this->peekPixels(&pm)) { 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_ref_sp(const_cast<SkImage*>(this)); 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo info = as_IB(this)->onImageInfo(); 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const size_t rowBytes = info.minRowBytes(); 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t size = info.computeByteSize(rowBytes); 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SkImageInfo::ByteSizeOverflowed(size)) { 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkData> data = SkData::MakeUninitialized(size); 336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pm = { info.makeColorSpace(nullptr), data->writable_data(), info.minRowBytes() }; 337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!this->readPixels(pm, 0, 0)) { 338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkImage::MakeRasterData(info, std::move(data), rowBytes); 342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////////////// 345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if !SK_SUPPORT_GPU 347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> MakeTextureFromMipMap(GrContext*, const SkImageInfo&, const GrMipLevel texels[], 349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int mipLevelCount, SkBudgeted, SkDestinationSurfaceColorMode) { 350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, 354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& tex, GrSurfaceOrigin origin, 355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAlphaType at, sk_sp<SkColorSpace> cs, 356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TextureReleaseProc releaseP, ReleaseContext releaseC) { 357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsize_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy&, 361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const DeferredTextureImageUsageParams[], 362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int paramCnt, void* buffer, 363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpace* dstColorSpace, 364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType dstColorType) const { 365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return 0; 366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, const void*, 369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBudgeted) { 370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, 374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& tex, GrSurfaceOrigin origin, 375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs, 376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TextureReleaseProc releaseP, ReleaseContext releaseC) { 377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage::MakeBackendTextureFromSkImage(GrContext*, 381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage>, 382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrBackendTexture*, 383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot BackendTextureReleaseProc*) { 384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, 388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& tex, GrSurfaceOrigin origin, 389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAlphaType at, sk_sp<SkColorSpace> cs) { 390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, 394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& tex, GrSurfaceOrigin origin, 395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType ct, SkAlphaType at, 396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> cs) { 397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space, 401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendObject yuvTextureHandles[3], 402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkISize yuvSizes[3], 403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> imageColorSpace) { 405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space, 409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture yuvTextureHandles[3], 410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkISize yuvSizes[3], 411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> imageColorSpace) { 413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImage::makeTextureImage(GrContext*, SkColorSpace* dstColorSpace) const { 417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> MakeTextureFromMipMap(GrContext*, const SkImageInfo&, const GrMipLevel texels[], 425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int mipLevelCount, SkBudgeted) { 426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool SkImage_pinAsTexture(const SkImage* image, GrContext* ctx) { 432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(image); 433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(ctx); 434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return as_IB(image)->onPinAsTexture(ctx); 435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkImage_unpinAsTexture(const SkImage* image, GrContext* ctx) { 438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(image); 439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(ctx); 440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot as_IB(image)->onUnpinAsTexture(ctx); 441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////////////////////////// 444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkImageMakeRasterCopyAndAssignColorSpace(const SkImage* src, 446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSpace* colorSpace) { 447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Read the pixels out of the source image, with no conversion 448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = as_IB(src)->onImageInfo(); 449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kUnknown_SkColorType == info.colorType()) { 450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Unexpected color type"); 451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t rowBytes = info.minRowBytes(); 455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t size = info.computeByteSize(rowBytes); 456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SkImageInfo::ByteSizeOverflowed(size)) { 457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot auto data = SkData::MakeUninitialized(size); 460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!data) { 461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap pm(info, data->writable_data(), rowBytes); 465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!src->readPixels(pm, 0, 0, SkImage::kDisallow_CachingHint)) { 466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Wrap them in a new image with a different color space 470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkImage::MakeRasterData(info.makeColorSpace(sk_ref_sp(colorSpace)), data, rowBytes); 471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 472