| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if defined(_SKIA_SUPPORT_) | 5 #if defined(_SKIA_SUPPORT_) |
| 6 #include <algorithm> | 6 #include <algorithm> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "core/fxcodec/include/fx_codec.h" | 9 #include "core/fxcodec/include/fx_codec.h" |
| 10 #include "core/fxcrt/include/fx_memory.h" | 10 #include "core/fxcrt/include/fx_memory.h" |
| 11 | 11 |
| 12 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" | 12 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" |
| 13 #include "core/fpdfapi/fpdf_page/pageint.h" | 13 #include "core/fpdfapi/fpdf_page/pageint.h" |
| 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
| 16 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" | 16 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" |
| 17 #include "core/fxge/include/cfx_fontcache.h" | |
| 18 #include "core/fxge/include/cfx_fxgedevice.h" | 17 #include "core/fxge/include/cfx_fxgedevice.h" |
| 19 #include "core/fxge/include/cfx_gemodule.h" | 18 #include "core/fxge/include/cfx_gemodule.h" |
| 20 #include "core/fxge/include/cfx_graphstatedata.h" | 19 #include "core/fxge/include/cfx_graphstatedata.h" |
| 21 #include "core/fxge/include/cfx_pathdata.h" | 20 #include "core/fxge/include/cfx_pathdata.h" |
| 22 #include "core/fxge/include/cfx_renderdevice.h" | 21 #include "core/fxge/include/cfx_renderdevice.h" |
| 23 #include "core/fxge/skia/fx_skia_device.h" | 22 #include "core/fxge/skia/fx_skia_device.h" |
| 24 | 23 |
| 25 #include "third_party/skia/include/core/SkCanvas.h" | 24 #include "third_party/skia/include/core/SkCanvas.h" |
| 26 #include "third_party/skia/include/core/SkColorFilter.h" | 25 #include "third_party/skia/include/core/SkColorFilter.h" |
| 27 #include "third_party/skia/include/core/SkColorPriv.h" | 26 #include "third_party/skia/include/core/SkColorPriv.h" |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 class SkiaState { | 478 class SkiaState { |
| 480 public: | 479 public: |
| 481 enum class Clip { | 480 enum class Clip { |
| 482 kSave, | 481 kSave, |
| 483 kPath, | 482 kPath, |
| 484 }; | 483 }; |
| 485 | 484 |
| 486 // mark all cached state as uninitialized | 485 // mark all cached state as uninitialized |
| 487 SkiaState() | 486 SkiaState() |
| 488 : m_pFont(nullptr), | 487 : m_pFont(nullptr), |
| 489 m_pCache(nullptr), | |
| 490 m_fontSize(0), | 488 m_fontSize(0), |
| 491 m_fillColor(0), | 489 m_fillColor(0), |
| 492 m_strokeColor(0), | 490 m_strokeColor(0), |
| 493 m_blendType(0), | 491 m_blendType(0), |
| 494 m_commandIndex(0), | 492 m_commandIndex(0), |
| 495 m_drawText(false), | 493 m_drawText(false), |
| 496 m_drawPath(false), | 494 m_drawPath(false), |
| 497 m_fillPath(false), | 495 m_fillPath(false), |
| 498 m_debugDisable(false) {} | 496 m_debugDisable(false) {} |
| 499 | 497 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 skPaint.setColor(m_strokeColor); | 571 skPaint.setColor(m_strokeColor); |
| 574 skCanvas->drawPath(m_skPath, skPaint); | 572 skCanvas->drawPath(m_skPath, skPaint); |
| 575 } | 573 } |
| 576 skCanvas->restore(); | 574 skCanvas->restore(); |
| 577 m_drawPath = false; | 575 m_drawPath = false; |
| 578 } | 576 } |
| 579 | 577 |
| 580 bool DrawText(int nChars, | 578 bool DrawText(int nChars, |
| 581 const FXTEXT_CHARPOS* pCharPos, | 579 const FXTEXT_CHARPOS* pCharPos, |
| 582 CFX_Font* pFont, | 580 CFX_Font* pFont, |
| 583 CFX_FontCache* pCache, | |
| 584 const CFX_Matrix* pMatrix, | 581 const CFX_Matrix* pMatrix, |
| 585 FX_FLOAT font_size, | 582 FX_FLOAT font_size, |
| 586 uint32_t color, | 583 uint32_t color, |
| 587 CFX_SkiaDeviceDriver* pDriver) { | 584 CFX_SkiaDeviceDriver* pDriver) { |
| 588 if (m_debugDisable) | 585 if (m_debugDisable) |
| 589 return false; | 586 return false; |
| 590 if (m_commandIndex < m_commands.count()) | 587 if (m_commandIndex < m_commands.count()) |
| 591 FlushCommands(pDriver); | 588 FlushCommands(pDriver); |
| 592 if (m_drawPath) | 589 if (m_drawPath) |
| 593 FlushPath(pDriver); | 590 FlushPath(pDriver); |
| 594 if (m_drawText && FontChanged(pFont, pCache, pMatrix, font_size, color)) | 591 if (m_drawText && FontChanged(pFont, pMatrix, font_size, color)) |
| 595 FlushText(pDriver); | 592 FlushText(pDriver); |
| 596 if (!m_drawText) { | 593 if (!m_drawText) { |
| 597 m_positions.setCount(0); | 594 m_positions.setCount(0); |
| 598 m_glyphs.setCount(0); | 595 m_glyphs.setCount(0); |
| 599 m_pFont = pFont; | 596 m_pFont = pFont; |
| 600 m_pCache = pCache; | |
| 601 m_fontSize = font_size; | 597 m_fontSize = font_size; |
| 602 m_fillColor = color; | 598 m_fillColor = color; |
| 603 m_drawMatrix = *pMatrix; | 599 m_drawMatrix = *pMatrix; |
| 604 } | 600 } |
| 605 int count = m_positions.count(); | 601 int count = m_positions.count(); |
| 606 m_positions.setCount(nChars + count); | 602 m_positions.setCount(nChars + count); |
| 607 m_glyphs.setCount(nChars + count); | 603 m_glyphs.setCount(nChars + count); |
| 608 SkScalar flip = m_fontSize < 0 ? -1 : 1; | 604 SkScalar flip = m_fontSize < 0 ? -1 : 1; |
| 609 for (int index = 0; index < nChars; ++index) { | 605 for (int index = 0; index < nChars; ++index) { |
| 610 const FXTEXT_CHARPOS& cp = pCharPos[index]; | 606 const FXTEXT_CHARPOS& cp = pCharPos[index]; |
| 611 m_positions[index + count] = {cp.m_OriginX * flip, cp.m_OriginY * flip}; | 607 m_positions[index + count] = {cp.m_OriginX * flip, cp.m_OriginY * flip}; |
| 612 m_glyphs[index + count] = (uint16_t)cp.m_GlyphIndex; | 608 m_glyphs[index + count] = (uint16_t)cp.m_GlyphIndex; |
| 613 } | 609 } |
| 614 SkPoint delta; | 610 SkPoint delta; |
| 615 if (MatrixOffset(pMatrix, &delta)) { | 611 if (MatrixOffset(pMatrix, &delta)) { |
| 616 for (int index = 0; index < nChars; ++index) | 612 for (int index = 0; index < nChars; ++index) |
| 617 m_positions[index + count].offset(delta.fX * flip, -delta.fY * flip); | 613 m_positions[index + count].offset(delta.fX * flip, -delta.fY * flip); |
| 618 } | 614 } |
| 619 m_drawText = true; | 615 m_drawText = true; |
| 620 return true; | 616 return true; |
| 621 } | 617 } |
| 622 | 618 |
| 623 void FlushText(CFX_SkiaDeviceDriver* pDriver) { | 619 void FlushText(CFX_SkiaDeviceDriver* pDriver) { |
| 624 SkScalar flip = m_fontSize < 0 ? -1 : 1; | 620 SkScalar flip = m_fontSize < 0 ? -1 : 1; |
| 625 SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip); | 621 SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip); |
| 626 SkPaint skPaint; | 622 SkPaint skPaint; |
| 627 skPaint.setAntiAlias(true); | 623 skPaint.setAntiAlias(true); |
| 628 skPaint.setColor(m_fillColor); | 624 skPaint.setColor(m_fillColor); |
| 629 if (m_pFont->GetFace() && m_pCache) { // exclude placeholder test fonts | 625 if (m_pFont->GetFace()) { // exclude placeholder test fonts |
| 630 sk_sp<SkTypeface> typeface(SkSafeRef(m_pCache->GetDeviceCache(m_pFont))); | 626 sk_sp<SkTypeface> typeface(SkSafeRef(m_pFont->GetDeviceCache())); |
| 631 skPaint.setTypeface(typeface); | 627 skPaint.setTypeface(typeface); |
| 632 } | 628 } |
| 633 skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 629 skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| 634 skPaint.setTextSize(m_fontSize); | 630 skPaint.setTextSize(m_fontSize); |
| 635 skPaint.setSubpixelText(true); | 631 skPaint.setSubpixelText(true); |
| 636 skPaint.setHinting(SkPaint::kNo_Hinting); | 632 skPaint.setHinting(SkPaint::kNo_Hinting); |
| 637 SkCanvas* skCanvas = pDriver->SkiaCanvas(); | 633 SkCanvas* skCanvas = pDriver->SkiaCanvas(); |
| 638 skCanvas->save(); | 634 skCanvas->save(); |
| 639 skCanvas->concat(skMatrix); | 635 skCanvas->concat(skMatrix); |
| 640 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2, | 636 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2, |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 int blend_type) { | 772 int blend_type) { |
| 777 return MatrixChanged(pMatrix, m_drawMatrix) || | 773 return MatrixChanged(pMatrix, m_drawMatrix) || |
| 778 StateChanged(pState, m_drawState) || fill_color != m_fillColor || | 774 StateChanged(pState, m_drawState) || fill_color != m_fillColor || |
| 779 stroke_color != m_strokeColor || | 775 stroke_color != m_strokeColor || |
| 780 ((fill_mode & 3) == FXFILL_ALTERNATE) != | 776 ((fill_mode & 3) == FXFILL_ALTERNATE) != |
| 781 (m_skPath.getFillType() == SkPath::kEvenOdd_FillType) || | 777 (m_skPath.getFillType() == SkPath::kEvenOdd_FillType) || |
| 782 blend_type != m_blendType; | 778 blend_type != m_blendType; |
| 783 } | 779 } |
| 784 | 780 |
| 785 bool FontChanged(CFX_Font* pFont, | 781 bool FontChanged(CFX_Font* pFont, |
| 786 CFX_FontCache* pCache, | |
| 787 const CFX_Matrix* pMatrix, | 782 const CFX_Matrix* pMatrix, |
| 788 FX_FLOAT font_size, | 783 FX_FLOAT font_size, |
| 789 uint32_t color) { | 784 uint32_t color) { |
| 790 return pFont != m_pFont || pCache != m_pCache || | 785 return pFont != m_pFont || MatrixChanged(pMatrix, m_drawMatrix) || |
| 791 MatrixChanged(pMatrix, m_drawMatrix) || font_size != m_fontSize || | 786 font_size != m_fontSize || color != m_fillColor; |
| 792 color != m_fillColor; | |
| 793 } | 787 } |
| 794 | 788 |
| 795 bool MatrixChanged(const CFX_Matrix* pMatrix, const CFX_Matrix& refMatrix) { | 789 bool MatrixChanged(const CFX_Matrix* pMatrix, const CFX_Matrix& refMatrix) { |
| 796 CFX_Matrix identityMatrix; | 790 CFX_Matrix identityMatrix; |
| 797 if (!pMatrix) | 791 if (!pMatrix) |
| 798 pMatrix = &identityMatrix; | 792 pMatrix = &identityMatrix; |
| 799 return pMatrix->a != refMatrix.a || pMatrix->b != refMatrix.b || | 793 return pMatrix->a != refMatrix.a || pMatrix->b != refMatrix.b || |
| 800 pMatrix->c != refMatrix.c || pMatrix->d != refMatrix.d; | 794 pMatrix->c != refMatrix.c || pMatrix->d != refMatrix.d; |
| 801 } | 795 } |
| 802 | 796 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 SkTDArray<Clip> m_commands; // stack of clip-related commands | 859 SkTDArray<Clip> m_commands; // stack of clip-related commands |
| 866 SkTDArray<SkPoint> m_positions; // accumulator for text positions | 860 SkTDArray<SkPoint> m_positions; // accumulator for text positions |
| 867 SkTDArray<uint16_t> m_glyphs; // accumulator for text glyphs | 861 SkTDArray<uint16_t> m_glyphs; // accumulator for text glyphs |
| 868 SkPath m_skPath; // accumulator for path contours | 862 SkPath m_skPath; // accumulator for path contours |
| 869 SkPath m_skEmptyPath; // used as placehold in the clips array | 863 SkPath m_skEmptyPath; // used as placehold in the clips array |
| 870 CFX_Matrix m_drawMatrix; | 864 CFX_Matrix m_drawMatrix; |
| 871 CFX_GraphStateData m_clipState; | 865 CFX_GraphStateData m_clipState; |
| 872 CFX_GraphStateData m_drawState; | 866 CFX_GraphStateData m_drawState; |
| 873 CFX_Matrix m_clipMatrix; | 867 CFX_Matrix m_clipMatrix; |
| 874 CFX_Font* m_pFont; | 868 CFX_Font* m_pFont; |
| 875 CFX_FontCache* m_pCache; | |
| 876 FX_FLOAT m_fontSize; | 869 FX_FLOAT m_fontSize; |
| 877 uint32_t m_fillColor; | 870 uint32_t m_fillColor; |
| 878 uint32_t m_strokeColor; | 871 uint32_t m_strokeColor; |
| 879 int m_blendType; | 872 int m_blendType; |
| 880 int m_commandIndex; // active position in clip command stack | 873 int m_commandIndex; // active position in clip command stack |
| 881 bool m_drawText; | 874 bool m_drawText; |
| 882 bool m_drawPath; | 875 bool m_drawPath; |
| 883 bool m_fillPath; | 876 bool m_fillPath; |
| 884 bool m_debugDisable; // turn off cache for debugging | 877 bool m_debugDisable; // turn off cache for debugging |
| 885 }; | 878 }; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 } | 991 } |
| 999 | 992 |
| 1000 void CFX_SkiaDeviceDriver::Flush() { | 993 void CFX_SkiaDeviceDriver::Flush() { |
| 1001 m_pCache->Flush(this); | 994 m_pCache->Flush(this); |
| 1002 m_pCache->FlushCommands(this); | 995 m_pCache->FlushCommands(this); |
| 1003 } | 996 } |
| 1004 | 997 |
| 1005 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, | 998 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, |
| 1006 const FXTEXT_CHARPOS* pCharPos, | 999 const FXTEXT_CHARPOS* pCharPos, |
| 1007 CFX_Font* pFont, | 1000 CFX_Font* pFont, |
| 1008 CFX_FontCache* pCache, | |
| 1009 const CFX_Matrix* pObject2Device, | 1001 const CFX_Matrix* pObject2Device, |
| 1010 FX_FLOAT font_size, | 1002 FX_FLOAT font_size, |
| 1011 uint32_t color) { | 1003 uint32_t color) { |
| 1012 if (!pCache) | 1004 if (m_pCache->DrawText(nChars, pCharPos, pFont, pObject2Device, font_size, |
| 1013 pCache = CFX_GEModule::Get()->GetFontCache(); | 1005 color, this)) { |
| 1014 if (m_pCache->DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, | |
| 1015 font_size, color, this)) { | |
| 1016 return TRUE; | 1006 return TRUE; |
| 1017 } | 1007 } |
| 1018 sk_sp<SkTypeface> typeface( | 1008 sk_sp<SkTypeface> typeface(SkSafeRef(pFont->GetDeviceCache())); |
| 1019 SkSafeRef(pCache ? pCache->GetDeviceCache(pFont) : nullptr)); | |
| 1020 SkPaint paint; | 1009 SkPaint paint; |
| 1021 paint.setAntiAlias(true); | 1010 paint.setAntiAlias(true); |
| 1022 paint.setColor(color); | 1011 paint.setColor(color); |
| 1023 paint.setTypeface(typeface); | 1012 paint.setTypeface(typeface); |
| 1024 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 1013 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| 1025 paint.setHinting(SkPaint::kNo_Hinting); | 1014 paint.setHinting(SkPaint::kNo_Hinting); |
| 1026 paint.setTextSize(font_size); | 1015 paint.setTextSize(font_size); |
| 1027 paint.setSubpixelText(true); | 1016 paint.setSubpixelText(true); |
| 1028 m_pCanvas->save(); | 1017 m_pCanvas->save(); |
| 1029 SkScalar flip = font_size < 0 ? -1 : 1; | 1018 SkScalar flip = font_size < 0 ? -1 : 1; |
| (...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1683 SkA32Assert(a); | 1672 SkA32Assert(a); |
| 1684 SkASSERT(r <= a); | 1673 SkASSERT(r <= a); |
| 1685 SkASSERT(g <= a); | 1674 SkASSERT(g <= a); |
| 1686 SkASSERT(b <= a); | 1675 SkASSERT(b <= a); |
| 1687 } | 1676 } |
| 1688 } | 1677 } |
| 1689 #endif | 1678 #endif |
| 1690 } | 1679 } |
| 1691 | 1680 |
| 1692 #endif | 1681 #endif |
| OLD | NEW |