summaryrefslogtreecommitdiff
path: root/vcl/skia/salbmp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/skia/salbmp.cxx')
-rw-r--r--vcl/skia/salbmp.cxx85
1 files changed, 55 insertions, 30 deletions
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index dda47b46fa25..ed66eddbc3c5 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -37,6 +37,7 @@
#include <SkSwizzle.h>
#include <SkColorFilter.h>
#include <SkColorMatrix.h>
+#include <skia_opts.hxx>
#include <skia/utils.hxx>
#include <skia/zone.hxx>
@@ -450,7 +451,7 @@ SkBitmap SkiaSalBitmap::GetAsSkBitmap() const
#endif
if (!bitmap.installPixels(
SkImageInfo::MakeS32(mPixelsSize.Width(), mPixelsSize.Height(), alphaType),
- data.release(), mPixelsSize.Width() * 4,
+ data.release(), mScanlineSize,
[](void* addr, void*) { delete[] static_cast<sal_uInt8*>(addr); }, nullptr))
abort();
bitmap.setImmutable();
@@ -461,13 +462,18 @@ SkBitmap SkiaSalBitmap::GetAsSkBitmap() const
std::unique_ptr<uint32_t[]> data(
new uint32_t[mPixelsSize.Height() * mPixelsSize.Width()]);
uint32_t* dest = data.get();
- for (long y = 0; y < mPixelsSize.Height(); ++y)
+ // SkConvertRGBToRGBA() also works as BGR to BGRA (the function extends 3 bytes to 4
+ // by adding 0xFF alpha, so position of B and R doesn't matter).
+ if (mPixelsSize.Width() * 3 == mScanlineSize)
+ SkConvertRGBToRGBA(dest, mBuffer.get(), mPixelsSize.Height() * mPixelsSize.Width());
+ else
{
- const sal_uInt8* src = mBuffer.get() + mScanlineSize * y;
- // This also works as BGR to BGRA (the function extends 3 bytes to 4
- // by adding 0xFF alpha, so position of B and R doesn't matter).
- SkExtendRGBToRGBA(dest, src, mPixelsSize.Width());
- dest += mPixelsSize.Width();
+ for (long y = 0; y < mPixelsSize.Height(); ++y)
+ {
+ const sal_uInt8* src = mBuffer.get() + mScanlineSize * y;
+ SkConvertRGBToRGBA(dest, src, mPixelsSize.Width());
+ dest += mPixelsSize.Width();
+ }
}
if (!bitmap.installPixels(
SkImageInfo::MakeS32(mPixelsSize.Width(), mPixelsSize.Height(),
@@ -486,11 +492,17 @@ SkBitmap SkiaSalBitmap::GetAsSkBitmap() const
std::unique_ptr<uint32_t[]> data(
new uint32_t[mPixelsSize.Height() * mPixelsSize.Width()]);
uint32_t* dest = data.get();
- for (long y = 0; y < mPixelsSize.Height(); ++y)
+ if (mPixelsSize.Width() * 1 == mScanlineSize)
+ SkConvertGrayToRGBA(dest, mBuffer.get(),
+ mPixelsSize.Height() * mPixelsSize.Width());
+ else
{
- const sal_uInt8* src = mBuffer.get() + mScanlineSize * y;
- SkExtendGrayToRGBA(dest, src, mPixelsSize.Width());
- dest += mPixelsSize.Width();
+ for (long y = 0; y < mPixelsSize.Height(); ++y)
+ {
+ const sal_uInt8* src = mBuffer.get() + mScanlineSize * y;
+ SkConvertGrayToRGBA(dest, src, mPixelsSize.Width());
+ dest += mPixelsSize.Width();
+ }
}
if (!bitmap.installPixels(
SkImageInfo::MakeS32(mPixelsSize.Width(), mPixelsSize.Height(),
@@ -826,37 +838,50 @@ void SkiaSalBitmap::EnsureBitmapData()
assert(mBuffer != nullptr);
if (mBitCount == 32)
{
- for (long y = 0; y < mSize.Height(); ++y)
+ if (int(bitmap.rowBytes()) == mScanlineSize)
+ memcpy(mBuffer.get(), bitmap.getPixels(), mSize.Height() * mScanlineSize);
+ else
{
- const uint8_t* src = static_cast<uint8_t*>(bitmap.getAddr(0, y));
- sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
- memcpy(dest, src, mScanlineSize);
+ for (long y = 0; y < mSize.Height(); ++y)
+ {
+ const uint8_t* src = static_cast<uint8_t*>(bitmap.getAddr(0, y));
+ sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
+ memcpy(dest, src, mScanlineSize);
+ }
}
}
else if (mBitCount == 24) // non-paletted
{
- for (long y = 0; y < mSize.Height(); ++y)
+ if (int(bitmap.rowBytes()) == mSize.Width() * 4 && mSize.Width() * 3 == mScanlineSize)
{
- const uint8_t* src = static_cast<uint8_t*>(bitmap.getAddr(0, y));
- sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
- for (long x = 0; x < mSize.Width(); ++x)
+ SkConvertRGBAToRGB(mBuffer.get(), bitmap.getAddr32(0, 0),
+ mSize.Height() * mSize.Width());
+ }
+ else
+ {
+ for (long y = 0; y < mSize.Height(); ++y)
{
- *dest++ = *src++;
- *dest++ = *src++;
- *dest++ = *src++;
- ++src; // skip alpha
+ const uint32_t* src = bitmap.getAddr32(0, y);
+ sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
+ SkConvertRGBAToRGB(dest, src, mSize.Width());
}
}
}
else if (mBitCount == 8 && mPalette.IsGreyPalette8Bit())
- {
- for (long y = 0; y < mSize.Height(); ++y)
+ { // no actual data conversion, use one color channel as the gray value
+ if (int(bitmap.rowBytes()) == mSize.Width() * 4 && mSize.Width() * 1 == mScanlineSize)
{
- const uint8_t* src = static_cast<uint8_t*>(bitmap.getAddr(0, y));
- sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
- // no actual data conversion, use one color channel as the gray value
- for (long x = 0; x < mSize.Width(); ++x)
- dest[x] = src[x * 4];
+ SkConvertRGBAToGrayFast(mBuffer.get(), bitmap.getAddr32(0, 0),
+ mSize.Height() * mSize.Width());
+ }
+ else
+ {
+ for (long y = 0; y < mSize.Height(); ++y)
+ {
+ const uint32_t* src = bitmap.getAddr32(0, y);
+ sal_uInt8* dest = mBuffer.get() + mScanlineSize * y;
+ SkConvertRGBAToGrayFast(dest, src, mSize.Width());
+ }
}
}
else