1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkKeyedImage.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage_Base.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkBitmapKey SkBitmapKeyFromImage(const SkImage* image) {
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!image) {
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return {{0, 0, 0, 0}, 0};
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) {
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIPoint o = bm->pixelRefOrigin();
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return {image->bounds().makeOffset(o.x(), o.y()), bm->getGenerationID()};
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return {image->bounds(), image->uniqueID()};
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fKey = SkBitmapKeyFromImage(fImage.get());
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(SkImage::MakeFromBitmap(bm)) {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fImage) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fKey = {bm.getSubset(), bm.getGenerationID()};
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkKeyedImage SkKeyedImage::subset(SkIRect subset) const {
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkKeyedImage img;
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fImage && subset.intersect(fImage->bounds())) {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        img.fImage = fImage->makeSubset(subset);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (img.fImage) {
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            img.fKey = {subset.makeOffset(fKey.fSubset.x(), fKey.fSubset.y()), fKey.fID};
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return img;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkImage> SkKeyedImage::release() {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkImage> image = std::move(fImage);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(nullptr == fImage);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fKey = {{0, 0, 0, 0}, 0};
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return image;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
50