blob: 1970c57839912db2d4288f8b32d9af5f780f72bb [file] [log] [blame]
reed@google.com6997ebb2012-07-30 19:50:31 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed@google.comf6627b72012-07-27 18:02:50 +00008#include "SkBitmap.h"
fmalita3b0d5322015-09-18 08:07:31 -07009#include "SkBitmapCache.h"
mike@reedtribe.org70e35902012-07-29 20:38:16 +000010#include "SkCanvas.h"
reed871872f2015-06-22 12:48:26 -070011#include "SkData.h"
halcanaryf2848b62015-12-10 12:40:23 -080012#include "SkImageEncoder.h"
reed5965c8a2015-01-07 18:04:45 -080013#include "SkImageGenerator.h"
scroggo@google.com7def5e12013-05-31 14:00:10 +000014#include "SkImagePriv.h"
reed856e9d92015-09-30 12:21:45 -070015#include "SkImageShader.h"
scroggo@google.com7def5e12013-05-31 14:00:10 +000016#include "SkImage_Base.h"
reed80c772b2015-07-30 18:58:23 -070017#include "SkNextID.h"
reed7fb4f8b2016-03-11 04:33:52 -080018#include "SkPicture.h"
reed56179002015-07-07 06:11:19 -070019#include "SkPixelRef.h"
fmalita2be71252015-09-03 07:17:25 -070020#include "SkPixelSerializer.h"
reed96472de2014-12-10 09:53:42 -080021#include "SkReadPixelsRec.h"
reedf8d18742015-01-02 20:45:37 -080022#include "SkString.h"
reed4af267b2014-11-21 08:46:37 -080023#include "SkSurface.h"
reed56179002015-07-07 06:11:19 -070024
bsalomon55812362015-06-10 08:49:28 -070025#if SK_SUPPORT_GPU
26#include "GrTexture.h"
27#include "GrContext.h"
reed56179002015-07-07 06:11:19 -070028#include "SkImage_Gpu.h"
bsalomon55812362015-06-10 08:49:28 -070029#endif
scroggo@google.com7def5e12013-05-31 14:00:10 +000030
reed80c772b2015-07-30 18:58:23 -070031SkImage::SkImage(int width, int height, uint32_t uniqueID)
32 : fWidth(width)
33 , fHeight(height)
34 , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID)
35{
36 SkASSERT(width > 0);
37 SkASSERT(height > 0);
reed@google.comf6627b72012-07-27 18:02:50 +000038}
39
reed6ceeebd2016-03-09 14:26:26 -080040bool SkImage::peekPixels(SkPixmap* pm) const {
41 SkPixmap tmp;
42 if (!pm) {
43 pm = &tmp;
reed@google.com4f7c6152014-02-06 14:11:56 +000044 }
reed6ceeebd2016-03-09 14:26:26 -080045 return as_IB(this)->onPeekPixels(pm);
reed@google.com4f7c6152014-02-06 14:11:56 +000046}
47
reed6ceeebd2016-03-09 14:26:26 -080048#ifdef SK_SUPPORT_LEGACY_PEEKPIXELS_PARMS
49const void* SkImage::peekPixels(SkImageInfo* info, size_t* rowBytes) const {
50 SkPixmap pm;
51 if (this->peekPixels(&pm)) {
52 if (info) {
53 *info = pm.info();
54 }
55 if (rowBytes) {
56 *rowBytes = pm.rowBytes();
57 }
58 return pm.addr();
59 }
60 return nullptr;
61}
62#endif
63
reed96472de2014-12-10 09:53:42 -080064bool SkImage::readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
reed09553032015-11-23 12:32:16 -080065 int srcX, int srcY, CachingHint chint) const {
reed96472de2014-12-10 09:53:42 -080066 SkReadPixelsRec rec(dstInfo, dstPixels, dstRowBytes, srcX, srcY);
67 if (!rec.trim(this->width(), this->height())) {
reed@google.com4f7c6152014-02-06 14:11:56 +000068 return false;
69 }
reed09553032015-11-23 12:32:16 -080070 return as_IB(this)->onReadPixels(rec.fInfo, rec.fPixels, rec.fRowBytes, rec.fX, rec.fY, chint);
71}
72
73bool SkImage::scalePixels(const SkPixmap& dst, SkFilterQuality quality, CachingHint chint) const {
reed6868c3f2015-11-24 11:44:47 -080074 if (this->width() == dst.width() && this->height() == dst.height()) {
75 return this->readPixels(dst, 0, 0, chint);
76 }
77
reed09553032015-11-23 12:32:16 -080078 // Idea: If/when SkImageGenerator supports a native-scaling API (where the generator itself
79 // can scale more efficiently) we should take advantage of it here.
80 //
81 SkBitmap bm;
82 if (as_IB(this)->getROPixels(&bm, chint)) {
83 bm.lockPixels();
84 SkPixmap pmap;
85 // Note: By calling the pixmap scaler, we never cache the final result, so the chint
86 // is (currently) only being applied to the getROPixels. If we get a request to
87 // also attempt to cache the final (scaled) result, we would add that logic here.
88 //
89 return bm.peekPixels(&pmap) && pmap.scalePixels(dst, quality);
90 }
91 return false;
reed@google.com4f7c6152014-02-06 14:11:56 +000092}
93
reedd6b30312015-09-02 07:06:23 -070094void SkImage::preroll(GrContext* ctx) const {
reedefd50da2015-09-14 11:17:23 -070095 // For now, and to maintain parity w/ previous pixelref behavior, we just force the image
96 // to produce a cached raster-bitmap form, so that drawing to a raster canvas should be fast.
97 //
98 SkBitmap bm;
99 if (as_IB(this)->getROPixels(&bm)) {
100 bm.lockPixels();
101 bm.unlockPixels();
102 }
reedd6b30312015-09-02 07:06:23 -0700103}
104
reed88d064d2015-10-12 11:30:02 -0700105///////////////////////////////////////////////////////////////////////////////////////////////////
106
reed5671c5b2016-03-09 14:47:34 -0800107sk_sp<SkShader> SkImage::makeShader(SkShader::TileMode tileX, SkShader::TileMode tileY,
108 const SkMatrix* localMatrix) const {
109 return SkImageShader::Make(this, tileX, tileY, localMatrix);
piotaixrcef04f82014-07-14 07:48:04 -0700110}
111
reed5671c5b2016-03-09 14:47:34 -0800112#ifdef SK_SUPPORT_LEGACY_CREATESHADER_PTR
113SkShader* SkImage::newShader(SkShader::TileMode tileX, SkShader::TileMode tileY,
114 const SkMatrix* localMatrix) const {
115 return this->makeShader(tileX, tileY, localMatrix).release();
116}
117#endif
118
scroggo@google.com7def5e12013-05-31 14:00:10 +0000119SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const {
120 SkBitmap bm;
121 if (as_IB(this)->getROPixels(&bm)) {
122 return SkImageEncoder::EncodeData(bm, type, quality);
123 }
halcanary96fcdcc2015-08-27 07:41:13 -0700124 return nullptr;
junov@chromium.orgda904742013-05-01 22:38:16 +0000125}
reed@google.com4f7c6152014-02-06 14:11:56 +0000126
halcanarya2e05672015-12-09 03:56:02 -0800127SkData* SkImage::encode(SkPixelSerializer* serializer) const {
halcanaryf2848b62015-12-10 12:40:23 -0800128 SkAutoTUnref<SkPixelSerializer> defaultSerializer;
129 SkPixelSerializer* effectiveSerializer = serializer;
130 if (!effectiveSerializer) {
131 defaultSerializer.reset(SkImageEncoder::CreatePixelSerializer());
132 SkASSERT(defaultSerializer.get());
133 effectiveSerializer = defaultSerializer.get();
134 }
fmalita2be71252015-09-03 07:17:25 -0700135 SkAutoTUnref<SkData> encoded(this->refEncoded());
reedc9e190d2015-09-28 09:58:41 -0700136 if (encoded && effectiveSerializer->useEncodedData(encoded->data(), encoded->size())) {
mtklein18300a32016-03-16 13:53:35 -0700137 return encoded.release();
fmalita2be71252015-09-03 07:17:25 -0700138 }
139
140 SkBitmap bm;
141 SkAutoPixmapUnlock apu;
142 if (as_IB(this)->getROPixels(&bm) && bm.requestLock(&apu)) {
halcanary6b280172015-12-07 12:42:24 -0800143 return effectiveSerializer->encode(apu.pixmap());
fmalita2be71252015-09-03 07:17:25 -0700144 }
145
146 return nullptr;
147}
148
reed871872f2015-06-22 12:48:26 -0700149SkData* SkImage::refEncoded() const {
reed05dd2512016-01-05 09:16:19 -0800150 GrContext* ctx = nullptr; // should we allow the caller to pass in a ctx?
151 return as_IB(this)->onRefEncoded(ctx);
reed871872f2015-06-22 12:48:26 -0700152}
153
reed7fb4f8b2016-03-11 04:33:52 -0800154sk_sp<SkImage> SkImage::MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset) {
halcanary96fcdcc2015-08-27 07:41:13 -0700155 if (nullptr == encoded || 0 == encoded->size()) {
156 return nullptr;
reed5965c8a2015-01-07 18:04:45 -0800157 }
reed7fb4f8b2016-03-11 04:33:52 -0800158 SkImageGenerator* generator = SkImageGenerator::NewFromEncoded(encoded.get());
159 return SkImage::MakeFromGenerator(generator, subset);
reed5965c8a2015-01-07 18:04:45 -0800160}
161
reedf8d18742015-01-02 20:45:37 -0800162const char* SkImage::toString(SkString* str) const {
163 str->appendf("image: (id:%d (%d, %d) %s)", this->uniqueID(), this->width(), this->height(),
164 this->isOpaque() ? "opaque" : "");
165 return str->c_str();
166}
167
reed7fb4f8b2016-03-11 04:33:52 -0800168sk_sp<SkImage> SkImage::makeSubset(const SkIRect& subset) const {
reed7b6945b2015-09-24 00:50:58 -0700169 if (subset.isEmpty()) {
170 return nullptr;
171 }
172
173 const SkIRect bounds = SkIRect::MakeWH(this->width(), this->height());
174 if (!bounds.contains(subset)) {
175 return nullptr;
176 }
177
178 // optimization : return self if the subset == our bounds
179 if (bounds == subset) {
reed7fb4f8b2016-03-11 04:33:52 -0800180 return sk_ref_sp(const_cast<SkImage*>(this));
reed7b6945b2015-09-24 00:50:58 -0700181 }
reed7fb4f8b2016-03-11 04:33:52 -0800182 return as_IB(this)->onMakeSubset(subset);
reedf803da12015-01-23 05:58:07 -0800183}
184
bsalomon55812362015-06-10 08:49:28 -0700185#if SK_SUPPORT_GPU
186
187GrTexture* SkImage::getTexture() const {
reed85d91782015-09-10 14:33:38 -0700188 return as_IB(this)->peekTexture();
bsalomon55812362015-06-10 08:49:28 -0700189}
190
bsalomon84a4e5a2016-02-29 11:41:52 -0800191bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekTexture()); }
bsalomon55812362015-06-10 08:49:28 -0700192
bsalomonc49e8682015-06-30 11:37:35 -0700193GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextIO) const {
bsalomon84a4e5a2016-02-29 11:41:52 -0800194 GrTexture* texture = as_IB(this)->peekTexture();
bsalomon55812362015-06-10 08:49:28 -0700195 if (texture) {
196 GrContext* context = texture->getContext();
197 if (context) {
bsalomonc49e8682015-06-30 11:37:35 -0700198 if (flushPendingGrContextIO) {
199 context->prepareSurfaceForExternalIO(texture);
bsalomon55812362015-06-10 08:49:28 -0700200 }
201 }
202 return texture->getTextureHandle();
203 }
204 return 0;
205}
206
207#else
208
halcanary96fcdcc2015-08-27 07:41:13 -0700209GrTexture* SkImage::getTexture() const { return nullptr; }
bsalomon55812362015-06-10 08:49:28 -0700210
211bool SkImage::isTextureBacked() const { return false; }
212
bsalomonc49e8682015-06-30 11:37:35 -0700213GrBackendObject SkImage::getTextureHandle(bool) const { return 0; }
bsalomon55812362015-06-10 08:49:28 -0700214
215#endif
216
reed@google.com4f7c6152014-02-06 14:11:56 +0000217///////////////////////////////////////////////////////////////////////////////
218
219static bool raster_canvas_supports(const SkImageInfo& info) {
reede5ea5002014-09-03 11:54:58 -0700220 switch (info.colorType()) {
commit-bot@chromium.org28fcae22014-04-11 17:15:40 +0000221 case kN32_SkColorType:
reede5ea5002014-09-03 11:54:58 -0700222 return kUnpremul_SkAlphaType != info.alphaType();
reed@google.com4f7c6152014-02-06 14:11:56 +0000223 case kRGB_565_SkColorType:
224 return true;
225 case kAlpha_8_SkColorType:
226 return true;
227 default:
228 break;
229 }
230 return false;
231}
232
reedaf3fbfc2015-10-04 11:28:36 -0700233SkImage_Base::SkImage_Base(int width, int height, uint32_t uniqueID)
fmalita3b0d5322015-09-18 08:07:31 -0700234 : INHERITED(width, height, uniqueID)
fmalita3b0d5322015-09-18 08:07:31 -0700235 , fAddedToCache(false)
reedaf3fbfc2015-10-04 11:28:36 -0700236{}
fmalita3b0d5322015-09-18 08:07:31 -0700237
238SkImage_Base::~SkImage_Base() {
239 if (fAddedToCache.load()) {
240 SkNotifyBitmapGenIDIsStale(this->uniqueID());
241 }
242}
243
reed96472de2014-12-10 09:53:42 -0800244bool SkImage_Base::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
reed09553032015-11-23 12:32:16 -0800245 int srcX, int srcY, CachingHint) const {
reed96472de2014-12-10 09:53:42 -0800246 if (!raster_canvas_supports(dstInfo)) {
247 return false;
reed@google.com4f7c6152014-02-06 14:11:56 +0000248 }
249
reed96472de2014-12-10 09:53:42 -0800250 SkBitmap bm;
251 bm.installPixels(dstInfo, dstPixels, dstRowBytes);
252 SkCanvas canvas(bm);
reed@google.com4f7c6152014-02-06 14:11:56 +0000253
254 SkPaint paint;
reed96472de2014-12-10 09:53:42 -0800255 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
256 canvas.drawImage(this, -SkIntToScalar(srcX), -SkIntToScalar(srcY), &paint);
reed@google.com4f7c6152014-02-06 14:11:56 +0000257
reed@google.com4f7c6152014-02-06 14:11:56 +0000258 return true;
259}
reedf803da12015-01-23 05:58:07 -0800260
reed871872f2015-06-22 12:48:26 -0700261///////////////////////////////////////////////////////////////////////////////////////////////////
262
reed09553032015-11-23 12:32:16 -0800263bool SkImage::readPixels(const SkPixmap& pmap, int srcX, int srcY, CachingHint chint) const {
264 return this->readPixels(pmap.info(), pmap.writable_addr(), pmap.rowBytes(), srcX, srcY, chint);
reed871872f2015-06-22 12:48:26 -0700265}
266
bsalomonf267c1e2016-02-01 13:16:14 -0800267#if SK_SUPPORT_GPU
268#include "GrTextureToYUVPlanes.h"
269#endif
270
271#include "SkRGBAToYUV.h"
272
273bool SkImage::readYUV8Planes(const SkISize sizes[3], void* const planes[3],
Brian Salomonde3a7262016-02-03 17:09:00 -0500274 const size_t rowBytes[3], SkYUVColorSpace colorSpace) const {
bsalomonf267c1e2016-02-01 13:16:14 -0800275#if SK_SUPPORT_GPU
276 if (GrTexture* texture = as_IB(this)->peekTexture()) {
277 if (GrTextureToYUVPlanes(texture, sizes, planes, rowBytes, colorSpace)) {
278 return true;
279 }
280 }
281#endif
282 return SkRGBAToYUV(this, sizes, planes, rowBytes, colorSpace);
283}
284
reed871872f2015-06-22 12:48:26 -0700285///////////////////////////////////////////////////////////////////////////////////////////////////
reedf803da12015-01-23 05:58:07 -0800286
reed7fb4f8b2016-03-11 04:33:52 -0800287sk_sp<SkImage> SkImage::MakeFromBitmap(const SkBitmap& bm) {
reed56179002015-07-07 06:11:19 -0700288 SkPixelRef* pr = bm.pixelRef();
halcanary96fcdcc2015-08-27 07:41:13 -0700289 if (nullptr == pr) {
290 return nullptr;
reed56179002015-07-07 06:11:19 -0700291 }
292
293#if SK_SUPPORT_GPU
294 if (GrTexture* tex = pr->getTexture()) {
295 SkAutoTUnref<GrTexture> unrefCopy;
296 if (!bm.isImmutable()) {
bsalomon5ec26ae2016-02-25 08:33:02 -0800297 tex = GrDeepCopyTexture(tex, SkBudgeted::kNo);
halcanary96fcdcc2015-08-27 07:41:13 -0700298 if (nullptr == tex) {
299 return nullptr;
reed56179002015-07-07 06:11:19 -0700300 }
301 unrefCopy.reset(tex);
302 }
303 const SkImageInfo info = bm.info();
reed7fb4f8b2016-03-11 04:33:52 -0800304 return sk_make_sp<SkImage_Gpu>(info.width(), info.height(), bm.getGenerationID(),
305 info.alphaType(), tex, SkBudgeted::kNo);
reed56179002015-07-07 06:11:19 -0700306 }
307#endif
308
reed56179002015-07-07 06:11:19 -0700309 // This will check for immutable (share or copy)
reed7fb4f8b2016-03-11 04:33:52 -0800310 return SkMakeImageFromRasterBitmap(bm);
reed56179002015-07-07 06:11:19 -0700311}
312
reed3c065112015-07-08 12:46:22 -0700313bool SkImage::asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const {
314 return as_IB(this)->onAsLegacyBitmap(bitmap, mode);
315}
316
317bool SkImage_Base::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const {
318 // As the base-class, all we can do is make a copy (regardless of mode).
319 // Subclasses that want to be more optimal should override.
320 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(),
321 this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
322 if (!bitmap->tryAllocPixels(info)) {
323 return false;
324 }
325 if (!this->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), 0, 0)) {
326 bitmap->reset();
327 return false;
328 }
329
330 if (kRO_LegacyBitmapMode == mode) {
331 bitmap->setImmutable();
332 }
333 return true;
334}
335
reed7fb4f8b2016-03-11 04:33:52 -0800336sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
337 const SkMatrix* matrix, const SkPaint* paint) {
reedd5b75632015-08-13 09:37:45 -0700338 if (!picture) {
339 return nullptr;
340 }
reed7fb4f8b2016-03-11 04:33:52 -0800341 return MakeFromGenerator(SkImageGenerator::NewFromPicture(dimensions, picture.get(),
342 matrix, paint));
reedd5b75632015-08-13 09:37:45 -0700343}
344
fmalitaddbbdda2015-08-20 08:47:26 -0700345bool SkImage::isLazyGenerated() const {
346 return as_IB(this)->onIsLazyGenerated();
347}
348
reed56179002015-07-07 06:11:19 -0700349//////////////////////////////////////////////////////////////////////////////////////
350
reed8b26b992015-05-07 15:36:17 -0700351#if !SK_SUPPORT_GPU
352
reed7fb4f8b2016-03-11 04:33:52 -0800353sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted) {
bsalomon0d996862016-03-09 18:44:43 -0800354 return nullptr;
355}
356
reed7fb4f8b2016-03-11 04:33:52 -0800357sk_sp<SkImage> SkImage::MakeFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType,
358 TextureReleaseProc, ReleaseContext) {
halcanary96fcdcc2015-08-27 07:41:13 -0700359 return nullptr;
reed8b26b992015-05-07 15:36:17 -0700360}
361
bsalomon41b952c2016-03-11 06:46:33 -0800362size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy&,
363 const DeferredTextureImageUsageParams[],
364 int paramCnt, void* buffer) const {
365 return 0;
366}
367
368sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, const void*,
369 SkBudgeted) {
370 return nullptr;
371}
372
reed7fb4f8b2016-03-11 04:33:52 -0800373sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext*, const GrBackendTextureDesc&,
374 SkAlphaType) {
halcanary96fcdcc2015-08-27 07:41:13 -0700375 return nullptr;
bsalomon6dc6f5f2015-06-18 09:12:16 -0700376}
377
reed7fb4f8b2016-03-11 04:33:52 -0800378sk_sp<SkImage> SkImage::MakeFromTextureCopy(GrContext*, const GrBackendTextureDesc&, SkAlphaType) {
halcanary96fcdcc2015-08-27 07:41:13 -0700379 return nullptr;
reed8b26b992015-05-07 15:36:17 -0700380}
381
reed7fb4f8b2016-03-11 04:33:52 -0800382sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space,
383 const GrBackendObject yuvTextureHandles[3],
384 const SkISize yuvSizes[3],
385 GrSurfaceOrigin origin) {
bsalomon8e74f802016-01-30 10:01:40 -0800386 return nullptr;
387}
388
reed7fb4f8b2016-03-11 04:33:52 -0800389sk_sp<SkImage> SkImage::makeTextureImage(GrContext*) const {
390 return nullptr;
391}
392
393#endif
394
395///////////////////////////////////////////////////////////////////////////////////////////////////
396
397#ifdef SK_SUPPORT_LEGACY_IMAGEFACTORY
398SkImage* SkImage::NewRasterCopy(const Info& info, const void* pixels, size_t rowBytes,
399 SkColorTable* ctable) {
400 return MakeRasterCopy(SkPixmap(info, pixels, rowBytes, ctable)).release();
401}
402
403SkImage* SkImage::NewRasterData(const Info& info, SkData* pixels, size_t rowBytes) {
404 return MakeRasterData(info, sk_ref_sp(pixels), rowBytes).release();
405}
406
407SkImage* SkImage::NewFromRaster(const Info& info, const void* pixels, size_t rowBytes,
408 RasterReleaseProc proc, ReleaseContext releasectx) {
409 return MakeFromRaster(SkPixmap(info, pixels, rowBytes), proc, releasectx).release();
410}
411
412SkImage* SkImage::NewFromBitmap(const SkBitmap& bm) {
413 return MakeFromBitmap(bm).release();
414}
415
416SkImage* SkImage::NewFromGenerator(SkImageGenerator* gen, const SkIRect* subset) {
417 return MakeFromGenerator(gen, subset).release();
418}
419
420SkImage* SkImage::NewFromEncoded(SkData* encoded, const SkIRect* subset) {
421 return MakeFromEncoded(sk_ref_sp(encoded), subset).release();
422}
423
424SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at,
425 TextureReleaseProc proc, ReleaseContext releasectx) {
426 return MakeFromTexture(ctx, desc, at, proc, releasectx).release();
427}
428
429SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDesc& desc,
430 SkAlphaType at) {
431 return MakeFromAdoptedTexture(ctx, desc, at).release();
432}
433
434SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc,
435 SkAlphaType at) {
436 return MakeFromTextureCopy(ctx, desc, at).release();
437}
438
439SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space,
440 const GrBackendObject yuvTextureHandles[3],
441 const SkISize yuvSizes[3],
442 GrSurfaceOrigin origin) {
443 return MakeFromYUVTexturesCopy(ctx, space, yuvTextureHandles, yuvSizes, origin).release();
444}
445
446SkImage* SkImage::NewFromPicture(const SkPicture* picture, const SkISize& dimensions,
447 const SkMatrix* matrix, const SkPaint* paint) {
448 return MakeFromPicture(sk_ref_sp(const_cast<SkPicture*>(picture)), dimensions,
449 matrix, paint).release();
450}
451
452SkImage* SkImage::NewTextureFromPixmap(GrContext* ctx, const SkPixmap& pmap, SkBudgeted budgeted) {
453 return MakeTextureFromPixmap(ctx, pmap, budgeted).release();
454}
bsalomon41b952c2016-03-11 06:46:33 -0800455
456SkImage* SkImage::NewFromDeferredTextureImageData(GrContext* ctx, const void* data,
457 SkBudgeted budgeted) {
458 return MakeFromDeferredTextureImageData(ctx, data, budgeted).release();
459}
reed8b26b992015-05-07 15:36:17 -0700460#endif