1/*
2 * Copyright 2014 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 "include/core/SkImageGenerator.h"
9
10#include "include/core/SkImage.h"
11#include "src/core/SkNextID.h"
12
13SkImageGenerator::SkImageGenerator(const SkImageInfo& info, uint32_t uniqueID)
14    : fInfo(info)
15    , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID)
16{}
17
18bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
19    if (kUnknown_SkColorType == info.colorType()) {
20        return false;
21    }
22    if (nullptr == pixels) {
23        return false;
24    }
25    if (rowBytes < info.minRowBytes()) {
26        return false;
27    }
28
29    Options defaultOpts;
30    return this->onGetPixels(info, pixels, rowBytes, defaultOpts);
31}
32
33bool SkImageGenerator::queryYUVAInfo(const SkYUVAPixmapInfo::SupportedDataTypes& supportedDataTypes,
34                                     SkYUVAPixmapInfo* yuvaPixmapInfo) const {
35    SkASSERT(yuvaPixmapInfo);
36
37    return this->onQueryYUVAInfo(supportedDataTypes, yuvaPixmapInfo) &&
38           yuvaPixmapInfo->isSupported(supportedDataTypes);
39}
40
41bool SkImageGenerator::getYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps) {
42    return this->onGetYUVAPlanes(yuvaPixmaps);
43}
44
45#if SK_SUPPORT_GPU
46#include "src/gpu/GrSurfaceProxyView.h"
47
48GrSurfaceProxyView SkImageGenerator::generateTexture(GrRecordingContext* ctx,
49                                                     const SkImageInfo& info,
50                                                     const SkIPoint& origin,
51                                                     GrMipmapped mipMapped,
52                                                     GrImageTexGenPolicy texGenPolicy) {
53    SkIRect srcRect = SkIRect::MakeXYWH(origin.x(), origin.y(), info.width(), info.height());
54    if (!SkIRect::MakeWH(fInfo.width(), fInfo.height()).contains(srcRect)) {
55        return {};
56    }
57    return this->onGenerateTexture(ctx, info, origin, mipMapped, texGenPolicy);
58}
59
60GrSurfaceProxyView SkImageGenerator::onGenerateTexture(GrRecordingContext*,
61                                                       const SkImageInfo&,
62                                                       const SkIPoint&,
63                                                       GrMipmapped,
64                                                       GrImageTexGenPolicy) {
65    return {};
66}
67#endif
68
69///////////////////////////////////////////////////////////////////////////////////////////////////
70
71#include "include/core/SkBitmap.h"
72#include "src/codec/SkColorTable.h"
73
74#include "include/core/SkGraphics.h"
75
76static SkGraphics::ImageGeneratorFromEncodedDataFactory gFactory;
77
78SkGraphics::ImageGeneratorFromEncodedDataFactory
79SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)
80{
81    ImageGeneratorFromEncodedDataFactory prev = gFactory;
82    gFactory = factory;
83    return prev;
84}
85
86std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncoded(sk_sp<SkData> data) {
87    if (!data) {
88        return nullptr;
89    }
90    if (gFactory) {
91        if (std::unique_ptr<SkImageGenerator> generator = gFactory(data)) {
92            return generator;
93        }
94    }
95    return SkImageGenerator::MakeFromEncodedImpl(std::move(data));
96}
97