blob: bcf7d70519199979426d771b8e4c969cdf5fa5c7 [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
Hal Canary4f29c202017-07-18 10:28:31 -040012SkBitmapKey SkBitmapKeyFromImage(const SkImage* image) {
13 if (!image) {
14 return {{0, 0, 0, 0}, 0};
Hal Canary7cbf5e32017-07-12 13:10:23 -040015 }
Hal Canary4f29c202017-07-18 10:28:31 -040016 if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) {
17 SkIPoint o = bm->pixelRefOrigin();
18 return {image->bounds().makeOffset(o.x(), o.y()), bm->getGenerationID()};
19 }
20 return {image->bounds(), image->uniqueID()};
21}
22
23SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
24 fKey = SkBitmapKeyFromImage(fImage.get());
Hal Canary7cbf5e32017-07-12 13:10:23 -040025}
26
27SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(SkImage::MakeFromBitmap(bm)) {
28 if (fImage) {
29 fKey = {bm.getSubset(), bm.getGenerationID()};
30 }
31}
32
33SkKeyedImage SkKeyedImage::subset(SkIRect subset) const {
34 SkKeyedImage img;
35 if (fImage && subset.intersect(fImage->bounds())) {
36 img.fImage = fImage->makeSubset(subset);
37 if (img.fImage) {
38 img.fKey = {subset.makeOffset(fKey.fSubset.x(), fKey.fSubset.y()), fKey.fID};
39 }
40 }
41 return img;
42}
43
44sk_sp<SkImage> SkKeyedImage::release() {
45 sk_sp<SkImage> image = std::move(fImage);
46 SkASSERT(nullptr == fImage);
47 fKey = {{0, 0, 0, 0}, 0};
48 return image;
49}