| Index: src/codec/SkPngCodec.cpp
 | 
| diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
 | 
| index 34e6f91131c3c696ed95d72ce292016e46c6e0ee..36ec21f0b8b2093f233134c5ad5f84bde3c221e1 100644
 | 
| --- a/src/codec/SkPngCodec.cpp
 | 
| +++ b/src/codec/SkPngCodec.cpp
 | 
| @@ -357,25 +357,6 @@ static int bytes_per_pixel(int bitsPerPixel) {
 | 
|      return bitsPerPixel / 8;
 | 
|  }
 | 
|  
 | 
| -static bool png_conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) {
 | 
| -    // Ensure the alpha type is valid
 | 
| -    if (!valid_alpha(dst.alphaType(), src.alphaType())) {
 | 
| -        return false;
 | 
| -    }
 | 
| -
 | 
| -    // Check for supported color types
 | 
| -    switch (dst.colorType()) {
 | 
| -        case kRGBA_8888_SkColorType:
 | 
| -        case kBGRA_8888_SkColorType:
 | 
| -        case kRGBA_F16_SkColorType:
 | 
| -            return true;
 | 
| -        case kRGB_565_SkColorType:
 | 
| -            return kOpaque_SkAlphaType == src.alphaType();
 | 
| -        default:
 | 
| -            return dst.colorType() == src.colorType();
 | 
| -    }
 | 
| -}
 | 
| -
 | 
|  void SkPngCodec::allocateStorage(const SkImageInfo& dstInfo) {
 | 
|      switch (fXformMode) {
 | 
|          case kSwizzleOnly_XformMode:
 | 
| @@ -422,7 +403,7 @@ public:
 | 
|  
 | 
|      Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
 | 
|              SkPMColor ctable[], int* ctableCount) override {
 | 
| -        if (!png_conversion_possible(dstInfo, this->getInfo()) ||
 | 
| +        if (!conversion_possible(dstInfo, this->getInfo()) ||
 | 
|              !this->initializeXforms(dstInfo, options, ctable, ctableCount))
 | 
|          {
 | 
|              return kInvalidConversion;
 | 
| @@ -489,7 +470,7 @@ public:
 | 
|  
 | 
|      Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
 | 
|              SkPMColor ctable[], int* ctableCount) override {
 | 
| -        if (!png_conversion_possible(dstInfo, this->getInfo()) ||
 | 
| +        if (!conversion_possible(dstInfo, this->getInfo()) ||
 | 
|              !this->initializeXforms(dstInfo, options, ctable, ctableCount))
 | 
|          {
 | 
|              return kInvalidConversion;
 | 
| @@ -807,20 +788,10 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt
 | 
|      fSwizzler.reset(nullptr);
 | 
|      fColorXform = nullptr;
 | 
|  
 | 
| -    bool needsColorXform = needs_color_xform(dstInfo, this->getInfo());
 | 
| -    if (needsColorXform) {
 | 
| -        if (kGray_8_SkColorType == dstInfo.colorType() ||
 | 
| -            kRGB_565_SkColorType == dstInfo.colorType())
 | 
| -        {
 | 
| -            return false;
 | 
| -        }
 | 
| -
 | 
| +    if (needs_color_xform(dstInfo, this->getInfo())) {
 | 
|          fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace()),
 | 
|                                               sk_ref_sp(dstInfo.colorSpace()));
 | 
| -
 | 
| -        if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) {
 | 
| -            return false;
 | 
| -        }
 | 
| +        SkASSERT(fColorXform);
 | 
|      }
 | 
|  
 | 
|      // If the image is RGBA and we have a color xform, we can skip the swizzler.
 | 
| @@ -907,7 +878,7 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
 | 
|                                          size_t rowBytes, const Options& options,
 | 
|                                          SkPMColor ctable[], int* ctableCount,
 | 
|                                          int* rowsDecoded) {
 | 
| -    if (!png_conversion_possible(dstInfo, this->getInfo()) ||
 | 
| +    if (!conversion_possible(dstInfo, this->getInfo()) ||
 | 
|          !this->initializeXforms(dstInfo, options, ctable, ctableCount))
 | 
|      {
 | 
|          return kInvalidConversion;
 | 
| 
 |