Home | History | Annotate | Download | only in core
      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 
     12 SkImageGenerator::SkImageGenerator(const SkImageInfo& info, uint32_t uniqueID)
     13     : fInfo(info)
     14     , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID)
     15 {}
     16 
     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 
     36 bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
     37     return this->getPixels(info, pixels, rowBytes, nullptr);
     38 }
     39 
     40 bool SkImageGenerator::queryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const {
     41     SkASSERT(sizeInfo);
     42 
     43     return this->onQueryYUV8(sizeInfo, colorSpace);
     44 }
     45 
     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 
     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 
     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
     96 SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)
     97 {
     98     ImageGeneratorFromEncodedDataFactory prev = gFactory;
     99     gFactory = factory;
    100     return prev;
    101 }
    102 
    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