SkImage* SkImage::NewFromBitmap(const SkBitmap& bm) { SkPixelRef* pr = bm.pixelRef(); if (nullptr == pr) { return nullptr; } #if SK_SUPPORT_GPU if (GrTexture* tex = pr->getTexture()) { SkAutoTUnref<GrTexture> unrefCopy; if (!bm.isImmutable()) { const bool notBudgeted = false; tex = GrDeepCopyTexture(tex, notBudgeted); if (nullptr == tex) { return nullptr; } unrefCopy.reset(tex); } const SkImageInfo info = bm.info(); return new SkImage_Gpu(info.width(), info.height(), bm.getGenerationID(), info.alphaType(), tex, 0, SkSurface::kNo_Budgeted); } #endif // This will check for immutable (share or copy) return SkNewImageFromRasterBitmap(bm, nullptr); }
sk_sp<SkImage> SkImage::MakeFromBitmap(const SkBitmap& bm) { SkPixelRef* pr = bm.pixelRef(); if (nullptr == pr) { return nullptr; } #if SK_SUPPORT_GPU if (GrTexture* tex = pr->getTexture()) { SkAutoTUnref<GrTexture> unrefCopy; if (!bm.isImmutable()) { tex = GrDeepCopyTexture(tex, SkBudgeted::kNo); if (nullptr == tex) { return nullptr; } unrefCopy.reset(tex); } const SkImageInfo info = bm.info(); return sk_make_sp<SkImage_Gpu>(info.width(), info.height(), bm.getGenerationID(), info.alphaType(), tex, sk_ref_sp(info.colorSpace()), SkBudgeted::kNo); } #endif // This will check for immutable (share or copy) return SkMakeImageFromRasterBitmap(bm); }
sk_sp<SkImage> SkImage::MakeFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at) { if (desc.fWidth <= 0 || desc.fHeight <= 0) { return nullptr; } SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( desc, kBorrow_GrWrapOwnership)); if (!src) { return nullptr; } SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, SkBudgeted::kYes)); if (!dst) { return nullptr; } return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, dst, SkBudgeted::kYes); }
SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at) { if (desc.fWidth <= 0 || desc.fHeight <= 0) { return nullptr; } SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( desc, kBorrow_GrWrapOwnership)); if (!src) { return nullptr; } const bool isBudgeted = true; SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); if (!dst) { return nullptr; } const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, dst, budgeted); }
SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at) { if (desc.fWidth <= 0 || desc.fHeight <= 0) { return NULL; } SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( desc, kBorrow_GrWrapOwnership)); if (!src) { return NULL; } const bool isBudgeted = true; SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); if (!dst) { return NULL; } const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; const int sampleCount = 0; // todo: make this an explicit parameter to newSurface()? return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, dst, sampleCount, budgeted)); }