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 {