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 "SkImage.h"
9 #include "SkImageGenerator.h"
10 #include "SkNextID.h"
11 
SkImageGenerator(const SkImageInfo & info,uint32_t uniqueID)12 SkImageGenerator::SkImageGenerator(const SkImageInfo& info, uint32_t uniqueID)
13     : fInfo(info)
14     , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID)
15 {}
16 
getPixels(const SkImageInfo & info,void * pixels,size_t rowBytes,const Options * opts)17 bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
18                                  const Options* opts) {
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     if (!opts) {
31         opts = &defaultOpts;
32     }
33     return this->onGetPixels(info, pixels, rowBytes, *opts);
34 }
35 
getPixels(const SkImageInfo & info,void * pixels,size_t rowBytes)36 bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
37     return this->getPixels(info, pixels, rowBytes, nullptr);
38 }
39 
queryYUV8(SkYUVSizeInfo * sizeInfo,SkYUVColorSpace * colorSpace) const40 bool SkImageGenerator::queryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const {
41     SkASSERT(sizeInfo);
42 
43     return this->onQueryYUV8(sizeInfo, colorSpace);
44 }
45 
getYUV8Planes(const SkYUVSizeInfo & sizeInfo,void * planes[3])46 bool SkImageGenerator::getYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
47     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kY].fWidth >= 0);
48     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kY].fHeight >= 0);
49     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kU].fWidth >= 0);
50     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kU].fHeight >= 0);
51     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kV].fWidth >= 0);
52     SkASSERT(sizeInfo.fSizes[SkYUVSizeInfo::kV].fHeight >= 0);
53     SkASSERT(sizeInfo.fWidthBytes[SkYUVSizeInfo::kY] >=
54             (size_t) sizeInfo.fSizes[SkYUVSizeInfo::kY].fWidth);
55     SkASSERT(sizeInfo.fWidthBytes[SkYUVSizeInfo::kU] >=
56             (size_t) sizeInfo.fSizes[SkYUVSizeInfo::kU].fWidth);
57     SkASSERT(sizeInfo.fWidthBytes[SkYUVSizeInfo::kV] >=
58             (size_t) sizeInfo.fSizes[SkYUVSizeInfo::kV].fWidth);
59     SkASSERT(planes && planes[0] && planes[1] && planes[2]);
60 
61     return this->onGetYUV8Planes(sizeInfo, planes);
62 }
63 
64 #if SK_SUPPORT_GPU
65 #include "GrTextureProxy.h"
66 
generateTexture(GrContext * ctx,const SkImageInfo & info,const SkIPoint & origin,SkTransferFunctionBehavior behavior,bool willNeedMipMaps)67 sk_sp<GrTextureProxy> SkImageGenerator::generateTexture(GrContext* ctx, const SkImageInfo& info,
68                                                         const SkIPoint& origin,
69                                                         SkTransferFunctionBehavior behavior,
70                                                         bool willNeedMipMaps) {
71     SkIRect srcRect = SkIRect::MakeXYWH(origin.x(), origin.y(), info.width(), info.height());
72     if (!SkIRect::MakeWH(fInfo.width(), fInfo.height()).contains(srcRect)) {
73         return nullptr;
74     }
75     return this->onGenerateTexture(ctx, info, origin, behavior, willNeedMipMaps);
76 }
77 
onGenerateTexture(GrContext *,const SkImageInfo &,const SkIPoint &,SkTransferFunctionBehavior,bool willNeedMipMaps)78 sk_sp<GrTextureProxy> SkImageGenerator::onGenerateTexture(GrContext*, const SkImageInfo&,
79                                                           const SkIPoint&,
80                                                           SkTransferFunctionBehavior,
81                                                           bool willNeedMipMaps) {
82     return nullptr;
83 }
84 #endif
85 
86 ///////////////////////////////////////////////////////////////////////////////////////////////////
87 
88 #include "SkBitmap.h"
89 #include "SkColorTable.h"
90 
91 #include "SkGraphics.h"
92 
93 static SkGraphics::ImageGeneratorFromEncodedDataFactory gFactory;
94 
95 SkGraphics::ImageGeneratorFromEncodedDataFactory
SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)96 SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)
97 {
98     ImageGeneratorFromEncodedDataFactory prev = gFactory;
99     gFactory = factory;
100     return prev;
101 }
102 
MakeFromEncoded(sk_sp<SkData> data)103 std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncoded(sk_sp<SkData> data) {
104     if (!data) {
105         return nullptr;
106     }
107     if (gFactory) {
108         if (std::unique_ptr<SkImageGenerator> generator = gFactory(data)) {
109             return generator;
110         }
111     }
112     return SkImageGenerator::MakeFromEncodedImpl(std::move(data));
113 }
114