access pixels directly if SkImage is a raster one (tdf#140925)

This avoids copying the data to a temporary storage that's not needed.
Moreover Skia does not memcpy() the data if the format is
kAlpha_8_SkColorType.

Change-Id: I66974acd7656df8b82d1babacf7a0cb60711fc76
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112253
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index b94debc..e8266f8 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -1054,13 +1054,19 @@ void SkiaSalBitmap::EnsureBitmapData()
        assert(mAlphaImage->colorType() == kAlpha_8_SkColorType);
        SkiaZone zone;
        SkBitmap bitmap;
        if (!bitmap.tryAllocPixels(SkImageInfo::MakeA8(mSize.Width(), mSize.Height())))
            abort();
        SkCanvas canvas(bitmap);
        SkPaint paint;
        paint.setBlendMode(SkBlendMode::kSrc); // set as is, including alpha
        canvas.drawImage(mAlphaImage, 0, 0, SkSamplingOptions(), &paint);
        canvas.flush();
        SkPixmap pixmap;
        if (mAlphaImage->peekPixels(&pixmap))
            bitmap.installPixels(pixmap);
        else
        {
            if (!bitmap.tryAllocPixels(SkImageInfo::MakeA8(mSize.Width(), mSize.Height())))
                abort();
            SkCanvas canvas(bitmap);
            SkPaint paint;
            paint.setBlendMode(SkBlendMode::kSrc); // set as is, including alpha
            canvas.drawImage(mAlphaImage, 0, 0, SkSamplingOptions(), &paint);
            canvas.flush();
        }
        bitmap.setImmutable();
        CreateBitmapData();
        assert(mBuffer != nullptr);
@@ -1111,30 +1117,36 @@ void SkiaSalBitmap::EnsureBitmapData()
        alphaType = kPremul_SkAlphaType;
#endif
    SkBitmap bitmap;
    if (!bitmap.tryAllocPixels(SkImageInfo::MakeS32(mSize.Width(), mSize.Height(), alphaType)))
        abort();
    SkCanvas canvas(bitmap);
    SkPaint paint;
    paint.setBlendMode(SkBlendMode::kSrc); // set as is, including alpha
    if (mSize != mPixelsSize) // pending scaling?
    {
        assert(mImage->width() == mPixelsSize.getWidth()
               && mImage->height() == mPixelsSize.getHeight());
        canvas.drawImageRect(mImage, SkRect::MakeWH(mSize.getWidth(), mSize.getHeight()),
                             makeSamplingOptions(mScaleQuality), &paint);
        SAL_INFO("vcl.skia.trace", "ensurebitmapdata(" << this << "): image scaled " << mPixelsSize
                                                       << "->" << mSize << ":"
                                                       << static_cast<int>(mScaleQuality));
        mPixelsSize = mSize;
        ComputeScanlineSize();
        mScaleQuality = BmpScaleFlag::BestQuality;
        // Information about the pending scaling has been discarded, so make sure we do not
        // keep around any cached images that would still need scaling.
        ResetCachedDataBySize();
    }
    SkPixmap pixmap;
    if (mSize == mPixelsSize && mImage->peekPixels(&pixmap))
        bitmap.installPixels(pixmap);
    else
        canvas.drawImage(mImage, 0, 0, SkSamplingOptions(), &paint);
    canvas.flush();
    {
        if (!bitmap.tryAllocPixels(SkImageInfo::MakeS32(mSize.Width(), mSize.Height(), alphaType)))
            abort();
        SkCanvas canvas(bitmap);
        SkPaint paint;
        paint.setBlendMode(SkBlendMode::kSrc); // set as is, including alpha
        if (mSize != mPixelsSize) // pending scaling?
        {
            assert(mImage->width() == mPixelsSize.getWidth()
                   && mImage->height() == mPixelsSize.getHeight());
            canvas.drawImageRect(mImage, SkRect::MakeWH(mSize.getWidth(), mSize.getHeight()),
                                 makeSamplingOptions(mScaleQuality), &paint);
            SAL_INFO("vcl.skia.trace", "ensurebitmapdata(" << this << "): image scaled "
                                                           << mPixelsSize << "->" << mSize << ":"
                                                           << static_cast<int>(mScaleQuality));
            mPixelsSize = mSize;
            ComputeScanlineSize();
            mScaleQuality = BmpScaleFlag::BestQuality;
            // Information about the pending scaling has been discarded, so make sure we do not
            // keep around any cached images that would still need scaling.
            ResetCachedDataBySize();
        }
        else
            canvas.drawImage(mImage, 0, 0, SkSamplingOptions(), &paint);
        canvas.flush();
    }
    bitmap.setImmutable();
    CreateBitmapData();
    assert(mBuffer != nullptr);