Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2455)

Unified Diff: core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp

Issue 1433423002: Fix extraction of colour components in CPDF_DIBSource::DownSampleScanline32Bit (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « BUILD.gn ('k') | core/src/fpdfapi/fpdf_render/fpdf_render_loadimage_embeddertest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index f6f41d9de11f000598c6858b726afa2a068650ac..53aeb1ed62d195a927e2508997ac03cd0d4d9d19 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -19,7 +19,7 @@
namespace {
-unsigned int _GetBits8(const uint8_t* pData, int bitpos, int nbits) {
+unsigned int _GetBits8(const uint8_t* pData, size_t bitpos, size_t nbits) {
Tom Sepez 2015/11/11 21:09:44 follow-up: bitpos needs to be an uint64_t. kMaxIm
Oliver Chang 2015/11/11 22:30:59 Done. will fix up callers in a separate CL.
unsigned int byte = pData[bitpos / 8];
Tom Sepez 2015/11/11 21:09:45 ASSERT(nbits == 1 || nbits == 2 || nbits == 4 ||
Oliver Chang 2015/11/11 22:30:59 Done.
if (nbits == 8) {
return byte;
@@ -1431,59 +1431,67 @@ void CPDF_DIBSource::DownSampleScanline32Bit(int orig_Bpp,
int clip_width) const {
int last_src_x = -1;
FX_ARGB last_argb = FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF);
- FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
for (int i = 0; i < clip_width; i++) {
int dest_x = clip_left + i;
FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) *
(int64_t)src_width / dest_width;
src_x %= src_width;
- const uint8_t* pSrcPixel = nullptr;
+
+ // No need to check for overflow, as |src_x| is bounded by |src_width| and
+ // DownSampleScanline already checked for overflow with the pitch
+ // calculation.
+ size_t byte_offset = src_x;
+ size_t bit_offset = 0;
if (m_bpc % 8 == 0) {
- pSrcPixel = pSrcLine + src_x * orig_Bpp;
+ byte_offset *= orig_Bpp;
} else {
- pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
+ byte_offset *= m_bpc;
Tom Sepez 2015/11/11 21:09:45 nit: this can probably be an infix expression sinc
Oliver Chang 2015/11/11 22:30:59 Done. I initially used a safe size_t, but neglecte
+ byte_offset *= m_nComponents;
+ bit_offset = byte_offset % 8;
+ byte_offset /= 8;
}
+
+ const uint8_t* pSrcPixel = pSrcLine + byte_offset;
uint8_t* pDestPixel = dest_scan + i * dest_Bpp;
FX_ARGB argb;
if (src_x == last_src_x) {
argb = last_argb;
} else {
+ CFX_FixedBufGrow<uint8_t, 128> extracted_components(m_nComponents);
+ if (m_bpc % 8 != 0) {
+ for (FX_DWORD j = 0; j < m_nComponents; ++j) {
+ extracted_components[j] =
+ _GetBits8(pSrcPixel, bit_offset + (j * m_bpc), m_bpc) *
+ unit_To8Bpc;
+ }
+ pSrcPixel = extracted_components;
+ }
+
Tom Sepez 2015/11/11 21:09:45 I think there's a problem with {} nesting, I'd exp
Oliver Chang 2015/11/11 22:30:59 Acknowledged.
if (m_pColorSpace) {
- CFX_FixedBufGrow<uint8_t, 128> temp(orig_Bpp);
uint8_t color[4];
const FX_BOOL bTransMask = TransMask();
if (m_bDefaultDecode) {
- if (m_bpc < 8) {
- int src_bit_pos = 0;
- if (src_x % 2) {
- src_bit_pos = 4;
- }
- for (FX_DWORD j = 0; j < m_nComponents; ++j) {
- temp[j] = (uint8_t)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) *
- unit_To8Bpc);
- src_bit_pos += m_bpc;
- }
- m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, bTransMask);
- } else {
- m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0,
- bTransMask);
- }
+ m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0,
+ bTransMask);
} else {
for (FX_DWORD j = 0; j < m_nComponents; ++j) {
+ FX_FLOAT component_value =
+ static_cast<FX_FLOAT>(extracted_components[j]);
int color_value =
(int)((m_pCompData[j].m_DecodeMin +
- m_pCompData[j].m_DecodeStep * (FX_FLOAT)pSrcPixel[j]) *
+ m_pCompData[j].m_DecodeStep * component_value) *
255.0f +
0.5f);
- temp[j] =
+ extracted_components[j] =
color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
}
- m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, bTransMask);
+ m_pColorSpace->TranslateImageLine(color, extracted_components, 1, 0,
+ 0, bTransMask);
}
argb = FXARGB_MAKE(0xFF, color[2], color[1], color[0]);
} else {
- argb = FXARGB_MAKE(0xFf, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
+ argb = FXARGB_MAKE(0xFF, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
}
if (m_bColorKey) {
int alpha = 0xFF;
« no previous file with comments | « BUILD.gn ('k') | core/src/fpdfapi/fpdf_render/fpdf_render_loadimage_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698