Index: core/fxge/skia/fx_skia_device.cpp |
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp |
index 6646eedd0fb7328cc4b2f6bd5c2eca366b2dc3ab..9f8f6c902158e545554c47d07f3ce58f33b829ae 100644 |
--- a/core/fxge/skia/fx_skia_device.cpp |
+++ b/core/fxge/skia/fx_skia_device.cpp |
@@ -994,7 +994,10 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
int alpha_flag, |
void* pIccTransform, |
int blend_type) { |
- SkColorType colorType; |
+ SkColorType colorType = pSource->IsAlphaMask() |
+ ? SkColorType::kAlpha_8_SkColorType |
+ : SkColorType::kGray_8_SkColorType; |
+ SkColorTable* ct = nullptr; |
void* buffer = pSource->GetBuffer(); |
std::unique_ptr<uint8_t, FxFreeDeleter> dst8Storage; |
std::unique_ptr<uint32_t, FxFreeDeleter> dst32Storage; |
@@ -1014,11 +1017,12 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
} |
buffer = dst8Storage.get(); |
rowBytes = width; |
- colorType = pSource->IsAlphaMask() ? SkColorType::kAlpha_8_SkColorType |
- : SkColorType::kGray_8_SkColorType; |
} break; |
case 8: |
- colorType = SkColorType::kGray_8_SkColorType; |
+ if (pSource->GetPalette()) { |
+ ct = new SkColorTable(pSource->GetPalette(), pSource->GetPaletteSize()); |
+ colorType = SkColorType::kIndex_8_SkColorType; |
+ } |
break; |
case 24: { |
dst32Storage.reset(FX_Alloc2D(uint32_t, width, height)); |
@@ -1045,9 +1049,7 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
width, height, colorType, |
pSource->IsAlphaMask() ? kPremul_SkAlphaType : kOpaque_SkAlphaType); |
SkBitmap skBitmap; |
- skBitmap.installPixels(imageInfo, buffer, rowBytes, |
- nullptr, /* TODO(caryclark) : set color table */ |
- nullptr, nullptr); |
+ skBitmap.installPixels(imageInfo, buffer, rowBytes, ct, nullptr, nullptr); |
m_pCanvas->save(); |
SkMatrix skMatrix; |
const CFX_Matrix& m = *pMatrix; |
@@ -1065,6 +1067,8 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
paint.setAlpha(bitmap_alpha); |
m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); |
m_pCanvas->restore(); |
+ if (ct) |
+ ct->unref(); |
return TRUE; |
} |