1 /*
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 "src/pdf/SkKeyedImage.h"
9
10 #include "include/core/SkBitmap.h"
11 #include "include/core/SkPoint.h"
12 #include "include/core/SkRect.h"
13 #include "include/private/base/SkAssert.h"
14 #include "src/image/SkImage_Base.h"
15
16 #include <utility>
17
SkBitmapKeyFromImage(const SkImage * image)18 SkBitmapKey SkBitmapKeyFromImage(const SkImage* image) {
19 if (!image) {
20 return {{0, 0, 0, 0}, 0};
21 }
22 if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) {
23 SkIPoint o = bm->pixelRefOrigin();
24 return {image->bounds().makeOffset(o), bm->getGenerationID()};
25 }
26 return {image->bounds(), image->uniqueID()};
27 }
28
SkKeyedImage(sk_sp<SkImage> i)29 SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
30 fKey = SkBitmapKeyFromImage(fImage.get());
31 }
32
SkKeyedImage(const SkBitmap & bm)33 SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(bm.asImage()) {
34 if (fImage) {
35 fKey = {bm.getSubset(), bm.getGenerationID()};
36 }
37 }
38
subset(SkIRect subset) const39 SkKeyedImage SkKeyedImage::subset(SkIRect subset) const {
40 SkKeyedImage img;
41 if (fImage && subset.intersect(fImage->bounds())) {
42 img.fImage = fImage->makeSubset(nullptr, subset);
43 if (img.fImage) {
44 img.fKey = {subset.makeOffset(fKey.fSubset.topLeft()), fKey.fID};
45 }
46 }
47 return img;
48 }
49
release()50 sk_sp<SkImage> SkKeyedImage::release() {
51 sk_sp<SkImage> image = std::move(fImage);
52 SkASSERT(nullptr == fImage);
53 fKey = {{0, 0, 0, 0}, 0};
54 return image;
55 }
56