|  | /* | 
|  | * Copyright 2017 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "SkKeyedImage.h" | 
|  |  | 
|  | #include "SkImage_Base.h" | 
|  |  | 
|  | SkBitmapKey SkBitmapKeyFromImage(const SkImage* image) { | 
|  | if (!image) { | 
|  | return {{0, 0, 0, 0}, 0}; | 
|  | } | 
|  | if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) { | 
|  | SkIPoint o = bm->pixelRefOrigin(); | 
|  | return {image->bounds().makeOffset(o.x(), o.y()), bm->getGenerationID()}; | 
|  | } | 
|  | return {image->bounds(), image->uniqueID()}; | 
|  | } | 
|  |  | 
|  | SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) { | 
|  | fKey = SkBitmapKeyFromImage(fImage.get()); | 
|  | } | 
|  |  | 
|  | SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(SkImage::MakeFromBitmap(bm)) { | 
|  | if (fImage) { | 
|  | fKey = {bm.getSubset(), bm.getGenerationID()}; | 
|  | } | 
|  | } | 
|  |  | 
|  | SkKeyedImage SkKeyedImage::subset(SkIRect subset) const { | 
|  | SkKeyedImage img; | 
|  | if (fImage && subset.intersect(fImage->bounds())) { | 
|  | img.fImage = fImage->makeSubset(subset); | 
|  | if (img.fImage) { | 
|  | img.fKey = {subset.makeOffset(fKey.fSubset.x(), fKey.fSubset.y()), fKey.fID}; | 
|  | } | 
|  | } | 
|  | return img; | 
|  | } | 
|  |  | 
|  | sk_sp<SkImage> SkKeyedImage::release() { | 
|  | sk_sp<SkImage> image = std::move(fImage); | 
|  | SkASSERT(nullptr == fImage); | 
|  | fKey = {{0, 0, 0, 0}, 0}; | 
|  | return image; | 
|  | } |