// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../include/fxge/fx_dib.h"
#include "../../../include/fxge/fx_ge.h"
#include "dib_int.h"
#include <limits.h>
extern int SDP_Table[513];
void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)
{
    if (m_pWeightTables) {
        FX_Free(m_pWeightTables);
        m_pWeightTables = NULL;
    }
    double scale, base;
    scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));
    if (dest_len < 0) {
        base = (FX_FLOAT)(src_len);
    } else {
        base = 0;
    }
    int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
    m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));
    m_DestMin = dest_min;
    if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {
        return;
    }
    m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);
    if (m_pWeightTables == NULL) {
        return;
    }
    FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));
    if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_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)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_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;
                }
                if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
                    pixel_weights.m_Weights[0] = 65536;
                } else {
                    pixel_weights.m_Weights[1] = FXSYS_round((FX_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)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_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;
                }
                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((FX_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] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
                } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||
                            end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {
                    if (start < pixel_weights.m_SrcStart) {
                        pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
                        pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
                    } else {
                        if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;
                            pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;
                        } else {
                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
                            pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
                        }
                    }
                    if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
                        pixel_weights.m_SrcEnd = end;
                    }
                    if (start < pixel_weights.m_SrcStart) {
                        pixel_weights.m_SrcStart = start;
                    }
                } else if (start == pixel_weights.m_SrcStart &&
                           start < pixel_weights.m_SrcEnd &&
                           pixel_weights.m_SrcEnd < end) {
                    pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
                    pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;
                    pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;
                    pixel_weights.m_SrcEnd = end;
                } else if (start < pixel_weights.m_SrcStart &&
                           pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&
                           pixel_weights.m_SrcEnd == end) {
                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
                    pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
                    pixel_weights.m_SrcStart = start;
                } else {
                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
                    pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;
                    pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;
                    pixel_weights.m_SrcStart = start;
                    pixel_weights.m_SrcEnd = end;
                }
            } else {
                pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_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;
                }
                pixel_weights.m_Weights[0] = 65536;
            }
        }
        return;
    }
    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)FXSYS_floor((FX_FLOAT)src_start);
            end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);
        } else {
            start_i = (int)FXSYS_floor((FX_FLOAT)src_end);
            end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);
        }
        if (start_i < src_min) {
            start_i = src_min;
        }
        if (end_i >= src_max) {
            end_i = src_max - 1;
        }
        if (start_i > end_i) {
            if (start_i >= src_max) {
                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 = FXSYS_Div((FX_FLOAT)(j) - base, scale);
            double dest_end = FXSYS_Div((FX_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 > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);
            double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;
            double weight = area_start >= area_end ? 0.0f : area_end - area_start;
            if (weight == 0 && j == end_i) {
                pixel_weights.m_SrcEnd --;
                break;
            }
            pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));
        }
    }
}
CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
                               int dest_width, int dest_height, const FX_RECT& clip_rect,
                               const CFX_DIBSource* pSrcBitmap, int flags)
{
    m_State = 0;
    m_DestFormat = dest_format;
    m_DestBpp = dest_format & 0xff;
    m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;
    m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;
    m_pSrcPalette = pSrcBitmap->GetPalette();
    m_pDestBitmap = pDestBitmap;
    m_DestWidth = dest_width;
    m_DestHeight = dest_height;
    m_pInterBuf = NULL;
    m_pExtraAlphaBuf = NULL;
    m_pDestMaskScanline = NULL;
    m_DestClip = clip_rect;
    FX_DWORD size = clip_rect.Width();
    if (size && m_DestBpp > (int)(INT_MAX / size)) {
        return;
    }
    size *= m_DestBpp;
    if (size > INT_MAX - 31) {
        return;
    }
    size += 31;
    size = size / 32 * 4;
    m_pDestScanline = FX_AllocNL(FX_BYTE, size);
    if (m_pDestScanline == NULL) {
        return;
    }
    FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);
    if (dest_format == FXDIB_Rgb32) {
        FXSYS_memset8(m_pDestScanline, 255, size);
    }
    m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
    m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
    m_pInterBuf = NULL;
    m_pSource = pSrcBitmap;
    m_SrcWidth = pSrcBitmap->GetWidth();
    m_SrcHeight = pSrcBitmap->GetHeight();
    m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;
    if ((flags & FXDIB_NOSMOOTH) == 0) {
        FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;
        if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {
            flags = FXDIB_INTERPOL;
        }
        m_Flags = flags;
    } else {
        m_Flags = FXDIB_NOSMOOTH;
        if (flags & FXDIB_DOWNSAMPLE) {
            m_Flags |= FXDIB_DOWNSAMPLE;
        }
    }
    double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));
    double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));
    double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);
    double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);
    double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);
    double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);
    double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);
    double src_bottom = FXSYS_Mul(scale_y, (FX_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)FXSYS_floor((FX_FLOAT)src_left);
    m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);
    m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);
    m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)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) {
            m_TransMethod = 1;
        } else {
            m_TransMethod = 2;
        }
    } else if (m_SrcBpp == 8) {
        if (m_DestBpp == 8) {
            if (!m_bHasAlpha) {
                m_TransMethod = 3;
            } else {
                m_TransMethod = 4;
            }
        } else {
            if (!m_bHasAlpha) {
                m_TransMethod = 5;
            } else {
                m_TransMethod = 6;
            }
        }
    } else {
        if (!m_bHasAlpha) {
            m_TransMethod = 7;
        } else {
            m_TransMethod = 8;
        }
    }
}
FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)
{
    while (m_State == 1) {
        if (ContinueStretchHorz(pPause)) {
            return TRUE;
        }
        m_State = 2;
        StretchVert();
    }
    return FALSE;
}
CStretchEngine::~CStretchEngine()
{
    if (m_pDestScanline) {
        FX_Free(m_pDestScanline);
    }
    if (m_pInterBuf) {
        FX_Free(m_pInterBuf);
    }
    if (m_pExtraAlphaBuf) {
        FX_Free(m_pExtraAlphaBuf);
    }
    if (m_pDestMaskScanline) {
        FX_Free(m_pDestMaskScanline);
    }
}
FX_BOOL CStretchEngine::StartStretchHorz()
{
    if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
        return FALSE;
    }
