blob: bf196323afbaa2f9d865a6b2999f50a63a1c5f96 [file] [log] [blame]
Hal Canary7cbf5e32017-07-12 13:10:23 -04001/*
2 * Copyright 2017 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
8#include "SkKeyedImage.h"
9
10#include "SkImage_Base.h"
11
12SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
13 if (fImage) {
14 if (const SkBitmap* bm = as_IB(fImage.get())->onPeekBitmap()) {
15 SkIPoint o = bm->pixelRefOrigin();
16 fKey = {fImage->bounds().makeOffset(o.fX, o.fY), bm->getGenerationID()};
17 } else {
18 fKey = {fImage->bounds(), fImage->uniqueID()};
19 }
20 }
21}
22
23SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(SkImage::MakeFromBitmap(bm)) {
24 if (fImage) {
25 fKey = {bm.getSubset(), bm.getGenerationID()};
26 }
27}
28
29SkKeyedImage SkKeyedImage::subset(SkIRect subset) const {
30 SkKeyedImage img;
31 if (fImage && subset.intersect(fImage->bounds())) {
32 img.fImage = fImage->makeSubset(subset);
33 if (img.fImage) {
34 img.fKey = {subset.makeOffset(fKey.fSubset.x(), fKey.fSubset.y()), fKey.fID};
35 }
36 }
37 return img;
38}
39
40sk_sp<SkImage> SkKeyedImage::release() {
41 sk_sp<SkImage> image = std::move(fImage);
42 SkASSERT(nullptr == fImage);
43 fKey = {{0, 0, 0, 0}, 0};
44 return image;
45}