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