35 int srcW = srcRect.
width();
36 int srcH = srcRect.
height();
38 float sx = (float)resultInfo.
width() / srcW;
39 float sy = (float)resultInfo.
height() / srcH;
43 if (rescaleMode != SkImage::RescaleMode::kNearest) {
44 stepsX =
static_cast<int>((sx > 1.f) ? std::ceil(std::log2f(sx))
45 : std::floor(std::log2f(sx)));
46 stepsY =
static_cast<int>((sy > 1.f) ? std::ceil(std::log2f(sy))
47 : std::floor(std::log2f(sy)));
55 if (stepsX < 0 || stepsY < 0) {
60 if (rescaleMode != SkImage::RescaleMode::kNearest) {
61 rescaleMode = SkImage::RescaleMode::kRepeatedLinear;
67 if (rescaleMode == SkImage::RescaleMode::kRepeatedLinear) {
69 }
else if (rescaleMode == SkImage::RescaleMode::kRepeatedCubic) {
78 int srcX = srcRect.
fLeft;
79 int srcY = srcRect.
fTop;
83 if (rescaleGamma == SkSurface::RescaleGamma::kLinear && bmp.
info().
colorSpace() &&
94 linearSurf->getCanvas()->drawImage(bmp.
asImage().
get(), -srcX, -srcY, sampling, &
paint);
95 tempSurf = std::move(linearSurf);
96 srcImage = tempSurf->makeImageSnapshot();
104 while (stepsX || stepsY) {
105 int nextW = resultInfo.
width();
106 int nextH = resultInfo.
height();
108 nextW = resultInfo.
width() << (-stepsX - 1);
110 }
else if (stepsX != 0) {
117 nextH = resultInfo.
height() << (-stepsY - 1);
119 }
else if (stepsY != 0) {
125 auto ii = srcImage->imageInfo().makeWH(nextW, nextH);
126 if (!stepsX && !stepsY) {
135 next->getCanvas()->drawImageRect(
138 tempSurf = std::move(
next);
139 srcImage = tempSurf->makeImageSnapshot();
147 std::unique_ptr<char[]> data(
new char[resultInfo.
height() * rowBytes]);
148 SkPixmap pm(resultInfo, data.get(), rowBytes);
149 if (srcImage->readPixels(
nullptr, pm, srcX, srcY)) {
152 Result(std::unique_ptr<
const char[]> data,
size_t rowBytes)
153 : fData(std::move(data)), fRowBytes(rowBytes) {}
154 int count()
const override {
return 1; }
155 const void*
data(
int i)
const override {
return fData.get(); }
156 size_t rowBytes(
int i)
const override {
return fRowBytes; }
159 std::unique_ptr<const char[]> fData;
162 callback(context, std::make_unique<Result>(std::move(data), rowBytes));
void SkRescaleAndReadPixels(SkBitmap bmp, const SkImageInfo &resultInfo, const SkIRect &srcRect, SkImage::RescaleGamma rescaleGamma, SkImage::RescaleMode rescaleMode, SkImage::ReadPixelsCallback callback, SkImage::ReadPixelsContext context)