Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkBitmapCache.h" | 9 #include "SkBitmapCache.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| 11 #include "SkData.h" | 11 #include "SkData.h" |
| 12 #include "SkImageEncoder.h" | 12 #include "SkImageEncoder.h" |
| 13 #include "SkImageGenerator.h" | 13 #include "SkImageGenerator.h" |
| 14 #include "SkImagePriv.h" | 14 #include "SkImagePriv.h" |
| 15 #include "SkImageShader.h" | 15 #include "SkImageShader.h" |
| 16 #include "SkImage_Base.h" | 16 #include "SkImage_Base.h" |
| 17 #include "SkNextID.h" | 17 #include "SkNextID.h" |
| 18 #include "SkPicture.h" | |
| 18 #include "SkPixelRef.h" | 19 #include "SkPixelRef.h" |
| 19 #include "SkPixelSerializer.h" | 20 #include "SkPixelSerializer.h" |
| 20 #include "SkReadPixelsRec.h" | 21 #include "SkReadPixelsRec.h" |
| 21 #include "SkString.h" | 22 #include "SkString.h" |
| 22 #include "SkSurface.h" | 23 #include "SkSurface.h" |
| 23 | 24 |
| 24 #if SK_SUPPORT_GPU | 25 #if SK_SUPPORT_GPU |
| 25 #include "GrTexture.h" | 26 #include "GrTexture.h" |
| 26 #include "GrContext.h" | 27 #include "GrContext.h" |
| 27 #include "SkImage_Gpu.h" | 28 #include "SkImage_Gpu.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 } | 144 } |
| 144 | 145 |
| 145 return nullptr; | 146 return nullptr; |
| 146 } | 147 } |
| 147 | 148 |
| 148 SkData* SkImage::refEncoded() const { | 149 SkData* SkImage::refEncoded() const { |
| 149 GrContext* ctx = nullptr; // should we allow the caller to pass in a ctx? | 150 GrContext* ctx = nullptr; // should we allow the caller to pass in a ctx? |
| 150 return as_IB(this)->onRefEncoded(ctx); | 151 return as_IB(this)->onRefEncoded(ctx); |
| 151 } | 152 } |
| 152 | 153 |
| 153 SkImage* SkImage::NewFromEncoded(SkData* encoded, const SkIRect* subset) { | 154 sk_sp<SkImage> SkImage::MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* su bset) { |
| 154 if (nullptr == encoded || 0 == encoded->size()) { | 155 if (nullptr == encoded || 0 == encoded->size()) { |
| 155 return nullptr; | 156 return nullptr; |
| 156 } | 157 } |
| 157 SkImageGenerator* generator = SkImageGenerator::NewFromEncoded(encoded); | 158 SkImageGenerator* generator = SkImageGenerator::NewFromEncoded(encoded.get() ); |
| 158 return generator ? SkImage::NewFromGenerator(generator, subset) : nullptr; | 159 return generator ? SkImage::MakeFromGenerator(generator, subset) : nullptr; |
|
f(malita)
2016/03/10 18:12:15
sk_sp<SkImageGenerator> generator =...
SkImage::Ma
reed1
2016/03/10 19:12:56
Generators are not reference counted.
null-check
f(malita)
2016/03/10 19:24:56
doh :)
| |
| 159 } | 160 } |
| 160 | 161 |
| 161 const char* SkImage::toString(SkString* str) const { | 162 const char* SkImage::toString(SkString* str) const { |
| 162 str->appendf("image: (id:%d (%d, %d) %s)", this->uniqueID(), this->width(), this->height(), | 163 str->appendf("image: (id:%d (%d, %d) %s)", this->uniqueID(), this->width(), this->height(), |
| 163 this->isOpaque() ? "opaque" : ""); | 164 this->isOpaque() ? "opaque" : ""); |
| 164 return str->c_str(); | 165 return str->c_str(); |
| 165 } | 166 } |
| 166 | 167 |
| 167 SkImage* SkImage::newSubset(const SkIRect& subset) const { | 168 sk_sp<SkImage> SkImage::makeSubset(const SkIRect& subset) const { |
| 168 if (subset.isEmpty()) { | 169 if (subset.isEmpty()) { |
| 169 return nullptr; | 170 return nullptr; |
| 170 } | 171 } |
| 171 | 172 |
| 172 const SkIRect bounds = SkIRect::MakeWH(this->width(), this->height()); | 173 const SkIRect bounds = SkIRect::MakeWH(this->width(), this->height()); |
| 173 if (!bounds.contains(subset)) { | 174 if (!bounds.contains(subset)) { |
| 174 return nullptr; | 175 return nullptr; |
| 175 } | 176 } |
| 176 | 177 |
| 177 // optimization : return self if the subset == our bounds | 178 // optimization : return self if the subset == our bounds |
| 178 if (bounds == subset) { | 179 if (bounds == subset) { |
| 179 return SkRef(const_cast<SkImage*>(this)); | 180 return sk_ref_sp(const_cast<SkImage*>(this)); |
| 180 } | 181 } |
| 181 return as_IB(this)->onNewSubset(subset); | 182 return as_IB(this)->onMakeSubset(subset); |
| 182 } | 183 } |
| 183 | 184 |
| 184 #if SK_SUPPORT_GPU | 185 #if SK_SUPPORT_GPU |
| 185 | 186 |
| 186 GrTexture* SkImage::getTexture() const { | 187 GrTexture* SkImage::getTexture() const { |
| 187 return as_IB(this)->peekTexture(); | 188 return as_IB(this)->peekTexture(); |
| 188 } | 189 } |
| 189 | 190 |
| 190 bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekTexture ()); } | 191 bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekTexture ()); } |
| 191 | 192 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 if (GrTextureToYUVPlanes(texture, sizes, planes, rowBytes, colorSpace)) { | 277 if (GrTextureToYUVPlanes(texture, sizes, planes, rowBytes, colorSpace)) { |
| 277 return true; | 278 return true; |
| 278 } | 279 } |
| 279 } | 280 } |
| 280 #endif | 281 #endif |
| 281 return SkRGBAToYUV(this, sizes, planes, rowBytes, colorSpace); | 282 return SkRGBAToYUV(this, sizes, planes, rowBytes, colorSpace); |
| 282 } | 283 } |
| 283 | 284 |
| 284 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 285 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 285 | 286 |
| 286 SkImage* SkImage::NewFromBitmap(const SkBitmap& bm) { | 287 sk_sp<SkImage> SkImage::MakeFromBitmap(const SkBitmap& bm) { |
| 287 SkPixelRef* pr = bm.pixelRef(); | 288 SkPixelRef* pr = bm.pixelRef(); |
| 288 if (nullptr == pr) { | 289 if (nullptr == pr) { |
| 289 return nullptr; | 290 return nullptr; |
| 290 } | 291 } |
| 291 | 292 |
| 292 #if SK_SUPPORT_GPU | 293 #if SK_SUPPORT_GPU |
| 293 if (GrTexture* tex = pr->getTexture()) { | 294 if (GrTexture* tex = pr->getTexture()) { |
| 294 SkAutoTUnref<GrTexture> unrefCopy; | 295 SkAutoTUnref<GrTexture> unrefCopy; |
| 295 if (!bm.isImmutable()) { | 296 if (!bm.isImmutable()) { |
| 296 tex = GrDeepCopyTexture(tex, SkBudgeted::kNo); | 297 tex = GrDeepCopyTexture(tex, SkBudgeted::kNo); |
| 297 if (nullptr == tex) { | 298 if (nullptr == tex) { |
| 298 return nullptr; | 299 return nullptr; |
| 299 } | 300 } |
| 300 unrefCopy.reset(tex); | 301 unrefCopy.reset(tex); |
| 301 } | 302 } |
| 302 const SkImageInfo info = bm.info(); | 303 const SkImageInfo info = bm.info(); |
| 303 return new SkImage_Gpu(info.width(), info.height(), bm.getGenerationID() , info.alphaType(), | 304 return sk_make_sp<SkImage_Gpu>(info.width(), info.height(), bm.getGenera tionID(), |
| 304 tex, SkBudgeted::kNo); | 305 info.alphaType(), tex, SkBudgeted::kNo); |
| 305 } | 306 } |
| 306 #endif | 307 #endif |
| 307 | 308 |
| 308 // This will check for immutable (share or copy) | 309 // This will check for immutable (share or copy) |
| 309 return SkNewImageFromRasterBitmap(bm); | 310 return SkMakeImageFromRasterBitmap(bm); |
| 310 } | 311 } |
| 311 | 312 |
| 312 bool SkImage::asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const { | 313 bool SkImage::asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) const { |
| 313 return as_IB(this)->onAsLegacyBitmap(bitmap, mode); | 314 return as_IB(this)->onAsLegacyBitmap(bitmap, mode); |
| 314 } | 315 } |
| 315 | 316 |
| 316 bool SkImage_Base::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) con st { | 317 bool SkImage_Base::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) con st { |
| 317 // As the base-class, all we can do is make a copy (regardless of mode). | 318 // As the base-class, all we can do is make a copy (regardless of mode). |
| 318 // Subclasses that want to be more optimal should override. | 319 // Subclasses that want to be more optimal should override. |
| 319 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), | 320 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), |
| 320 this->isOpaque() ? kOpaque_SkAlphaType : kPr emul_SkAlphaType); | 321 this->isOpaque() ? kOpaque_SkAlphaType : kPr emul_SkAlphaType); |
| 321 if (!bitmap->tryAllocPixels(info)) { | 322 if (!bitmap->tryAllocPixels(info)) { |
| 322 return false; | 323 return false; |
| 323 } | 324 } |
| 324 if (!this->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes( ), 0, 0)) { | 325 if (!this->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes( ), 0, 0)) { |
| 325 bitmap->reset(); | 326 bitmap->reset(); |
| 326 return false; | 327 return false; |
| 327 } | 328 } |
| 328 | 329 |
| 329 if (kRO_LegacyBitmapMode == mode) { | 330 if (kRO_LegacyBitmapMode == mode) { |
| 330 bitmap->setImmutable(); | 331 bitmap->setImmutable(); |
| 331 } | 332 } |
| 332 return true; | 333 return true; |
| 333 } | 334 } |
| 334 | 335 |
| 335 SkImage* SkImage::NewFromPicture(const SkPicture* picture, const SkISize& dimens ions, | 336 sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, |
| 336 const SkMatrix* matrix, const SkPaint* paint) { | 337 const SkMatrix* matrix, const SkPaint* p aint) { |
| 337 if (!picture) { | 338 if (!picture) { |
| 338 return nullptr; | 339 return nullptr; |
| 339 } | 340 } |
| 340 return NewFromGenerator(SkImageGenerator::NewFromPicture(dimensions, picture , matrix, paint)); | 341 return MakeFromGenerator(SkImageGenerator::NewFromPicture(dimensions, pictur e.release(), |
| 342 matrix, paint)); | |
| 341 } | 343 } |
| 342 | 344 |
| 343 bool SkImage::isLazyGenerated() const { | 345 bool SkImage::isLazyGenerated() const { |
| 344 return as_IB(this)->onIsLazyGenerated(); | 346 return as_IB(this)->onIsLazyGenerated(); |
| 345 } | 347 } |
| 346 | 348 |
| 347 //////////////////////////////////////////////////////////////////////////////// ////// | 349 //////////////////////////////////////////////////////////////////////////////// ////// |
| 348 | 350 |
| 349 #if !SK_SUPPORT_GPU | 351 #if !SK_SUPPORT_GPU |
| 350 | 352 |
| 351 SkImage* SkImage::NewTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted b udgeted) { | 353 sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBud geted budgeted) { |
| 352 return nullptr; | 354 return nullptr; |
| 353 } | 355 } |
| 354 | 356 |
| 355 SkImage* SkImage::NewFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlph aType, | 357 sk_sp<SkImage> SkImage::MakeFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType, |
| 356 TextureReleaseProc, ReleaseContext) { | 358 TextureReleaseProc, ReleaseContext) { |
| 357 return nullptr; | 359 return nullptr; |
| 358 } | 360 } |
| 359 | 361 |
| 360 SkImage* SkImage::NewFromAdoptedTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType) { | 362 sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext*, const GrBackendTextur eDesc&, |
| 363 SkAlphaType) { | |
| 361 return nullptr; | 364 return nullptr; |
| 362 } | 365 } |
| 363 | 366 |
| 364 SkImage* SkImage::NewFromTextureCopy(GrContext*, const GrBackendTextureDesc&, Sk AlphaType) { | 367 sk_sp<SkImage> SkImage::MakeFromTextureCopy(GrContext*, const GrBackendTextureDe sc&, SkAlphaType) { |
| 365 return nullptr; | 368 return nullptr; |
| 366 } | 369 } |
| 367 | 370 |
| 368 SkImage* SkImage::newTextureImage(GrContext*) const { | 371 sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space, |
| 372 const GrBackendObject yuvTexture Handles[3], | |
| 373 const SkISize yuvSizes[3], | |
| 374 GrSurfaceOrigin origin) { | |
| 375 return nullptr; | |
| 376 } | |
| 377 | |
| 378 sk_sp<SkImage> SkImage::makeTextureImage(GrContext*) const { | |
| 369 return nullptr; | 379 return nullptr; |
| 370 } | 380 } |
| 371 | 381 |
| 372 #endif | 382 #endif |
| 383 | |
| 384 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
| 385 | |
| 386 #ifdef SK_SUPPORT_LEGACY_IMAGEFACTORY | |
| 387 SkImage* SkImage::NewRasterCopy(const Info& info, const void* pixels, size_t row Bytes, | |
| 388 SkColorTable* ctable) { | |
| 389 return MakeRasterCopy(SkPixmap(info, pixels, rowBytes, ctable)).release(); | |
| 390 } | |
| 391 | |
| 392 SkImage* SkImage::NewRasterData(const Info& info, SkData* pixels, size_t rowByte s) { | |
| 393 return MakeRasterData(info, sk_ref_sp(pixels), rowBytes).release(); | |
| 394 } | |
| 395 | |
| 396 SkImage* SkImage::NewFromRaster(const Info& info, const void* pixels, size_t row Bytes, | |
| 397 RasterReleaseProc proc, ReleaseContext releasect x) { | |
| 398 return MakeFromRaster(SkPixmap(info, pixels, rowBytes), proc, releasectx).re lease(); | |
| 399 } | |
| 400 | |
| 401 SkImage* SkImage::NewFromBitmap(const SkBitmap& bm) { | |
| 402 return MakeFromBitmap(bm).release(); | |
| 403 } | |
| 404 | |
| 405 SkImage* SkImage::NewFromGenerator(SkImageGenerator* gen, const SkIRect* subset) { | |
| 406 return MakeFromGenerator(gen, subset).release(); | |
| 407 } | |
| 408 | |
| 409 SkImage* SkImage::NewFromEncoded(SkData* encoded, const SkIRect* subset) { | |
| 410 return MakeFromEncoded(sk_ref_sp(encoded), subset).release(); | |
| 411 } | |
| 412 | |
| 413 SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& des c, SkAlphaType at, | |
| 414 TextureReleaseProc proc, ReleaseContext release ctx) { | |
| 415 return MakeFromTexture(ctx, desc, at, proc, releasectx).release(); | |
| 416 } | |
| 417 | |
| 418 SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe sc& desc, | |
| 419 SkAlphaType at) { | |
| 420 return MakeFromAdoptedTexture(ctx, desc, at).release(); | |
| 421 } | |
| 422 | |
| 423 SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, | |
| 424 SkAlphaType at) { | |
| 425 return MakeFromTextureCopy(ctx, desc, at).release(); | |
| 426 } | |
| 427 | |
| 428 SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space, | |
| 429 const GrBackendObject yuvTextureHandles [3], | |
| 430 const SkISize yuvSizes[3], | |
| 431 GrSurfaceOrigin origin) { | |
| 432 return MakeFromYUVTexturesCopy(ctx, space, yuvTextureHandles, yuvSizes, orig in).release(); | |
| 433 } | |
| 434 | |
| 435 SkImage* SkImage::NewFromPicture(const SkPicture* picture, const SkISize& dimens ions, | |
| 436 const SkMatrix* matrix, const SkPaint* paint) { | |
| 437 return MakeFromPicture(sk_ref_sp(const_cast<SkPicture*>(picture)), dimension s, | |
| 438 matrix, paint).release(); | |
| 439 } | |
| 440 | |
| 441 SkImage* SkImage::NewTextureFromPixmap(GrContext* ctx, const SkPixmap& pmap, SkB udgeted budgeted) { | |
| 442 return MakeTextureFromPixmap(ctx, pmap, budgeted).release(); | |
| 443 } | |
| 444 #endif | |
| OLD | NEW |