Avoid some unnecessary SharedCopyOnWrite copies Per suggestion on the bug, avoid copying in various SharedCopyOnWrite objects if the copy is going to have the same value as the existing copy. This just gets some of the low hanging fruits. Bug: pdfium:1917 Change-Id: I587c26cdcdf580480419a4b4767a71c8b7c8230e Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112070 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_colorstate.cpp b/core/fpdfapi/page/cpdf_colorstate.cpp index 8d94627..dde0c29 100644 --- a/core/fpdfapi/page/cpdf_colorstate.cpp +++ b/core/fpdfapi/page/cpdf_colorstate.cpp
@@ -33,7 +33,9 @@ } void CPDF_ColorState::SetFillColorRef(FX_COLORREF colorref) { - m_Ref.GetPrivateCopy()->m_FillColorRef = colorref; + if (!m_Ref || GetFillColorRef() != colorref) { + m_Ref.GetPrivateCopy()->m_FillColorRef = colorref; + } } FX_COLORREF CPDF_ColorState::GetStrokeColorRef() const { @@ -41,7 +43,9 @@ } void CPDF_ColorState::SetStrokeColorRef(FX_COLORREF colorref) { - m_Ref.GetPrivateCopy()->m_StrokeColorRef = colorref; + if (!m_Ref || GetStrokeColorRef() != colorref) { + m_Ref.GetPrivateCopy()->m_StrokeColorRef = colorref; + } } const CPDF_Color* CPDF_ColorState::GetFillColor() const {
diff --git a/core/fpdfapi/page/cpdf_generalstate.cpp b/core/fpdfapi/page/cpdf_generalstate.cpp index 4c1e692..c67d30c 100644 --- a/core/fpdfapi/page/cpdf_generalstate.cpp +++ b/core/fpdfapi/page/cpdf_generalstate.cpp
@@ -123,7 +123,9 @@ } void CPDF_GeneralState::SetBlendType(BlendMode type) { - m_Ref.GetPrivateCopy()->m_BlendType = type; + if (GetBlendType() != type) { + m_Ref.GetPrivateCopy()->m_BlendType = type; + } } float CPDF_GeneralState::GetFillAlpha() const { @@ -132,7 +134,9 @@ } void CPDF_GeneralState::SetFillAlpha(float alpha) { - m_Ref.GetPrivateCopy()->m_FillAlpha = alpha; + if (GetFillAlpha() != alpha) { + m_Ref.GetPrivateCopy()->m_FillAlpha = alpha; + } } float CPDF_GeneralState::GetStrokeAlpha() const { @@ -141,7 +145,9 @@ } void CPDF_GeneralState::SetStrokeAlpha(float alpha) { - m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha; + if (GetStrokeAlpha() != alpha) { + m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha; + } } RetainPtr<const CPDF_Dictionary> CPDF_GeneralState::GetSoftMask() const {
diff --git a/core/fpdfapi/page/cpdf_textstate.cpp b/core/fpdfapi/page/cpdf_textstate.cpp index 6e48b87..a24eb04 100644 --- a/core/fpdfapi/page/cpdf_textstate.cpp +++ b/core/fpdfapi/page/cpdf_textstate.cpp
@@ -34,7 +34,9 @@ } void CPDF_TextState::SetFontSize(float size) { - m_Ref.GetPrivateCopy()->m_FontSize = size; + if (!m_Ref || GetFontSize() != size) { + m_Ref.GetPrivateCopy()->m_FontSize = size; + } } pdfium::span<const float> CPDF_TextState::GetMatrix() const { @@ -50,7 +52,9 @@ } void CPDF_TextState::SetCharSpace(float sp) { - m_Ref.GetPrivateCopy()->m_CharSpace = sp; + if (!m_Ref || GetCharSpace() != sp) { + m_Ref.GetPrivateCopy()->m_CharSpace = sp; + } } float CPDF_TextState::GetWordSpace() const { @@ -58,7 +62,9 @@ } void CPDF_TextState::SetWordSpace(float sp) { - m_Ref.GetPrivateCopy()->m_WordSpace = sp; + if (!m_Ref || GetWordSpace() != sp) { + m_Ref.GetPrivateCopy()->m_WordSpace = sp; + } } float CPDF_TextState::GetFontSizeH() const { @@ -70,7 +76,9 @@ } void CPDF_TextState::SetTextMode(TextRenderingMode mode) { - m_Ref.GetPrivateCopy()->m_TextMode = mode; + if (!m_Ref || GetTextMode() != mode) { + m_Ref.GetPrivateCopy()->m_TextMode = mode; + } } pdfium::span<const float> CPDF_TextState::GetCTM() const {