summaryrefslogtreecommitdiff
path: root/core/fxge
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxge')
-rw-r--r--core/fxge/dib/cfx_imagetransformer.cpp223
-rw-r--r--core/fxge/dib/cfx_imagetransformer.h1
2 files changed, 115 insertions, 109 deletions
diff --git a/core/fxge/dib/cfx_imagetransformer.cpp b/core/fxge/dib/cfx_imagetransformer.cpp
index 7d42e1ec48..00ac0e3032 100644
--- a/core/fxge/dib/cfx_imagetransformer.cpp
+++ b/core/fxge/dib/cfx_imagetransformer.cpp
@@ -295,120 +295,16 @@ bool CFX_ImageTransformer::Continue(IFX_PauseIndicator* pPause) {
};
CalcMask(cdata);
}
+
+ CalcData cdata = {pTransformed.Get(), result2stretch,
+ m_Storer.GetBitmap()->GetBuffer(),
+ m_Storer.GetBitmap()->GetPitch()};
if (m_Storer.GetBitmap()->IsAlphaMask()) {
- CalcData cdata = {pTransformed.Get(), result2stretch,
- m_Storer.GetBitmap()->GetBuffer(),
- m_Storer.GetBitmap()->GetPitch()};
CalcAlpha(cdata);
} else {
int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;
if (Bpp == 1) {
- uint32_t argb[256];
- FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
- if (pPal) {
- for (int i = 0; i < 256; i++) {
- argb[i] = pPal[i];
- }
- } else {
- if (m_Storer.GetBitmap()->IsCmykImage()) {
- for (int i = 0; i < 256; i++) {
- argb[i] = 255 - i;
- }
- } else {
- for (int i = 0; i < 256; i++) {
- argb[i] = 0xff000000 | (i * 0x010101);
- }
- }
- }
- int destBpp = pTransformed->GetBPP() / 8;
- if (IsBilinear()) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_result.Height(); row++) {
- uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_result.Width(); col++) {
- int src_col_l = 0;
- int src_row_l = 0;
- int res_x = 0;
- int res_y = 0;
- result2stretch_fix.Transform(col, row, &src_col_l, &src_row_l,
- &res_x, &res_y);
- if (InStretchBounds(src_col_l, src_row_l)) {
- AdjustCoords(&src_col_l, &src_row_l);
- int src_col_r = src_col_l + 1;
- int src_row_r = src_row_l + 1;
- AdjustCoords(&src_col_r, &src_row_r);
- int row_offset_l = src_row_l * stretch_pitch;
- int row_offset_r = src_row_r * stretch_pitch;
- uint32_t r_bgra_cmyk = argb[bilinear_interpol(
- stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r,
- res_x, res_y, 1, 0)];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
- dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
- dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
- } else {
- *(uint32_t*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- } else if (IsBiCubic()) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_result.Height(); row++) {
- uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_result.Width(); col++) {
- int src_col_l = 0;
- int src_row_l = 0;
- int res_x = 0;
- int res_y = 0;
- result2stretch_fix.Transform(col, row, &src_col_l, &src_row_l,
- &res_x, &res_y);
- if (InStretchBounds(src_col_l, src_row_l)) {
- int pos_pixel[8];
- int u_w[4], v_w[4];
- AdjustCoords(&src_col_l, &src_row_l);
- bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l,
- res_x, res_y, stretch_width,
- stretch_height);
- uint32_t r_bgra_cmyk =
- argb[bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel,
- u_w, v_w, res_x, res_y, 1, 0)];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
- dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
- dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
- } else {
- *(uint32_t*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- } else {
- CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_result.Height(); row++) {
- uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_result.Width(); col++) {
- int src_col = 0;
- int src_row = 0;
- result2stretch_fix.Transform(col, row, &src_col, &src_row);
- if (InStretchBounds(src_col, src_row)) {
- AdjustCoords(&src_col, &src_row);
- uint32_t r_bgra_cmyk =
- argb[stretch_buf[src_row * stretch_pitch + src_col]];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
- dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
- dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
- } else {
- *(uint32_t*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- }
+ CalcMono(cdata, transformF);
} else {
bool bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
int destBpp = pTransformed->GetBPP() / 8;
@@ -738,6 +634,115 @@ void CFX_ImageTransformer::CalcAlpha(const CalcData& cdata) {
}
}
+void CFX_ImageTransformer::CalcMono(const CalcData& cdata,
+ FXDIB_Format format) {
+ uint32_t argb[256];
+ FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
+ if (pPal) {
+ for (int i = 0; i < 256; i++) {
+ argb[i] = pPal[i];
+ }
+ } else {
+ if (m_Storer.GetBitmap()->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ argb[i] = 255 - i;
+ }
+ } else {
+ for (int i = 0; i < 256; i++) {
+ argb[i] = 0xff000000 | (i * 0x010101);
+ }
+ }
+ }
+ int destBpp = cdata.bitmap->GetBPP() / 8;
+ if (IsBilinear()) {
+ CFX_BilinearMatrix result2stretch_fix(cdata.matrix, 8);
+ for (int row = 0; row < m_result.Height(); row++) {
+ uint8_t* dest_pos = (uint8_t*)cdata.bitmap->GetScanline(row);
+ for (int col = 0; col < m_result.Width(); col++) {
+ int src_col_l = 0;
+ int src_row_l = 0;
+ int res_x = 0;
+ int res_y = 0;
+ result2stretch_fix.Transform(col, row, &src_col_l, &src_row_l, &res_x,
+ &res_y);
+ if (InStretchBounds(src_col_l, src_row_l)) {
+ AdjustCoords(&src_col_l, &src_row_l);
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ AdjustCoords(&src_col_r, &src_row_r);
+ int row_offset_l = src_row_l * cdata.pitch;
+ int row_offset_r = src_row_r * cdata.pitch;
+ uint32_t r_bgra_cmyk =
+ argb[bilinear_interpol(cdata.buf, row_offset_l, row_offset_r,
+ src_col_l, src_col_r, res_x, res_y, 1, 0)];
+ if (format == FXDIB_Rgba) {
+ dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
+ } else {
+ *(uint32_t*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (IsBiCubic()) {
+ CFX_BilinearMatrix result2stretch_fix(cdata.matrix, 8);
+ for (int row = 0; row < m_result.Height(); row++) {
+ uint8_t* dest_pos = (uint8_t*)cdata.bitmap->GetScanline(row);
+ for (int col = 0; col < m_result.Width(); col++) {
+ int src_col_l = 0;
+ int src_row_l = 0;
+ int res_x = 0;
+ int res_y = 0;
+ result2stretch_fix.Transform(col, row, &src_col_l, &src_row_l, &res_x,
+ &res_y);
+ if (InStretchBounds(src_col_l, src_row_l)) {
+ int pos_pixel[8];
+ int u_w[4], v_w[4];
+ AdjustCoords(&src_col_l, &src_row_l);
+ bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l,
+ res_x, res_y, stretch_width(),
+ stretch_height());
+ uint32_t r_bgra_cmyk = argb[bicubic_interpol(
+ cdata.buf, cdata.pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];
+ if (format == FXDIB_Rgba) {
+ dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
+ } else {
+ *(uint32_t*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(cdata.matrix, 8);
+ for (int row = 0; row < m_result.Height(); row++) {
+ uint8_t* dest_pos = (uint8_t*)cdata.bitmap->GetScanline(row);
+ for (int col = 0; col < m_result.Width(); col++) {
+ int src_col = 0;
+ int src_row = 0;
+ result2stretch_fix.Transform(col, row, &src_col, &src_row);
+ if (InStretchBounds(src_col, src_row)) {
+ AdjustCoords(&src_col, &src_row);
+ uint32_t r_bgra_cmyk =
+ argb[cdata.buf[src_row * cdata.pitch + src_col]];
+ if (format == FXDIB_Rgba) {
+ dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8);
+ } else {
+ *(uint32_t*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+}
+
void CFX_ImageTransformer::AdjustCoords(int* col, int* row) const {
int& src_col = *col;
int& src_row = *row;
diff --git a/core/fxge/dib/cfx_imagetransformer.h b/core/fxge/dib/cfx_imagetransformer.h
index 4e13f62d6c..2d7993ec5c 100644
--- a/core/fxge/dib/cfx_imagetransformer.h
+++ b/core/fxge/dib/cfx_imagetransformer.h
@@ -41,6 +41,7 @@ class CFX_ImageTransformer {
void CalcMask(const CalcData& cdata);
void CalcAlpha(const CalcData& cdata);
+ void CalcMono(const CalcData& cdata, FXDIB_Format format);
bool IsBilinear() const {
return !(m_Flags & FXDIB_DOWNSAMPLE) && !IsBiCubic();