bool SkAndroidCodec::getSupportedSubset(SkIRect* desiredSubset) const { if (!desiredSubset || !is_valid_subset(*desiredSubset, fInfo.dimensions())) { return false; } return this->onGetSupportedSubset(desiredSubset); }
SkCodec::Result SkAndroidCodec::getAndroidPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const AndroidOptions* options) { if (!pixels) { return SkCodec::kInvalidParameters; } if (rowBytes < info.minRowBytes()) { return SkCodec::kInvalidParameters; } AndroidOptions defaultOptions; if (!options) { options = &defaultOptions; } else if (options->fSubset) { if (!is_valid_subset(*options->fSubset, fInfo.dimensions())) { return SkCodec::kInvalidParameters; } if (SkIRect::MakeSize(fInfo.dimensions()) == *options->fSubset) { // The caller wants the whole thing, rather than a subset. Modify // the AndroidOptions passed to onGetAndroidPixels to not specify // a subset. defaultOptions = *options; defaultOptions.fSubset = nullptr; options = &defaultOptions; } } return this->onGetAndroidPixels(info, pixels, rowBytes, *options); }
SkCodec::Result SkAndroidCodec::getAndroidPixels(const SkImageInfo& requestInfo, void* requestPixels, size_t requestRowBytes, const AndroidOptions* options) { if (!requestPixels) { return SkCodec::kInvalidParameters; } if (requestRowBytes < requestInfo.minRowBytes()) { return SkCodec::kInvalidParameters; } SkImageInfo adjustedInfo = fInfo; if (ExifOrientationBehavior::kRespect == fOrientationBehavior && SkPixmapPriv::ShouldSwapWidthHeight(fCodec->getOrigin())) { adjustedInfo = SkPixmapPriv::SwapWidthHeight(adjustedInfo); } AndroidOptions defaultOptions; if (!options) { options = &defaultOptions; } else if (options->fSubset) { if (!is_valid_subset(*options->fSubset, adjustedInfo.dimensions())) { return SkCodec::kInvalidParameters; } if (SkIRect::MakeSize(adjustedInfo.dimensions()) == *options->fSubset) { // The caller wants the whole thing, rather than a subset. Modify // the AndroidOptions passed to onGetAndroidPixels to not specify // a subset. defaultOptions = *options; defaultOptions.fSubset = nullptr; options = &defaultOptions; } } if (ExifOrientationBehavior::kIgnore == fOrientationBehavior) { return this->onGetAndroidPixels(requestInfo, requestPixels, requestRowBytes, *options); } SkCodec::Result result; auto decode = [this, options, &result](const SkPixmap& pm) { result = this->onGetAndroidPixels(pm.info(), pm.writable_addr(), pm.rowBytes(), *options); return acceptable_result(result); }; SkPixmap dst(requestInfo, requestPixels, requestRowBytes); if (SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode)) { return result; } // Orient returned false. If onGetAndroidPixels succeeded, then Orient failed internally. if (acceptable_result(result)) { return SkCodec::kInternalError; } return result; }