#ifndef _FPDFAPI_MINI_
    m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
#else
    m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
#endif
    if (m_pInterBuf == NULL) {
        return FALSE;
    }
    if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
        m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);
        if (!m_pExtraAlphaBuf) {
            return FALSE;
        }
        FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
        m_pDestMaskScanline = FX_AllocNL(unsigned char, size);
        if (!m_pDestMaskScanline) {
            return FALSE;
        }
    }
    m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);
    if (m_WeightTable.m_pWeightTables == NULL) {
        return FALSE;
    }
    m_CurRow = m_SrcClip.top;
    m_State = 1;
    return TRUE;
}
#define FX_STRECH_PAUSE_ROWS	10
FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)
{
    if (!m_DestWidth) {
        return 0;
    }
    if (m_pSource->SkipToScanline(m_CurRow, pPause)) {
        return TRUE;
    }
    int Bpp = m_DestBpp / 8;
    int rows_to_go = FX_STRECH_PAUSE_ROWS;
    for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {
        if (rows_to_go == 0) {
            if (pPause && pPause->NeedToPauseNow()) {
                return TRUE;
            } else {
                rows_to_go = FX_STRECH_PAUSE_ROWS;
            }
        }
        FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);
        FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
        FX_LPCBYTE src_scan_mask = NULL;
        FX_LPBYTE dest_scan_mask = NULL;
        if (m_pExtraAlphaBuf) {
            src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
            dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
        }
        switch (m_TransMethod) {
            case 1:
            case 2: {
                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
                        int dest_a = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            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++ = (FX_BYTE)(dest_a >> 16);
                    }
                    break;
                }
            case 3: {
                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
                        int dest_a = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            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++ = (FX_BYTE)(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 pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            pixel_weight = pixel_weight * src_scan_mask[j] / 255;
                            dest_r += pixel_weight * src_scan[j];
                            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_scan++ = (FX_BYTE)(dest_r >> 16);
                        *dest_scan_mask++ = (FX_BYTE)((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, dest_k = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
                            if (m_DestFormat == FXDIB_Rgb) {
                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
                            } else {
                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
                                dest_r_y += pixel_weight * (FX_BYTE)(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_scan++ = (FX_BYTE)(dest_b_c >> 16);
                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
                        *dest_scan++ = (FX_BYTE)(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, dest_k = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            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 * (FX_BYTE)(argb_cmyk >> 16);
                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
                            } else {
                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
                            }
                            dest_a += pixel_weight;
                        }
                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
                            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
                            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_scan++ = (FX_BYTE)(dest_b_c >> 16);
                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
                        *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
                        *dest_scan_mask++ = (FX_BYTE)((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, dest_k = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;
                            dest_b_c += pixel_weight * (*src_pixel++);
                            dest_g_m += pixel_weight * (*src_pixel++);
                            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_scan++ = (FX_BYTE)((dest_b_c) >> 16);
                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
                        *dest_scan++ = (FX_BYTE)((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, dest_k = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;
                            if (m_DestFormat == FXDIB_Argb) {
                                pixel_weight = pixel_weight * src_pixel[3] / 255;
                            } else {
                                pixel_weight = pixel_weight * src_scan_mask[j] / 255;
                            }
                            dest_b_c += pixel_weight * (*src_pixel++);
                            dest_g_m += pixel_weight * (*src_pixel++);
                            dest_r_y += pixel_weight * (*src_pixel);
                            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_scan++ = (FX_BYTE)((dest_b_c) >> 16);
                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
                        *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
                        if (m_DestFormat == FXDIB_Argb) {
                            *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);
                        }
                        if (dest_scan_mask) {
                            *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
                        }
                        dest_scan += Bpp - 3;
                    }
                    break;
                }
        }
        rows_to_go --;
    }
    return FALSE;
}
void CStretchEngine::StretchVert()
{
    if (m_DestHeight == 0) {
        return;
    }
    CWeightTable table;
    table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);
    if (table.m_pWeightTables == NULL) {
        return;
    }
    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_sacn_mask = m_pDestMaskScanline;
        PixelWeight* pPixelWeights = table.GetPixelWeight(row);
        switch(m_TransMethod) {
            case 1:
            case 2:
            case 3: {
                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
                        int dest_a = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            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 = (FX_BYTE)(dest_a >> 16);
                        dest_scan += DestBpp;
                    }
                    break;
                }
            case 4: {
                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
                        unsigned char* src_scan = m_pInterBuf + (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 pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
                            dest_a += pixel_weight * 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_scan = (FX_BYTE)(dest_k >> 16);
                        dest_scan += DestBpp;
                        *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);
                    }
                    break;
                }
            case 5:
            case 7: {
                    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, dest_k = 0;
                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
                            dest_b_c += pixel_weight * (*src_pixel++);
                            dest_g_m += pixel_weight * (*src_pixel++);
                            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_scan[0] = (FX_BYTE)((dest_b_c) >> 16);
                        dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);
                        dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);
                        dest_scan += DestBpp;
                    }
                    break;
                }
            case 6:
            case 8: {
                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
                        unsigned char* src_scan_mask = NULL;
                        if (m_DestFormat != FXDIB_Argb) {
                            src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
                        }
                        int dest_a = 0, dest_k = 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 pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
                            int mask_v = 255;
                            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) {
                                dest_a += pixel_weight * (*(src_pixel + 1));
                            } 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;
                        }
                        if (dest_a) {
                            int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;
                            int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;
                            int b = ((FX_DWORD)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;
                        }
                        if (m_DestFormat == FXDIB_Argb) {
                            dest_scan[3] = (FX_BYTE)((dest_a) >> 16);
                        } else {
                            *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);
                        }
                        dest_scan += DestBpp;
                        if (dest_sacn_mask) {
                            dest_sacn_mask++;
                        }
                    }
                    break;
                }
        }
        m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);
    }
}
CFX_ImageStretcher::CFX_ImageStretcher()
{
    m_pScanline = NULL;
    m_pStretchEngine = NULL;
    m_pMaskScanline = NULL;
}
CFX_ImageStretcher::~CFX_ImageStretcher()
{
    if (m_pScanline) {
        FX_Free(m_pScanline);
    }
    if (m_pStretchEngine) {
        delete m_pStretchEngine;
    }
    if (m_pMaskScanline) {
        FX_Free(m_pMaskScanline);
    }
}
FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)
{
    FXDIB_Format format = pSrc->GetFormat();
    if (format == FXDIB_1bppMask) {
        format = FXDIB_8bppMask;
    } else if (format == FXDIB_1bppRgb) {
        format = FXDIB_8bppRgb;
    } else if (format == FXDIB_8bppRgb) {
        if (pSrc->GetPalette()) {
            format = FXDIB_Rgb;
        }
    }
    return format;
}
FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,
                                  const CFX_DIBSource* pSource, int dest_width, int dest_height,
                                  const FX_RECT& rect, FX_DWORD flags)
{
    m_DestFormat = _GetStretchedFormat(pSource);
    m_DestBPP = m_DestFormat & 0xff;
    m_pDest = pDest;
    m_pSource = pSource;
    m_DestWidth = dest_width;
    m_DestHeight = dest_height;
    m_ClipRect = rect;
    m_Flags = flags;
    if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {
        FX_ARGB pal[256];
        int a0, r0, g0, b0, a1, r1, g1, b1;
        ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);
        ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);
        for (int i = 0; i < 256; i ++) {
            int a = a0 + (a1 - a0) * i / 255;
            int r = r0 + (r1 - r0) * i / 255;
            int g = g0 + (g1 - g0) * i / 255;
            int b = b0 + (b1 - b0) * i / 255;
            pal[i] = ArgbEncode(a, r, g, b);
        }
        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
            return FALSE;
        }
    } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {
        FX_CMYK pal[256];
        int c0, m0, y0, k0, c1, m1, y1, k1;
        CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);
        CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);
        for (int i = 0; i < 256; i ++) {
            int c = c0 + (c1 - c0) * i / 255;
            int m = m0 + (m1 - m0) * i / 255;
            int y = y0 + (y1 - y0) * i / 255;
            int k = k0 + (k1 - k0) * i / 255;
            pal[i] = CmykEncode(c, m, y, k);
        }
        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
            return FALSE;
        }
    } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {
        return FALSE;
    }
    if (flags & FXDIB_DOWNSAMPLE) {
        return StartQuickStretch();
    } else {
        return StartStretch();
    }
}
FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)
{
    if (m_Flags & FXDIB_DOWNSAMPLE) {
        return ContinueQuickStretch(pPause);
    } else {
        return ContinueStretch(pPause);
    }
}
#ifndef _FPDFAPI_MINI_
#define MAX_PROGRESSIVE_STRETCH_PIXELS	1000000
#else
#define MAX_PROGRESSIVE_STRETCH_PIXELS	100000
#endif
FX_BOOL CFX_ImageStretcher::StartStretch()
{
    m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
    if (!m_pStretchEngine) {
        return FALSE;
    }
    m_pStretchEngine->StartStretchHorz();
    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
        m_pStretchEngine->Continue(NULL);
        return FALSE;
    }
    return TRUE;
}
FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)
{
    if (m_pStretchEngine == NULL) {
        return FALSE;
    }
    return m_pStretchEngine->Continue(pPause);
}
FX_BOOL CFX_ImageStretcher::StartQuickStretch()
{
#ifdef _FPDFAPI_MINI_
    m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
#endif
    m_bFlipX = FALSE;
    m_bFlipY = FALSE;
    if (m_DestWidth < 0) {
        m_bFlipX = TRUE;
        m_DestWidth = -m_DestWidth;
    }
    if (m_DestHeight < 0) {
        m_bFlipY = TRUE;
        m_DestHeight = -m_DestHeight;
    }
    m_LineIndex = 0;
    FX_DWORD size = m_ClipRect.Width();
    if (size && m_DestBPP > (int)(INT_MAX / size)) {
        return FALSE;
    }
    size *= m_DestBPP;
    m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);
    if (!m_pScanline) {
        return FALSE;
    }
    if (m_pSource->m_pAlphaMask) {
        m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);
        if (!m_pMaskScanline) {
            return FALSE;
        }
    }
    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
        ContinueQuickStretch(NULL);
        return FALSE;
    }
    return TRUE;
}
FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)
{
    if (m_pScanline == NULL) {
        return FALSE;
    }
    int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();
    int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();
    for (; m_LineIndex < result_height; m_LineIndex ++) {
        int dest_y, src_y;
        if (m_bFlipY) {
            dest_y = result_height - m_LineIndex - 1;
            src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;
        } else {
            dest_y = m_LineIndex;
            src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
        }
        if (src_y >= src_height) {
            src_y = src_height - 1;
        }
        if (src_y < 0) {
            src_y = 0;
        }
        if (m_pSource->SkipToScanline(src_y, pPause)) {
            return TRUE;
        }
        m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
        FX_LPBYTE scan_extra_alpha = NULL;
        if (m_pMaskScanline) {
            m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
        }
        m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);
    }
    return FALSE;
}
