Nicolás Peña posted comments on this change.
Patch set 2:Commit-Queue +1
To view, visit change 4970. To unsubscribe, visit settings.
Nicolás Peña posted comments on this change.
Patch set 3:Commit-Queue +1
ptal
(1 comment)
File core/fxge/dib/cstretchengine.cpp:
Patch Set #3, Line 396: pWeights
Shorter name to avoid the ++j's going to the next line
To view, visit change 4970. To unsubscribe, visit settings.
Tom Sepez posted comments on this change.
Patch set 3:
(1 comment)
File core/fxge/dib/cstretchengine.h:
Patch Set #3, Line 65: std::unique_ptr<uint8_t, FxFreeDeleter>
how do we feel nowadays about this vs. std::vector<uint8_t> m_pDestScanLine;
We |malloc| far too much compared to other C++ code ??
To view, visit change 4970. To unsubscribe, visit settings.
Nicolás Peña posted comments on this change.
Patch Set #3, Line 65: std::unique_ptr<uint8_t, FxFreeDeleter>
how do we feel nowadays about this vs. std::vector<uint8_t> m_pDestScanLine
I was going to use vectors for these but then I got scared. The code somtimes uses unsigned char* instead of uint8_t*, even for allocation: FX_TryAlloc(unsigned char, ...). If you're ok with assuming sizeof(uint8_t) == sizeof(unsigned char) then I can go ahead and use vectors instead. Otherwise the size of the vector would be ugly: sizeof(unsigned char) / sizeof(uint8_t) * alloc_size. I would mostly use .data() for now, and maybe improve the usage in a followup.
To view, visit change 4970. To unsubscribe, visit settings.
Tom Sepez posted comments on this change.
Patch set 3:
Patch Set 3:
(1 comment)
sizeof(char) == sizeof(uint8_t) == 1 is a reasonable assumption and is required by the specs IIRC.
Nicolás Peña posted comments on this change.
Patch set 4:Commit-Queue +1
ptal
Tom Sepez posted comments on this change.
Patch set 4:Code-Review +1
(1 comment)
File core/fxge/dib/cstretchengine.cpp:
Patch Set #4, Line 156: pixel_weights.m_SrcStart
nit: maybe a temporary for this value, followed by one assignment for each member based upon it.
To view, visit change 4970. To unsubscribe, visit settings.
Nicolás Peña posted comments on this change.
Patch set 5:Commit-Queue +2
(1 comment)
nit: maybe a temporary for this value, followed by one assignment for each
Done
To view, visit change 4970. To unsubscribe, visit settings.
Chromium commit bot posted comments on this change.
Patch set 5:
CQ is trying da patch.
Note: The patchset sent to CQ was uploaded after this CL was approved.
"Nit" https://pdfium-review.googlesource.com/c/4970/5
Follow status at: https://chromium-cq-status.appspot.com/v2/patch-status/pdfium-review.googlesource.com/4970/5
Bot data: {"action": "start", "triggered_at": "2017-05-05T21:01:22.0Z", "revision": "50d55a20e552b3203b3aa8d27bb04d45727ea288"}
Tom Sepez posted comments on this change.
Patch set 5:
(1 comment)
File core/fxge/dib/cstretchengine.cpp:
pixel_weights.m_SrcStart = pixel_pos;
pixel_weights.m_SrcEnd = pixel_pos;
actually, lose these two lines and just write:
pixel_weights.m_SrcStart = std::max(pixel_pos, src_min);
pixel_weights.m_SrcEnd = std::min(pixel_pos, src_max - 1);
To view, visit change 4970. To unsubscribe, visit settings.
Nicolás Peña removed a vote from this change.
To view, visit change 4970. To unsubscribe, visit settings.
Nicolás Peña posted comments on this change.
Patch set 6:Commit-Queue +2
(1 comment)
pixel_weights.m_SrcStart = std::max(pixel_pos, src_min);
pixel_weights.m_SrcEnd = std::min(p
actually, lose these two lines and just write:
Done
To view, visit change 4970. To unsubscribe, visit settings.
Chromium commit bot posted comments on this change.
Patch set 6:
CQ is trying da patch.
Note: The patchset sent to CQ was uploaded after this CL was approved.
"N" https://pdfium-review.googlesource.com/c/4970/6
Follow status at: https://chromium-cq-status.appspot.com/v2/patch-status/pdfium-review.googlesource.com/4970/6
Bot data: {"action": "start", "triggered_at": "2017-05-05T21:12:01.0Z", "revision": "d8925b8cad85f36c4cb2b4912e8c2e2ae63f0719"}
Try jobs failed on following builders:
win_xfa_clang_32 on master.tryserver.client.pdfium (JOB_FAILED, https://build.chromium.org/p/tryserver.client.pdfium/builders/win_xfa_clang_32/builds/2119)
Bot data: {"action": "cancel", "triggered_at": "2017-05-05T21:12:01.0Z", "revision": "d8925b8cad85f36c4cb2b4912e8c2e2ae63f0719"}
Lei Zhang posted comments on this change.
Patch set 6:Commit-Queue +2
Chromium commit bot posted comments on this change.
Patch set 6:
CQ is trying da patch.
Note: The patchset sent to CQ was uploaded after this CL was approved.
"N" https://pdfium-review.googlesource.com/c/4970/6
Follow status at: https://chromium-cq-status.appspot.com/v2/patch-status/pdfium-review.googlesource.com/4970/6
Bot data: {"action": "start", "triggered_at": "2017-05-05T21:47:17.0Z", "revision": "d8925b8cad85f36c4cb2b4912e8c2e2ae63f0719"}
Chromium commit bot merged this change.
Cleanup CStretchEngine and its CWeightTable
This CL cleans up a bunch of nits and improves ownership in the CStretchEngine
class.
Change-Id: I6527f29c50dab329ef58d0724cd24b94fca50ee6
Reviewed-on: https://pdfium-review.googlesource.com/4970
Commit-Queue: Lei Zhang <the...@chromium.org>
Reviewed-by: Tom Sepez <tse...@chromium.org>
---
M core/fxge/dib/cfx_bitmapcomposer.cpp
M core/fxge/dib/cstretchengine.cpp
M core/fxge/dib/cstretchengine.h
3 files changed, 282 insertions(+), 357 deletions(-)
diff --git a/core/fxge/dib/cfx_bitmapcomposer.cpp b/core/fxge/dib/cfx_bitmapcomposer.cpp
index bd634ad..604c0c2 100644
--- a/core/fxge/dib/cfx_bitmapcomposer.cpp
+++ b/core/fxge/dib/cfx_bitmapcomposer.cpp
@@ -45,6 +45,7 @@
m_bRgbByteOrder = bRgbByteOrder;
m_BlendType = blend_type;
}
+
bool CFX_BitmapComposer::SetInfo(int width,
int height,
FXDIB_Format src_format,
@@ -107,11 +108,12 @@
return;
}
const uint8_t* clip_scan = nullptr;
- if (m_pClipMask)
+ if (m_pClipMask) {
clip_scan = m_pClipMask->GetBuffer() +
(m_DestTop + line - m_pClipRgn->GetBox().top) *
m_pClipMask->GetPitch() +
(m_DestLeft - m_pClipRgn->GetBox().left);
+ }
uint8_t* dest_scan =
const_cast<uint8_t*>(m_pBitmap->GetScanline(line + m_DestTop)) +
m_DestLeft * m_pBitmap->GetBPP() / 8;
diff --git a/core/fxge/dib/cstretchengine.cpp b/core/fxge/dib/cstretchengine.cpp
index 9fdaa02..b5cf4a7 100644
--- a/core/fxge/dib/cstretchengine.cpp
+++ b/core/fxge/dib/cstretchengine.cpp
@@ -6,20 +6,26 @@
#include "core/fxge/dib/cstretchengine.h"
+#include <algorithm>
+#include <utility>
+
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/dib/cfx_dibsource.h"
#include "core/fxge/dib/ifx_scanlinecomposer.h"
#include "core/fxge/fx_dib.h"
+namespace {
+
+const int kMaxDestValue = 16711680;
+
+} // namespace
+
CStretchEngine::CWeightTable::CWeightTable()
: m_DestMin(0),
m_ItemSize(0),
- m_pWeightTables(nullptr),
m_dwWeightTablesSize(0) {}
-CStretchEngine::CWeightTable::~CWeightTable() {
- FX_Free(m_pWeightTables);
-}
+CStretchEngine::CWeightTable::~CWeightTable() {}
size_t CStretchEngine::CWeightTable::GetPixelWeightSize() const {
return m_ItemSize / sizeof(int) - 2;
@@ -32,64 +38,59 @@
int src_min,
int src_max,
int flags) {
- FX_Free(m_pWeightTables);
- m_pWeightTables = nullptr;
+ m_WeightTables.clear();
m_dwWeightTablesSize = 0;
- const double scale = (float)src_len / (float)dest_len;
- const double base = dest_len < 0 ? (float)(src_len) : 0;
+ const double scale = static_cast<float>(src_len) / dest_len;
+ const double base = dest_len < 0 ? src_len : 0;
const int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
- m_ItemSize = sizeof(int) * 2 +
- (int)(sizeof(int) * (ceil(fabs((float)scale)) + ext_size));
+ m_ItemSize =
+ sizeof(int) * 2 +
+ static_cast<int>(sizeof(int) *
+ (ceil(fabs(static_cast<float>(scale))) + ext_size));
+
m_DestMin = dest_min;
- if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize)
+ if (dest_max - dest_min > static_cast<int>((1U << 30) - 4) / m_ItemSize)
return false;
m_dwWeightTablesSize = (dest_max - dest_min) * m_ItemSize + 4;
- m_pWeightTables = FX_TryAlloc(uint8_t, m_dwWeightTablesSize);
- if (!m_pWeightTables)
- return false;
-
- if ((flags & FXDIB_NOSMOOTH) != 0 || fabs((float)scale) < 1.0f) {
- for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) {
+ m_WeightTables.resize(m_dwWeightTablesSize);
+ if ((flags & FXDIB_NOSMOOTH) != 0 || fabs(static_cast<float>(scale)) < 1.0f) {
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; ++dest_pixel) {
PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
double src_pos = dest_pixel * scale + scale / 2 + base;
if (flags & FXDIB_INTERPOL) {
- pixel_weights.m_SrcStart = (int)floor((float)src_pos - 1.0f / 2);
- pixel_weights.m_SrcEnd = (int)floor((float)src_pos + 1.0f / 2);
- if (pixel_weights.m_SrcStart < src_min) {
- pixel_weights.m_SrcStart = src_min;
- }
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
+ pixel_weights.m_SrcStart =
+ static_cast<int>(floor(static_cast<float>(src_pos) - 1.0f / 2));
+ pixel_weights.m_SrcEnd =
+ static_cast<int>(floor(static_cast<float>(src_pos) + 1.0f / 2));
+ pixel_weights.m_SrcStart = std::max(pixel_weights.m_SrcStart, src_min);
+ pixel_weights.m_SrcEnd = std::min(pixel_weights.m_SrcEnd, src_max - 1);
if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
pixel_weights.m_Weights[0] = 65536;
} else {
- pixel_weights.m_Weights[1] = FXSYS_round(
- (float)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
+ pixel_weights.m_Weights[1] =
+ FXSYS_round(static_cast<float>(
+ src_pos - pixel_weights.m_SrcStart - 1.0f / 2) *
+ 65536);
pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
}
} else if (flags & FXDIB_BICUBIC_INTERPOL) {
- pixel_weights.m_SrcStart = (int)floor((float)src_pos - 1.0f / 2);
- pixel_weights.m_SrcEnd = (int)floor((float)src_pos + 1.0f / 2);
+ pixel_weights.m_SrcStart =
+ static_cast<int>(floor(static_cast<float>(src_pos) - 1.0f / 2));
+ pixel_weights.m_SrcEnd =
+ static_cast<int>(floor(static_cast<float>(src_pos) + 1.0f / 2));
int start = pixel_weights.m_SrcStart - 1;
int end = pixel_weights.m_SrcEnd + 1;
- if (start < src_min) {
- start = src_min;
- }
- if (end >= src_max) {
- end = src_max - 1;
- }
+ start = std::max(start, src_min);
+ end = std::min(end, src_max - 1);
if (pixel_weights.m_SrcStart < src_min) {
src_pos += src_min - pixel_weights.m_SrcStart;
pixel_weights.m_SrcStart = src_min;
}
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
- int weight;
- weight = FXSYS_round(
- (float)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
+ pixel_weights.m_SrcEnd = std::min(pixel_weights.m_SrcEnd, src_max - 1);
+ int weight = FXSYS_round(
+ static_cast<float>(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) *
+ 256);
if (start == end) {
pixel_weights.m_Weights[0] =
(SDP_Table[256 + weight] + SDP_Table[weight] +
@@ -153,70 +154,48 @@
pixel_weights.m_SrcEnd = end;
}
} else {
- pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd =
- (int)floor((float)src_pos);
- if (pixel_weights.m_SrcStart < src_min) {
- pixel_weights.m_SrcStart = src_min;
- }
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
+ int pixel_pos = static_cast<int>(floor(static_cast<float>(src_pos)));
+ pixel_weights.m_SrcStart = std::max(pixel_pos, src_min);
+ pixel_weights.m_SrcEnd = std::min(pixel_pos, src_max - 1);
pixel_weights.m_Weights[0] = 65536;
}
}
return true;
}
- for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) {
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; ++dest_pixel) {
PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
double src_start = dest_pixel * scale + base;
double src_end = src_start + scale;
- int start_i, end_i;
- if (src_start < src_end) {
- start_i = (int)floor((float)src_start);
- end_i = (int)ceil((float)src_end);
- } else {
- start_i = (int)floor((float)src_end);
- end_i = (int)ceil((float)src_start);
- }
- if (start_i < src_min) {
- start_i = src_min;
- }
- if (end_i >= src_max) {
- end_i = src_max - 1;
- }
+ int start_i = floor(std::min(src_start, src_end));
+ int end_i = floor(std::max(src_start, src_end));
+ start_i = std::max(start_i, src_min);
+ end_i = std::min(end_i, src_max - 1);
if (start_i > end_i) {
- if (start_i >= src_max) {
- start_i = src_max - 1;
- }
+ start_i = std::min(start_i, src_max - 1);
pixel_weights.m_SrcStart = start_i;
pixel_weights.m_SrcEnd = start_i;
continue;
}
pixel_weights.m_SrcStart = start_i;
pixel_weights.m_SrcEnd = end_i;
- for (int j = start_i; j <= end_i; j++) {
- double dest_start = ((float)j - base) / scale;
- double dest_end = ((float)(j + 1) - base) / scale;
- if (dest_start > dest_end) {
- double temp = dest_start;
- dest_start = dest_end;
- dest_end = temp;
- }
- double area_start =
- dest_start > (float)(dest_pixel) ? dest_start : (float)(dest_pixel);
- double area_end = dest_end > (float)(dest_pixel + 1)
- ? (float)(dest_pixel + 1)
- : dest_end;
- double weight = area_start >= area_end ? 0.0f : area_end - area_start;
+ for (int j = start_i; j <= end_i; ++j) {
+ double dest_start = (j - base) / scale;
+ double dest_end = (j + 1 - base) / scale;
+ if (dest_start > dest_end)
+ std::swap(dest_start, dest_end);
+ double area_start = std::max(dest_start, static_cast<double>(dest_pixel));
+ double area_end = std::min(dest_end, static_cast<double>(dest_pixel + 1));
+ double weight = std::max(0.0, area_end - area_start);
if (weight == 0 && j == end_i) {
- pixel_weights.m_SrcEnd--;
+ --pixel_weights.m_SrcEnd;
break;
}
size_t idx = j - start_i;
if (idx >= GetPixelWeightSize())
return false;
- pixel_weights.m_Weights[idx] = FXSYS_round((float)(weight * 65536));
+
+ pixel_weights.m_Weights[idx] = FXSYS_round(weight * 65536);
}
}
return true;
@@ -224,8 +203,8 @@
PixelWeight* CStretchEngine::CWeightTable::GetPixelWeight(int pixel) const {
ASSERT(pixel >= m_DestMin);
- return reinterpret_cast<PixelWeight*>(m_pWeightTables +
- (pixel - m_DestMin) * m_ItemSize);
+ return reinterpret_cast<PixelWeight*>(const_cast<uint8_t*>(
+ m_WeightTables.data() + (pixel - m_DestMin) * m_ItemSize));
}
int* CStretchEngine::CWeightTable::GetValueFromPixelWeight(PixelWeight* pWeight,
@@ -253,30 +232,22 @@
m_pDestBitmap = pDestBitmap;
m_DestWidth = dest_width;
m_DestHeight = dest_height;
- m_pInterBuf = nullptr;
- m_pExtraAlphaBuf = nullptr;
- m_pDestMaskScanline = nullptr;
m_DestClip = clip_rect;
uint32_t size = clip_rect.Width();
- if (size && m_DestBpp > (int)(INT_MAX / size)) {
+ if (size && m_DestBpp > static_cast<int>(INT_MAX / size))
return;
- }
+
size *= m_DestBpp;
- if (size > INT_MAX - 31) {
+ if (size > INT_MAX - 31)
return;
- }
+
size += 31;
size = size / 32 * 4;
- m_pDestScanline = FX_TryAlloc(uint8_t, size);
- if (!m_pDestScanline) {
- return;
- }
- if (dest_format == FXDIB_Rgb32) {
- memset(m_pDestScanline, 255, size);
- }
+ m_DestScanline.resize(size);
+ if (dest_format == FXDIB_Rgb32)
+ std::fill(m_DestScanline.begin(), m_DestScanline.end(), 255);
m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
- m_pInterBuf = nullptr;
m_pSource = pSrcBitmap;
m_SrcWidth = pSrcBitmap->GetWidth();
m_SrcHeight = pSrcBitmap->GetHeight();
@@ -291,69 +262,53 @@
m_Flags = flags;
} else {
m_Flags = FXDIB_NOSMOOTH;
- if (flags & FXDIB_DOWNSAMPLE) {
+ if (flags & FXDIB_DOWNSAMPLE)
m_Flags |= FXDIB_DOWNSAMPLE;
- }
}
- double scale_x = (float)m_SrcWidth / (float)m_DestWidth;
- double scale_y = (float)m_SrcHeight / (float)m_DestHeight;
- double base_x = m_DestWidth > 0 ? 0.0f : (float)(m_DestWidth);
- double base_y = m_DestHeight > 0 ? 0.0f : (float)(m_DestHeight);
- double src_left = scale_x * ((float)(clip_rect.left) + base_x);
- double src_right = scale_x * ((float)(clip_rect.right) + base_x);
- double src_top = scale_y * ((float)(clip_rect.top) + base_y);
- double src_bottom = scale_y * ((float)(clip_rect.bottom) + base_y);
- if (src_left > src_right) {
- double temp = src_left;
- src_left = src_right;
- src_right = temp;
- }
- if (src_top > src_bottom) {
- double temp = src_top;
- src_top = src_bottom;
- src_bottom = temp;
- }
- m_SrcClip.left = (int)floor((float)src_left);
- m_SrcClip.right = (int)ceil((float)src_right);
- m_SrcClip.top = (int)floor((float)src_top);
- m_SrcClip.bottom = (int)ceil((float)src_bottom);
+ double scale_x = static_cast<float>(m_SrcWidth) / m_DestWidth;
+ double scale_y = static_cast<float>(m_SrcHeight) / m_DestHeight;
+ double base_x = m_DestWidth > 0 ? 0.0f : m_DestWidth;
+ double base_y = m_DestHeight > 0 ? 0.0f : m_DestHeight;
+ double src_left = scale_x * (clip_rect.left + base_x);
+ double src_right = scale_x * (clip_rect.right + base_x);
+ double src_top = scale_y * (clip_rect.top + base_y);
+ double src_bottom = scale_y * (clip_rect.bottom + base_y);
+ if (src_left > src_right)
+ std::swap(src_left, src_right);
+ if (src_top > src_bottom)
+ std::swap(src_top, src_bottom);
+ m_SrcClip.left = static_cast<int>(floor(src_left));
+ m_SrcClip.right = static_cast<int>(ceil(src_right));
+ m_SrcClip.top = static_cast<int>(floor(src_top));
+ m_SrcClip.bottom = static_cast<int>(ceil(src_bottom));
FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
m_SrcClip.Intersect(src_rect);
if (m_SrcBpp == 1) {
- if (m_DestBpp == 8) {
+ if (m_DestBpp == 8)
m_TransMethod = 1;
- } else {
+ else
m_TransMethod = 2;
- }
} else if (m_SrcBpp == 8) {
if (m_DestBpp == 8) {
- if (!m_bHasAlpha) {
+ if (!m_bHasAlpha)
m_TransMethod = 3;
- } else {
+ else
m_TransMethod = 4;
- }
} else {
- if (!m_bHasAlpha) {
+ if (!m_bHasAlpha)
m_TransMethod = 5;
- } else {
+ else
m_TransMethod = 6;
- }
}
} else {
- if (!m_bHasAlpha) {
+ if (!m_bHasAlpha)
m_TransMethod = 7;
- } else {
+ else
m_TransMethod = 8;
- }
}
}
-CStretchEngine::~CStretchEngine() {
- FX_Free(m_pDestScanline);
- FX_Free(m_pInterBuf);
- FX_Free(m_pExtraAlphaBuf);
- FX_Free(m_pDestMaskScanline);
-}
+CStretchEngine::~CStretchEngine() {}
bool CStretchEngine::Continue(IFX_Pause* pPause) {
while (m_State == 1) {
@@ -367,7 +322,7 @@
}
bool CStretchEngine::StartStretchHorz() {
- if (m_DestWidth == 0 || m_InterPitch == 0 || !m_pDestScanline)
+ if (m_DestWidth == 0 || m_InterPitch == 0 || m_DestScanline.empty())
return false;
if (m_SrcClip.Height() == 0 ||
@@ -375,17 +330,11 @@
return false;
}
- m_pInterBuf = FX_TryAlloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
- if (!m_pInterBuf)
- return false;
-
+ m_InterBuf.resize(m_SrcClip.Height() * m_InterPitch);
if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
- m_pExtraAlphaBuf =
- FX_Alloc2D(unsigned char, m_SrcClip.Height(), m_ExtraMaskPitch);
+ m_ExtraAlphaBuf.resize(m_SrcClip.Height(), m_ExtraMaskPitch);
uint32_t size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
- m_pDestMaskScanline = FX_TryAlloc(unsigned char, size);
- if (!m_pDestMaskScanline)
- return false;
+ m_DestMaskScanline.resize(size);
}
bool ret =
m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right,
@@ -407,7 +356,7 @@
int Bpp = m_DestBpp / 8;
static const int kStrechPauseRows = 10;
int rows_to_go = kStrechPauseRows;
- for (; m_CurRow < m_SrcClip.bottom; m_CurRow++) {
+ for (; m_CurRow < m_SrcClip.bottom; ++m_CurRow) {
if (rows_to_go == 0) {
if (pPause && pPause->NeedToPauseNow())
return true;
@@ -417,68 +366,61 @@
const uint8_t* src_scan = m_pSource->GetScanline(m_CurRow);
uint8_t* dest_scan =
- m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+ m_InterBuf.data() + (m_CurRow - m_SrcClip.top) * m_InterPitch;
const uint8_t* src_scan_mask = nullptr;
uint8_t* dest_scan_mask = nullptr;
- if (m_pExtraAlphaBuf) {
+ if (!m_ExtraAlphaBuf.empty()) {
src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
- dest_scan_mask =
- m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
+ dest_scan_mask = m_ExtraAlphaBuf.data() +
+ (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
}
+ // TODO(npm): reduce duplicated code here
switch (m_TransMethod) {
case 1:
case 2: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
int pixel_weight = *pWeight;
- if (src_scan[j / 8] & (1 << (7 - j % 8))) {
+ if (src_scan[j / 8] & (1 << (7 - j % 8)))
dest_a += pixel_weight * 255;
- }
}
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan++ = (uint8_t)(dest_a >> 16);
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+ dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+ *dest_scan++ = static_cast<uint8_t>(dest_a >> 16);
}
break;
}
case 3: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
int pixel_weight = *pWeight;
dest_a += pixel_weight * src_scan[j];
}
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan++ = (uint8_t)(dest_a >> 16);
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+ dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+ *dest_scan++ = static_cast<uint8_t>(dest_a >> 16);
}
break;
}
case 4: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ int dest_r = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
@@ -488,59 +430,57 @@
dest_a += pixel_weight;
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ dest_r = pdfium::clamp(dest_r, 0, kMaxDestValue);
+ dest_a = pdfium::clamp(dest_a, 0, 65536);
}
- *dest_scan++ = (uint8_t)(dest_r >> 16);
- *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_r >> 16);
+ *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
}
break;
}
case 5: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
int pixel_weight = *pWeight;
unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
if (m_DestFormat == FXDIB_Rgb) {
- dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16);
- dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8);
- dest_b_c += pixel_weight * (uint8_t)argb_cmyk;
+ dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk);
} else {
- dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24);
- dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16);
- dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
}
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
}
- *dest_scan++ = (uint8_t)(dest_b_c >> 16);
- *dest_scan++ = (uint8_t)(dest_g_m >> 16);
- *dest_scan++ = (uint8_t)(dest_r_y >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_b_c >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_g_m >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_r_y >> 16);
}
break;
}
case 6: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
@@ -548,40 +488,37 @@
pixel_weight = pixel_weight * src_scan_mask[j] / 255;
unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
if (m_DestFormat == FXDIB_Rgba) {
- dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16);
- dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8);
- dest_b_c += pixel_weight * (uint8_t)argb_cmyk;
+ dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk);
} else {
- dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24);
- dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16);
- dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * static_cast<uint8_t>(argb_cmyk >> 8);
}
dest_a += pixel_weight;
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+ dest_a = pdfium::clamp(dest_a, 0, 65536);
}
- *dest_scan++ = (uint8_t)(dest_b_c >> 16);
- *dest_scan++ = (uint8_t)(dest_g_m >> 16);
- *dest_scan++ = (uint8_t)(dest_r_y >> 16);
- *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_b_c >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_g_m >> 16);
+ *dest_scan++ = static_cast<uint8_t>(dest_r_y >> 16);
+ *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
}
break;
}
case 7: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
@@ -592,28 +529,26 @@
dest_r_y += pixel_weight * (*src_pixel);
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
}
- *dest_scan++ = (uint8_t)((dest_b_c) >> 16);
- *dest_scan++ = (uint8_t)((dest_g_m) >> 16);
- *dest_scan++ = (uint8_t)((dest_r_y) >> 16);
+ *dest_scan++ = static_cast<uint8_t>((dest_b_c) >> 16);
+ *dest_scan++ = static_cast<uint8_t>((dest_g_m) >> 16);
+ *dest_scan++ = static_cast<uint8_t>((dest_r_y) >> 16);
dest_scan += Bpp - 3;
}
break;
}
case 8: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight =
- m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
+ PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = m_WeightTable.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return false;
@@ -630,23 +565,18 @@
dest_a += pixel_weight;
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+ dest_a = pdfium::clamp(dest_a, 0, 65536);
}
- *dest_scan++ = (uint8_t)((dest_b_c) >> 16);
- *dest_scan++ = (uint8_t)((dest_g_m) >> 16);
- *dest_scan++ = (uint8_t)((dest_r_y) >> 16);
- if (m_DestFormat == FXDIB_Argb) {
- *dest_scan = (uint8_t)((dest_a * 255) >> 16);
- }
- if (dest_scan_mask) {
- *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16);
- }
+ *dest_scan++ = static_cast<uint8_t>((dest_b_c) >> 16);
+ *dest_scan++ = static_cast<uint8_t>((dest_g_m) >> 16);
+ *dest_scan++ = static_cast<uint8_t>((dest_r_y) >> 16);
+ if (m_DestFormat == FXDIB_Argb)
+ *dest_scan = static_cast<uint8_t>((dest_a * 255) >> 16);
+ if (dest_scan_mask)
+ *dest_scan_mask++ = static_cast<uint8_t>((dest_a * 255) >> 16);
dest_scan += Bpp - 3;
}
break;
@@ -668,21 +598,20 @@
return;
const int DestBpp = m_DestBpp / 8;
- for (int row = m_DestClip.top; row < m_DestClip.bottom; row++) {
- unsigned char* dest_scan = m_pDestScanline;
- unsigned char* dest_scan_mask = m_pDestMaskScanline;
- PixelWeight* pPixelWeights = table.GetPixelWeight(row);
+ for (int row = m_DestClip.top; row < m_DestClip.bottom; ++row) {
+ unsigned char* dest_scan = m_DestScanline.data();
+ unsigned char* dest_scan_mask = m_DestMaskScanline.data();
+ PixelWeight* pWeights = table.GetPixelWeight(row);
switch (m_TransMethod) {
case 1:
case 2:
case 3: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
unsigned char* src_scan =
- m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return;
@@ -690,24 +619,23 @@
dest_a +=
pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
}
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan = (uint8_t)(dest_a >> 16);
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL)
+ dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
+ *dest_scan = static_cast<uint8_t>(dest_a >> 16);
dest_scan += DestBpp;
}
break;
}
case 4: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
unsigned char* src_scan =
- m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
unsigned char* src_scan_mask =
- m_pExtraAlphaBuf + (col - m_DestClip.left);
- int dest_a = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+ m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
+ int dest_a = 0;
+ int dest_k = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return;
@@ -718,24 +646,25 @@
src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ dest_k = pdfium::clamp(dest_k, 0, kMaxDestValue);
+ dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
}
- *dest_scan = (uint8_t)(dest_k >> 16);
+ *dest_scan = static_cast<uint8_t>(dest_k >> 16);
dest_scan += DestBpp;
- *dest_scan_mask++ = (uint8_t)(dest_a >> 16);
+ *dest_scan_mask++ = static_cast<uint8_t>(dest_a >> 16);
}
break;
}
case 5:
case 7: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
unsigned char* src_scan =
- m_pInterBuf + (col - m_DestClip.left) * DestBpp;
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+ m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return;
@@ -747,33 +676,31 @@
dest_r_y += pixel_weight * (*src_pixel);
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
}
- dest_scan[0] = (uint8_t)((dest_b_c) >> 16);
- dest_scan[1] = (uint8_t)((dest_g_m) >> 16);
- dest_scan[2] = (uint8_t)((dest_r_y) >> 16);
+ dest_scan[0] = static_cast<uint8_t>((dest_b_c) >> 16);
+ dest_scan[1] = static_cast<uint8_t>((dest_g_m) >> 16);
+ dest_scan[2] = static_cast<uint8_t>((dest_r_y) >> 16);
dest_scan += DestBpp;
}
break;
}
case 6:
case 8: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col++) {
+ for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
unsigned char* src_scan =
- m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
unsigned char* src_scan_mask = nullptr;
- if (m_DestFormat != FXDIB_Argb) {
- src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
- }
- int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd;
- j++) {
- int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j);
+ if (m_DestFormat != FXDIB_Argb)
+ src_scan_mask = m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
+ int dest_a = 0;
+ int dest_r_y = 0;
+ int dest_g_m = 0;
+ int dest_b_c = 0;
+ for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
+ int* pWeight = table.GetValueFromPixelWeight(pWeights, j);
if (!pWeight)
return;
@@ -781,49 +708,42 @@
const uint8_t* src_pixel =
src_scan + (j - m_SrcClip.top) * m_InterPitch;
int mask_v = 255;
- if (src_scan_mask) {
+ if (src_scan_mask)
mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
- }
dest_b_c += pixel_weight * (*src_pixel++);
dest_g_m += pixel_weight * (*src_pixel++);
dest_r_y += pixel_weight * (*src_pixel);
- if (m_DestFormat == FXDIB_Argb) {
+ if (m_DestFormat == FXDIB_Argb)
dest_a += pixel_weight * (*(src_pixel + 1));
- } else {
+ else
dest_a += pixel_weight * mask_v;
- }
}
if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y =
- dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m =
- dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c =
- dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ dest_r_y = pdfium::clamp(dest_r_y, 0, kMaxDestValue);
+ dest_g_m = pdfium::clamp(dest_g_m, 0, kMaxDestValue);
+ dest_b_c = pdfium::clamp(dest_b_c, 0, kMaxDestValue);
+ dest_a = pdfium::clamp(dest_a, 0, kMaxDestValue);
}
if (dest_a) {
- int r = ((uint32_t)dest_r_y) * 255 / dest_a;
- int g = ((uint32_t)dest_g_m) * 255 / dest_a;
- int b = ((uint32_t)dest_b_c) * 255 / dest_a;
- dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
- dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
- dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
+ int r = static_cast<uint32_t>(dest_r_y) * 255 / dest_a;
+ int g = static_cast<uint32_t>(dest_g_m) * 255 / dest_a;
+ int b = static_cast<uint32_t>(dest_b_c) * 255 / dest_a;
+ dest_scan[0] = pdfium::clamp(b, 0, 255);
+ dest_scan[1] = pdfium::clamp(g, 0, 255);
+ dest_scan[2] = pdfium::clamp(r, 0, 255);
}
- if (m_DestFormat == FXDIB_Argb) {
- dest_scan[3] = (uint8_t)((dest_a) >> 16);
- } else {
- *dest_scan_mask = (uint8_t)((dest_a) >> 16);
- }
+ if (m_DestFormat == FXDIB_Argb)
+ dest_scan[3] = static_cast<uint8_t>((dest_a) >> 16);
+ else
+ *dest_scan_mask = static_cast<uint8_t>((dest_a) >> 16);
dest_scan += DestBpp;
- if (dest_scan_mask) {
+ if (dest_scan_mask)
dest_scan_mask++;
- }
}
break;
}
}
- m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline,
- m_pDestMaskScanline);
+ m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_DestScanline.data(),
+ m_DestMaskScanline.data());
}
}
diff --git a/core/fxge/dib/cstretchengine.h b/core/fxge/dib/cstretchengine.h
index 0d9457f..280641c 100644
--- a/core/fxge/dib/cstretchengine.h
+++ b/core/fxge/dib/cstretchengine.h
@@ -7,6 +7,8 @@
#ifndef CORE_FXGE_DIB_CSTRETCHENGINE_H_
#define CORE_FXGE_DIB_CSTRETCHENGINE_H_
+#include <vector>
+
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxge/fx_dib.h"
@@ -48,7 +50,7 @@
private:
int m_DestMin;
int m_ItemSize;
- uint8_t* m_pWeightTables;
+ std::vector<uint8_t> m_WeightTables;
size_t m_dwWeightTablesSize;
};
@@ -57,10 +59,11 @@
int m_SrcBpp;
int m_bHasAlpha;
IFX_ScanlineComposer* m_pDestBitmap;
- int m_DestWidth, m_DestHeight;
+ int m_DestWidth;
+ int m_DestHeight;
FX_RECT m_DestClip;
- uint8_t* m_pDestScanline;
- uint8_t* m_pDestMaskScanline;
+ std::vector<uint8_t> m_DestScanline;
+ std::vector<uint8_t> m_DestMaskScanline;
FX_RECT m_SrcClip;
CFX_RetainPtr<CFX_DIBSource> m_pSource;
uint32_t* m_pSrcPalette;
@@ -69,8 +72,8 @@
int m_SrcPitch;
int m_InterPitch;
int m_ExtraMaskPitch;
- uint8_t* m_pInterBuf;
- uint8_t* m_pExtraAlphaBuf;
+ std::vector<uint8_t> m_InterBuf;
+ std::vector<uint8_t> m_ExtraAlphaBuf;
int m_TransMethod;
int m_Flags;
CWeightTable m_WeightTable;
To view, visit change 4970. To unsubscribe, visit settings.