Use spancpy() in more places

Perform a single copy operation instead of copying one element at a
time, or switch to using std::array's copy ctor.

Change-Id: I0d93f55120b4755026a20e7124510b7c164d1e47
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112571
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/page/cpdf_textstate.cpp b/core/fpdfapi/page/cpdf_textstate.cpp
index 37ac332..146202e 100644
--- a/core/fpdfapi/page/cpdf_textstate.cpp
+++ b/core/fpdfapi/page/cpdf_textstate.cpp
@@ -101,13 +101,9 @@
       m_FontSize(that.m_FontSize),
       m_CharSpace(that.m_CharSpace),
       m_WordSpace(that.m_WordSpace),
-      m_TextMode(that.m_TextMode) {
-  for (int i = 0; i < 4; ++i)
-    m_Matrix[i] = that.m_Matrix[i];
-
-  for (int i = 0; i < 4; ++i)
-    m_CTM[i] = that.m_CTM[i];
-
+      m_TextMode(that.m_TextMode),
+      m_Matrix(that.m_Matrix),
+      m_CTM(that.m_CTM) {
   if (m_pDocument && m_pFont) {
     auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument);
     m_pFont = pPageData->GetFont(m_pFont->GetMutableFontDict());
diff --git a/core/fxge/dib/cfx_imagetransformer.cpp b/core/fxge/dib/cfx_imagetransformer.cpp
index 5328de8..b157dab 100644
--- a/core/fxge/dib/cfx_imagetransformer.cpp
+++ b/core/fxge/dib/cfx_imagetransformer.cpp
@@ -8,6 +8,7 @@
 
 #include <math.h>
 
+#include <array>
 #include <iterator>
 #include <memory>
 #include <utility>
@@ -17,6 +18,7 @@
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/notreached.h"
 #include "core/fxcrt/numerics/safe_conversions.h"
+#include "core/fxcrt/span_util.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/dib/cfx_imagestretcher.h"
 #include "core/fxge/dib/fx_dib.h"
@@ -277,16 +279,14 @@
 }
 
 void CFX_ImageTransformer::CalcMono(const CalcData& calc_data) {
-  uint32_t argb[256];
+  std::array<uint32_t, 256> argb;
   if (m_Storer.GetBitmap()->HasPalette()) {
     pdfium::span<const uint32_t> palette =
         m_Storer.GetBitmap()->GetPaletteSpan();
-    for (size_t i = 0; i < std::size(argb); i++)
-      argb[i] = palette[i];
+    fxcrt::spancpy(pdfium::make_span(argb), palette.first(argb.size()));
   } else {
-    for (size_t i = 0; i < std::size(argb); i++) {
-      uint32_t v = static_cast<uint32_t>(i);
-      argb[i] = ArgbEncode(0xff, v, v, v);
+    for (uint32_t i = 0; i < argb.size(); ++i) {
+      argb[i] = ArgbEncode(0xff, i, i, i);
     }
   }
   int destBpp = calc_data.bitmap->GetBPP() / 8;
diff --git a/core/fxge/dib/cfx_scanlinecompositor.cpp b/core/fxge/dib/cfx_scanlinecompositor.cpp
index 7aef96a..50e3da5 100644
--- a/core/fxge/dib/cfx_scanlinecompositor.cpp
+++ b/core/fxge/dib/cfx_scanlinecompositor.cpp
@@ -13,6 +13,7 @@
 #include "core/fxcrt/check.h"
 #include "core/fxcrt/check_op.h"
 #include "core/fxcrt/compiler_specific.h"
+#include "core/fxcrt/span_util.h"
 #include "core/fxge/dib/blend.h"
 #include "core/fxge/dib/fx_dib.h"
 
@@ -2152,8 +2153,7 @@
       return;
     }
     pdfium::span<uint32_t> pPalette = m_SrcPalette.Make32BitPalette(pal_count);
-    for (size_t i = 0; i < pal_count; ++i)
-      pPalette[i] = src_palette[i];
+    fxcrt::spancpy(pPalette, src_palette.first(pal_count));
     return;
   }
   if (bIsDestBpp8) {
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 195c368..3535a4e 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -1341,8 +1341,8 @@
   const unsigned long trailer_ends_len =
       fxcrt::CollectionSize<unsigned long>(trailer_ends);
   if (buffer && length >= trailer_ends_len) {
-    for (size_t i = 0; i < trailer_ends_len; ++i)
-      buffer[i] = trailer_ends[i];
+    fxcrt::spancpy(pdfium::make_span(buffer, length),
+                   pdfium::make_span(trailer_ends));
   }
 
   return trailer_ends_len;