return gen ? sk_sp<SharedGenerator>(new SharedGenerator(std::move(gen))) : nullptr;
}
+ // This is thread safe. It is a const field set in the constructor.
+ const SkImageInfo& getInfo() { return fGenerator->getInfo(); }
+
private:
explicit SharedGenerator(std::unique_ptr<SkImageGenerator> gen)
: fGenerator(std::move(gen)) {
SkColorType targetColorType,
SkTransferFunctionBehavior premulBehavior) const {
SkBitmap dst;
- SkImageInfo dstInfo = fInfo.makeColorType(targetColorType).makeColorSpace(target);
+ const SkImageInfo& genInfo = fSharedGenerator->getInfo();
+ SkImageInfo dstInfo = genInfo.makeColorType(targetColorType).makeColorSpace(target);
dst.allocPixels(dstInfo);
if (!this->directGeneratePixels(dstInfo, dst.getPixels(), dst.rowBytes(), 0, 0,
premulBehavior)) {
}
dst.setImmutable();
- return SkImage::MakeFromBitmap(dst);
+ sk_sp<SkImage> image = SkImage::MakeFromBitmap(dst);
+
+ if (genInfo.dimensions() != fInfo.dimensions()) {
+ // This image must be a subset.
+ image = image->makeSubset(SkIRect::MakeXYWH(fOrigin.fX, fOrigin.fY,
+ fInfo.width(), fInfo.height()));
+ }
+
+ return image;
}
sk_sp<SkImage> SkImage::MakeFromGenerator(std::unique_ptr<SkImageGenerator> generator,