xref: /third_party/skia/src/pdf/SkKeyedImage.cpp (revision cb93a386)
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 "src/image/SkImage_Base.h"
11
12SkBitmapKey SkBitmapKeyFromImage(const SkImage* image) {
13    if (!image) {
14        return {{0, 0, 0, 0}, 0};
15    }
16    if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) {
17        SkIPoint o = bm->pixelRefOrigin();
18        return {image->bounds().makeOffset(o), 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());
25}
26
27SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(bm.asImage()) {
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.topLeft()), 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}
50