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 a06eac80b4821a309c6fed4b413af382046b9b9f..3e78044240e4083ed90582abd173f1bd2fc51264 100644 |
--- a/core/fxge/skia/fx_skia_device.cpp |
+++ b/core/fxge/skia/fx_skia_device.cpp |
@@ -37,8 +37,8 @@ static void DebugShowCanvasMatrix(const SkCanvas* canvas) { |
SkMatrix matrix = canvas->getTotalMatrix(); |
SkScalar m[9]; |
matrix.get9(m); |
- printf("(%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3], m[4], m[5], m[6], |
- m[7], m[8]); |
+ printf("(%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3], m[4], |
+ m[5], m[6], m[7], m[8]); |
#endif // SHOW_SKIA_PATH |
} |
@@ -97,6 +97,57 @@ static SkPath BuildPath(const CFX_PathData* pPathData) { |
return skPath; |
} |
+static SkMatrix ToSkMatrix(const CFX_Matrix& m) { |
+ SkMatrix skMatrix; |
+ skMatrix.setAll(m.a, m.b, m.e, m.c, m.d, m.f, 0, 0, 1); |
+ return skMatrix; |
+} |
+ |
+// use when pdf's y-axis points up insead of down |
+static SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m) { |
+ SkMatrix skMatrix; |
+ skMatrix.setAll(m.a, m.b, m.e, -m.c, -m.d, m.f, 0, 0, 1); |
+ return skMatrix; |
+} |
+ |
+static SkXfermode::Mode GetSkiaBlendMode(int blend_type) { |
+ switch (blend_type) { |
+ case FXDIB_BLEND_MULTIPLY: |
+ return SkXfermode::kMultiply_Mode; |
+ case FXDIB_BLEND_SCREEN: |
+ return SkXfermode::kScreen_Mode; |
+ case FXDIB_BLEND_OVERLAY: |
+ return SkXfermode::kOverlay_Mode; |
+ case FXDIB_BLEND_DARKEN: |
+ return SkXfermode::kDarken_Mode; |
+ case FXDIB_BLEND_LIGHTEN: |
+ return SkXfermode::kLighten_Mode; |
+ case FXDIB_BLEND_COLORDODGE: |
+ return SkXfermode::kColorDodge_Mode; |
+ case FXDIB_BLEND_COLORBURN: |
+ return SkXfermode::kColorBurn_Mode; |
+ case FXDIB_BLEND_HARDLIGHT: |
+ return SkXfermode::kHardLight_Mode; |
+ case FXDIB_BLEND_SOFTLIGHT: |
+ return SkXfermode::kSoftLight_Mode; |
+ case FXDIB_BLEND_DIFFERENCE: |
+ return SkXfermode::kDifference_Mode; |
+ case FXDIB_BLEND_EXCLUSION: |
+ return SkXfermode::kExclusion_Mode; |
+ case FXDIB_BLEND_HUE: |
+ return SkXfermode::kHue_Mode; |
+ case FXDIB_BLEND_SATURATION: |
+ return SkXfermode::kSaturation_Mode; |
+ case FXDIB_BLEND_COLOR: |
+ return SkXfermode::kColor_Mode; |
+ case FXDIB_BLEND_LUMINOSITY: |
+ return SkXfermode::kLuminosity_Mode; |
+ case FXDIB_BLEND_NORMAL: |
+ default: |
+ return SkXfermode::kSrcOver_Mode; |
+ } |
+} |
+ |
// convert a stroking path to scanlines |
void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, |
const CFX_GraphStateData* pGraphState, |
@@ -132,8 +183,9 @@ void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, |
inverse.set(SkMatrix::kMTransY, 0); |
SkVector deviceUnits[2] = {{0, 1}, {1, 0}}; |
inverse.mapPoints(deviceUnits, SK_ARRAY_COUNT(deviceUnits)); |
- FX_FLOAT width = SkTMax(pGraphState->m_LineWidth, |
- SkTMin(deviceUnits[0].length(), deviceUnits[1].length())); |
+ FX_FLOAT width = |
+ SkTMax(pGraphState->m_LineWidth, |
+ SkTMin(deviceUnits[0].length(), deviceUnits[1].length())); |
if (pGraphState->m_DashArray) { |
int count = (pGraphState->m_DashCount + 1) / 2; |
SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar)); |
@@ -203,19 +255,6 @@ CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { |
delete m_pAggDriver; |
} |
-static SkMatrix ToSkMatrix(const CFX_Matrix& m) { |
- SkMatrix skMatrix; |
- skMatrix.setAll(m.a, m.b, m.e, m.c, m.d, m.f, 0, 0, 1); |
- return skMatrix; |
-} |
- |
-// use when pdf's y-axis points up insead of down |
-static SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m) { |
- SkMatrix skMatrix; |
- skMatrix.setAll(m.a, m.b, m.e, -m.c, -m.d, m.f, 0, 0, 1); |
- return skMatrix; |
-} |
- |
FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, |
const FXTEXT_CHARPOS* pCharPos, |
CFX_Font* pFont, |
@@ -345,6 +384,7 @@ FX_BOOL CFX_SkiaDeviceDriver::DrawPath( |
SkPath skPath = BuildPath(pPathData); |
SkPaint spaint; |
spaint.setAntiAlias(true); |
+ spaint.setXfermodeMode(GetSkiaBlendMode(blend_type)); |
m_pCanvas->save(); |
SkMatrix skMatrix = ToSkMatrix(*pObject2Device); |
m_pCanvas->concat(skMatrix); |
@@ -380,6 +420,7 @@ FX_BOOL CFX_SkiaDeviceDriver::FillRect(const FX_RECT* pRect, |
SkPaint spaint; |
spaint.setAntiAlias(true); |
spaint.setColor(fill_color); |
+ spaint.setXfermodeMode(GetSkiaBlendMode(blend_type)); |
m_pCanvas->drawRect( |
SkRect::MakeLTRB(pRect->left, pRect->top, pRect->right, pRect->bottom), |
@@ -513,6 +554,7 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
SkPaint paint; |
paint.setAntiAlias(true); |
paint.setFilterQuality(kHigh_SkFilterQuality); |
+ paint.setXfermodeMode(GetSkiaBlendMode(blend_type)); |
m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); |
m_pCanvas->restore(); |
return TRUE; |