Chromium Code Reviews| 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..51a8102eef40a60da52cb46dddaeb85dde82c6a6 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) { |
|
dsinclair
2016/03/24 01:45:45
nit: Can these statics move into an anonymous name
caryclark
2016/03/24 13:48:02
Done.
|
| + 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)); |
| @@ -150,9 +202,8 @@ void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, |
| intervals[i * 2] = on; |
| intervals[i * 2 + 1] = off; |
| } |
| - spaint->setPathEffect(SkDashPathEffect::Create(intervals, count * 2, |
| - pGraphState->m_DashPhase)) |
| - ->unref(); |
| + spaint->setPathEffect( |
| + SkDashPathEffect::Make(intervals, count * 2, pGraphState->m_DashPhase)); |
| } |
| spaint->setStyle(SkPaint::kStroke_Style); |
| spaint->setAntiAlias(true); |
| @@ -203,19 +254,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, |
| @@ -233,6 +271,7 @@ FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, |
| paint.setTypeface(typeface); |
| paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| paint.setTextSize(font_size); |
| + paint.setSubpixelText(true); |
| m_pCanvas->save(); |
| SkMatrix skMatrix = ToFlippedSkMatrix(*pObject2Device); |
| m_pCanvas->concat(skMatrix); |
| @@ -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,8 @@ FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| paint.setFilterQuality(kHigh_SkFilterQuality); |
| + paint.setXfermodeMode(GetSkiaBlendMode(blend_type)); |
| + paint.setAlpha(bitmap_alpha); |
| m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); |
| m_pCanvas->restore(); |
| return TRUE; |