summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/page/cpdf_colorspace.cpp22
-rw-r--r--third_party/base/stl_util.h10
2 files changed, 20 insertions, 12 deletions
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 0138b81ca1..17b2914900 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -222,7 +222,7 @@ class CPDF_ICCBasedCS : public CPDF_ColorSpace {
MaybeOwned<CPDF_ColorSpace> m_pAlterCS;
RetainPtr<CPDF_IccProfile> m_pProfile;
- mutable std::unique_ptr<uint8_t, FxFreeDeleter> m_pCache;
+ mutable std::vector<uint8_t> m_pCache;
std::vector<float> m_pRanges;
};
@@ -984,24 +984,22 @@ void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf,
return;
}
- if (!m_pCache) {
- m_pCache.reset(FX_Alloc2D(uint8_t, nMaxColors, 3));
- std::unique_ptr<uint8_t, FxFreeDeleter> temp_src(
- FX_Alloc2D(uint8_t, nMaxColors, nComponents));
- uint8_t* pSrc = temp_src.get();
+ if (m_pCache.empty()) {
+ m_pCache = pdfium::Vector2D<uint8_t>(nMaxColors, 3);
+ auto temp_src = pdfium::Vector2D<uint8_t>(nMaxColors, nComponents);
+ size_t src_index = 0;
for (int i = 0; i < nMaxColors; i++) {
uint32_t color = i;
uint32_t order = nMaxColors / 52;
for (uint32_t c = 0; c < nComponents; c++) {
- *pSrc++ = static_cast<uint8_t>(color / order * 5);
+ temp_src[src_index++] = static_cast<uint8_t>(color / order * 5);
color %= order;
order /= 52;
}
}
CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
- m_pProfile->transform(), m_pCache.get(), temp_src.get(), nMaxColors);
+ m_pProfile->transform(), m_pCache.data(), temp_src.data(), nMaxColors);
}
- uint8_t* pCachePtr = m_pCache.get();
for (int i = 0; i < pixels; i++) {
int index = 0;
for (uint32_t c = 0; c < nComponents; c++) {
@@ -1009,9 +1007,9 @@ void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf,
pSrcBuf++;
}
index *= 3;
- *pDestBuf++ = pCachePtr[index];
- *pDestBuf++ = pCachePtr[index + 1];
- *pDestBuf++ = pCachePtr[index + 2];
+ *pDestBuf++ = m_pCache[index];
+ *pDestBuf++ = m_pCache[index + 1];
+ *pDestBuf++ = m_pCache[index + 2];
}
}
diff --git a/third_party/base/stl_util.h b/third_party/base/stl_util.h
index 6c36ddcda1..5d984dc4cc 100644
--- a/third_party/base/stl_util.h
+++ b/third_party/base/stl_util.h
@@ -9,8 +9,10 @@
#include <iterator>
#include <memory>
#include <set>
+#include <vector>
#include "third_party/base/numerics/safe_conversions.h"
+#include "third_party/base/numerics/safe_math.h"
namespace pdfium {
@@ -74,6 +76,14 @@ constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
return std::min(std::max(v, lo), hi);
}
+// Safely allocate a 1-dim vector big enough for |w| by |h| or die.
+template <typename T>
+std::vector<T> Vector2D(size_t w, size_t h) {
+ pdfium::base::CheckedNumeric<size_t> safe_size = w;
+ safe_size *= h;
+ return std::vector<T>(safe_size.ValueOrDie());
+}
+
} // namespace pdfium
#endif // PDFIUM_THIRD_PARTY_BASE_STL_UTIL_H_