bool SourceSurfaceSkia::InitFromImage(sk_sp<SkImage> aImage, SurfaceFormat aFormat, DrawTargetSkia* aOwner) { if (!aImage) { return false; } mSize = IntSize(aImage->width(), aImage->height()); // For the raster image case, we want to use the format and stride // information that the underlying raster image is using, which is // reliable. // For the GPU case (for which peekPixels is false), we can't easily // figure this information out. It is better to report the originally // intended format and stride that we will convert to if this GPU // image is ever read back into a raster image. SkPixmap pixmap; if (aImage->peekPixels(&pixmap)) { mFormat = aFormat != SurfaceFormat::UNKNOWN ? aFormat : SkiaColorTypeToGfxFormat(pixmap.colorType(), pixmap.alphaType()); mStride = pixmap.rowBytes(); } else if (aFormat != SurfaceFormat::UNKNOWN) { mFormat = aFormat; SkImageInfo info = MakeSkiaImageInfo(mSize, mFormat); mStride = SkAlign4(info.minRowBytes()); } else { return false; } mImage = aImage; if (aOwner) { mDrawTarget = aOwner; } return true; }