// 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 "../../../include/fxcodec/fx_codec.h"
const FX_DWORD g_dwWinPalette[256] = {
    0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,
    0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,
    0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,
    0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,
    0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,
    0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,
    0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,
    0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,
    0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,
    0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,
    0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,
    0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,
    0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,
    0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,
    0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,
    0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,
    0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,
    0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,
    0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,
    0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,
    0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,
    0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,
    0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,
    0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,
    0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,
    0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,
    0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,
    0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,
    0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,
    0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,
    0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,
    0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,
    0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,
    0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,
    0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,
    0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,
    0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,
    0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,
    0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,
    0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,
    0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,
    0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,
    0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF
};
const FX_DWORD g_dwMacPalette[256] = {
    0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,
    0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,
    0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,
    0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,
    0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,
    0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,
    0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,
    0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,
    0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,
    0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,
    0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,
    0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,
    0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,
    0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,
    0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,
    0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,
    0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,
    0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,
    0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,
    0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,
    0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,
    0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,
    0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,
    0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,
    0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,
    0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,
    0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,
    0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,
    0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,
    0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,
    0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,
    0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,
    0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,
    0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,
    0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,
    0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,
    0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,
    0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,
    0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,
    0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,
    0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,
    0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,
    0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000
};
class CFX_Palette
{
public:
    CFX_Palette();
    ~CFX_Palette();
public:
    bool      BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);
    FX_DWORD*    GetPalette() const
    {
        return m_pPalette;
    }

    FX_DWORD*    GetColorLut()const
    {
        return m_cLut;
    }
    FX_DWORD*    GetAmountLut()const
    {
        return m_aLut;
    }
    int32_t     Getlut()const
    {
        return m_lut;
    }
protected:
    FX_DWORD*    m_pPalette;
    FX_DWORD*    m_cLut;
    FX_DWORD*    m_aLut;
    int          m_lut;
};
int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
{
    FX_DWORD p_a = alut[l];
    FX_DWORD p_c = clut[l];
    while(l < r) {
        while(l < r && alut[r] >= p_a) {
            r--;
        }
        if (l < r) {
            alut[l] = alut[r];
            clut[l++] = clut[r];
        }
        while(l < r && alut[l] <= p_a) {
            l++;
        }
        if (l < r) {
            alut[r] = alut[l];
            clut[r--] = clut[l];
        }
    }
    alut[l] = p_a;
    clut[l] = p_c;
    return l;
}
void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
{
    if(l < r) {
        int pI = _Partition(alut, clut, l, r);
        _Qsort(alut, clut, l, pI - 1);
        _Qsort(alut, clut, pI + 1, r);
    }
}
void _ColorDecode(FX_DWORD pal_v, uint8_t& r, uint8_t& g, uint8_t& b)
{
    r = (uint8_t)((pal_v & 0xf00) >> 4);
    g = (uint8_t)(pal_v & 0x0f0);
    b = (uint8_t)((pal_v & 0x00f) << 4);
}
void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)
{
    int row, col;
    FX_DWORD lut_1 = lut - 1;
    if (pal_type == FXDIB_PALETTE_LOC) {
        for (row = 0; row < 256; row++) {
            int lut_offset = lut_1 - row;
            if (lut_offset < 0) {
                lut_offset += 256;
            }
            FX_DWORD color = cLut[lut_offset];
            uint8_t r, g, b;
            _ColorDecode(color, r, g, b);
            dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;
            aLut[lut_offset] = row;
        }
    } else {
        for (row = 0; row < 256; row++) {
            int lut_offset = lut_1 - row;
            if (lut_offset < 0) {
                lut_offset += 256;
            }
            uint8_t r, g, b;
            _ColorDecode(cLut[lut_offset], r, g, b);
            int error, min_error = 1000000;
            int c_index = 0;
            for (col = 0; col < 256; col++) {
                FX_DWORD p_color = win_mac_pal[col];
                int d_r = r - (uint8_t)(p_color >> 16);
                int d_g = g - (uint8_t)(p_color >> 8);
                int d_b = b - (uint8_t)p_color;
                error = d_r * d_r + d_g * d_g + d_b * d_b;
                if (error < min_error) {
                    min_error = error;
                    c_index = col;
                }
            }
            dest_pal[row] =  win_mac_pal[c_index];
            aLut[lut_offset] = row;
        }
    }
}
CFX_Palette::CFX_Palette()
{
    m_pPalette = NULL;
    m_cLut = NULL;
    m_aLut = NULL;
    m_lut = 0;
}
CFX_Palette::~CFX_Palette()
{
    if (m_pPalette) {
        FX_Free(m_pPalette);
    }
    if (m_cLut) {
        FX_Free(m_cLut);
    }
    if (m_aLut) {
        FX_Free(m_aLut);
    }
    m_lut = 0;
}
bool CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)
{
    if (pBitmap == NULL) {
        return false;
    }
    if (m_pPalette != NULL) {
        FX_Free(m_pPalette);
    }
    m_pPalette = FX_Alloc(FX_DWORD, 256);
    int bpp    = pBitmap->GetBPP() / 8;
    int width  = pBitmap->GetWidth();
    int height = pBitmap->GetHeight();
    if (m_cLut) {
        FX_Free(m_cLut);
        m_cLut = NULL;
    }
    if (m_aLut) {
        FX_Free(m_aLut);
        m_aLut = NULL;
    }
    m_cLut = FX_Alloc(FX_DWORD, 4096);
    m_aLut = FX_Alloc(FX_DWORD, 4096);
    int row, col;
    m_lut = 0;
    for (row = 0; row < height; row++) {
        uint8_t* scan_line = (uint8_t*)pBitmap->GetScanline(row);
        for (col = 0; col < width; col++) {
            uint8_t* src_port = scan_line + col * bpp;
            FX_DWORD b = src_port[0] & 0xf0;
            FX_DWORD g = src_port[1] & 0xf0;
            FX_DWORD r = src_port[2] & 0xf0;
            FX_DWORD index = (r << 4) + g + (b >> 4);
            m_aLut[index]++;
        }
    }
    for (row = 0; row < 4096; row++) {
        if (m_aLut[row] != 0) {
            m_aLut[m_lut] = m_aLut[row];
            m_cLut[m_lut] = row;
            m_lut++;
        }
    }
    _Qsort(m_aLut, m_cLut, 0, m_lut - 1);
    FX_DWORD* win_mac_pal = NULL;
    if (pal_type == FXDIB_PALETTE_WIN) {
        win_mac_pal = (FX_DWORD*)g_dwWinPalette;
    } else if (pal_type == FXDIB_PALETTE_MAC) {
        win_mac_pal = (FX_DWORD*)g_dwMacPalette;
    }
    _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);
    return true;
}
bool _ConvertBuffer_1bppMask2Gray(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
{
    uint8_t set_gray, reset_gray;
    set_gray = 0xff;
    reset_gray = 0x00;
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        FXSYS_memset(dest_scan, reset_gray, width);
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row);
        for (int col = src_left; col < src_left + width; col ++) {
            if (src_scan[col / 8] & (1 << (7 - col % 8))) {
                *dest_scan = set_gray;
            }
            dest_scan ++;
        }
    }
    return true;
}
bool _ConvertBuffer_8bppMask2Gray(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
{
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
        FXSYS_memcpy(dest_scan, src_scan, width);
    }
    return true;
}
bool _ConvertBuffer_1bppPlt2Gray(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    FX_DWORD* src_plt = pSrcBitmap->GetPalette();
    uint8_t gray[2];
    if (pIccTransform) {
        FX_DWORD plt[2];
        if (pSrcBitmap->IsCmykImage()) {
            plt[0] = FXCMYK_TODIB(src_plt[0]);
            plt[1] = FXCMYK_TODIB(src_plt[1]);
        } else {
            uint8_t* bgr_ptr = (uint8_t*)plt;
            bgr_ptr[0] = FXARGB_B(src_plt[0]);
            bgr_ptr[1] = FXARGB_G(src_plt[0]);
            bgr_ptr[2] = FXARGB_R(src_plt[0]);
            bgr_ptr[3] = FXARGB_B(src_plt[1]);
            bgr_ptr[4] = FXARGB_G(src_plt[1]);
            bgr_ptr[5] = FXARGB_R(src_plt[1]);
        }
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, gray, (const uint8_t*)plt, 2);
    } else {
        uint8_t reset_r, reset_g, reset_b,
                set_r, set_g, set_b;
        if (pSrcBitmap->IsCmykImage()) {
            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
                               reset_r, reset_g, reset_b);
            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
                               set_r, set_g, set_b);
        } else {
            reset_r = FXARGB_R(src_plt[0]);
            reset_g = FXARGB_G(src_plt[0]);
            reset_b = FXARGB_B(src_plt[0]);
            set_r = FXARGB_R(src_plt[1]);
            set_g = FXARGB_G(src_plt[1]);
            set_b = FXARGB_B(src_plt[1]);
        }
        gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);
        gray[1] = FXRGB2GRAY(set_r, set_g, set_b);
    }
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        FXSYS_memset(dest_scan, gray[0], width);
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row);
        for (int col = src_left; col < src_left + width; col ++) {
            if (src_scan[col / 8] & (1 << (7 - col % 8))) {
                *dest_scan = gray[1];
            }
            dest_scan ++;
        }
    }
    return true;
}
bool _ConvertBuffer_8bppPlt2Gray(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    FX_DWORD* src_plt = pSrcBitmap->GetPalette();
    uint8_t gray[256];
    if (pIccTransform) {
        FX_DWORD plt[256];
        if (pSrcBitmap->IsCmykImage()) {
            for (int i = 0; i < 256; i ++) {
                plt[i] = FXCMYK_TODIB(src_plt[i]);
            }
        } else {
            uint8_t* bgr_ptr = (uint8_t*)plt;
            for (int i = 0; i < 256; i ++) {
                *bgr_ptr++ = FXARGB_B(src_plt[i]);
                *bgr_ptr++ = FXARGB_G(src_plt[i]);
                *bgr_ptr++ = FXARGB_R(src_plt[i]);
            }
        }
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, gray, (const uint8_t*)plt, 256);
    } else {
        if (pSrcBitmap->IsCmykImage()) {
            uint8_t r, g, b;
            for (int i = 0; i < 256; i ++) {
                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
                                   r, g, b);
                gray[i] = FXRGB2GRAY(r, g, b);
            }
        } else
            for (int i = 0; i < 256; i ++) {
                gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));
            }
    }
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
        for (int col = 0; col < width; col ++) {
            *dest_scan++ = gray[*src_scan++];
        }
    }
    return true;
}
bool _ConvertBuffer_RgbOrCmyk2Gray(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    int Bpp = pSrcBitmap->GetBPP() / 8;
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {
            for (int row = 0; row < height; row ++) {
                uint8_t* dest_scan = dest_buf + row * dest_pitch;
                const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
            }
        } else {
            for (int row = 0; row < height; row ++) {
                uint8_t* dest_scan = dest_buf + row * dest_pitch;
                const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
                for (int col = 0; col < width; col ++) {
                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                    dest_scan++;
                    src_scan += 4;
                }
            }
        }
    } else {
        if (pSrcBitmap->IsCmykImage()) {
            for (int row = 0; row < height; row ++) {
                uint8_t* dest_scan = dest_buf + row * dest_pitch;
                const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
                for (int col = 0; col < width; col ++) {
                    uint8_t r, g, b;
                    AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),
                                       r, g, b);
                    *dest_scan++ = FXRGB2GRAY(r, g, b);
                    src_scan += 4;
                }
            }
        } else {
            for (int row = 0; row < height; row ++) {
                uint8_t* dest_scan = dest_buf + row * dest_pitch;
                const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
                for (int col = 0; col < width; col ++) {
                    *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);
                    src_scan += Bpp;
                }
            }
        }
    }
    return true;
}
inline void _ConvertBuffer_IndexCopy(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
{
    if (pSrcBitmap->GetBPP() == 1) {
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            FXSYS_memset(dest_scan, 0, width);
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row);
            for (int col = src_left; col < src_left + width; col ++) {
                if (src_scan[col / 8] & (1 << (7 - col % 8))) {
                    *dest_scan = 1;
                }
                dest_scan ++;
            }
        }
    } else {
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
            FXSYS_memcpy(dest_scan, src_scan, width);
        }
    }
}
bool _ConvertBuffer_Plt2PltRgb8(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
{
    _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
    FX_DWORD* src_plt = pSrcBitmap->GetPalette();
    int plt_size = pSrcBitmap->GetPaletteSize();
    if (pIccTransform) {
        FX_DWORD plt[256];
        uint8_t* bgr_ptr = (uint8_t*)plt;
        if (pSrcBitmap->IsCmykImage()) {
            for (int i = 0; i < plt_size; i ++) {
                plt[i] = FXCMYK_TODIB(src_plt[i]);
            }
        } else {
            for (int i = 0; i < plt_size; i ++) {
                *bgr_ptr++ = FXARGB_B(src_plt[i]);
                *bgr_ptr++ = FXARGB_G(src_plt[i]);
                *bgr_ptr++ = FXARGB_R(src_plt[i]);
            }
            bgr_ptr = (uint8_t*)plt;
        }
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, (uint8_t*)plt, (const uint8_t*)plt, plt_size);
        for (int i = 0; i < plt_size; i ++) {
            dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
            bgr_ptr += 3;
        }
    } else {
        if (pSrcBitmap->IsCmykImage()) {
            for (int i = 0; i < plt_size; i ++) {
                uint8_t r, g, b;
                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
                                   r, g, b);
                dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);
            }
        } else {
            FXSYS_memcpy(dst_plt, src_plt, plt_size * 4);
        }
    }
    return true;
}
inline bool _ConvertBuffer_Rgb2PltRgb8_NoTransform(uint8_t* dest_buf, int dest_pitch, int width, int height,
        const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)
{
    int bpp = pSrcBitmap->GetBPP() / 8;
    int row, col;
    CFX_Palette palette;
    palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);
    FX_DWORD* cLut = palette.GetColorLut();
    FX_DWORD* aLut = palette.GetAmountLut();
    if (cLut == NULL || aLut == NULL) {
        return false;
    }
    int lut = palette.Getlut();
    FX_DWORD* pPalette = palette.GetPalette();
    if (lut > 256) {
        int err, min_err;
        int lut_256 = lut - 256;
        for (row = 0; row < lut_256; row++) {
            min_err = 1000000;
            uint8_t r, g, b;
            _ColorDecode(cLut[row], r, g, b);
            int clrindex = 0;
            for (int col = 0; col < 256; col++) {
                FX_DWORD p_color = *(pPalette + col);
                int d_r = r - (uint8_t)(p_color >> 16);
                int d_g = g - (uint8_t)(p_color >> 8);
                int d_b = b - (uint8_t)(p_color);
                err = d_r * d_r + d_g * d_g + d_b * d_b;
                if (err < min_err) {
                    min_err = err;
                    clrindex = col;
                }
            }
            aLut[row] = clrindex;
        }
    }
    int32_t lut_1 = lut - 1;
    for (row = 0; row < height; row ++) {
        uint8_t* src_scan = (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left;
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        for (col = 0; col < width; col++) {
            uint8_t* src_port = src_scan + col * bpp;
            int r = src_port[2] & 0xf0;
            int g = src_port[1] & 0xf0;
            int b = src_port[0] & 0xf0;
            FX_DWORD clrindex = (r << 4) + g + (b >> 4);
            for (int i = lut_1; i >= 0; i--)
                if (clrindex == cLut[i]) {
                    *(dest_scan + col) = (uint8_t)(aLut[i]);
                    break;
                }
        }
    }
    FXSYS_memcpy(dst_plt, pPalette, sizeof(FX_DWORD) * 256);
    return true;
}
bool _ConvertBuffer_Rgb2PltRgb8(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
{
    bool ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);
    if (ret && pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        for (int i = 0; i < 256; i++) {
            FX_ARGB* plt = dst_plt + i;
            FX_ARGB plt_entry = FXARGB_TODIB(*plt);
            pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&plt_entry, (const uint8_t*)&plt_entry, 1);
            *plt = FXARGB_TODIB(plt_entry);
        }
    }
    return ret;
}
bool _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, uint8_t* dest_buf, int dest_pitch, int width, int height,
                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
{
    int comps = (dst_format & 0xff) / 8;
    uint8_t set_gray, reset_gray;
    set_gray = 0xff;
    reset_gray = 0x00;
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row);
        for (int col = src_left; col < src_left + width; col ++) {
            if (src_scan[col / 8] & (1 << (7 - col % 8))) {
                dest_scan[0] = set_gray;
                dest_scan[1] = set_gray;
                dest_scan[2] = set_gray;
            } else {
                dest_scan[0] = reset_gray;
                dest_scan[1] = reset_gray;
                dest_scan[2] = reset_gray;
            }
            dest_scan += comps;
        }
    }
    return true;
}
bool _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, uint8_t* dest_buf, int dest_pitch, int width, int height,
                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
{
    int comps = (dst_format & 0xff) / 8;
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
        uint8_t src_pixel;
        for (int col = 0; col < width; col ++) {
            src_pixel = *src_scan++;
            *dest_scan++ = src_pixel;
            *dest_scan++ = src_pixel;
            *dest_scan   = src_pixel;
            dest_scan += comps - 2;
        }
    }
    return true;
}
bool _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, uint8_t* dest_buf, int dest_pitch, int width, int height,
                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    int comps = (dst_format & 0xff) / 8;
    FX_DWORD* src_plt = pSrcBitmap->GetPalette();
    FX_DWORD plt[2];
    uint8_t* bgr_ptr = (uint8_t*)plt;
    if (pSrcBitmap->IsCmykImage()) {
        plt[0] = FXCMYK_TODIB(src_plt[0]);
        plt[1] = FXCMYK_TODIB(src_plt[1]);
    } else {
        bgr_ptr[0] = FXARGB_B(src_plt[0]);
        bgr_ptr[1] = FXARGB_G(src_plt[0]);
        bgr_ptr[2] = FXARGB_R(src_plt[0]);
        bgr_ptr[3] = FXARGB_B(src_plt[1]);
        bgr_ptr[4] = FXARGB_G(src_plt[1]);
        bgr_ptr[5] = FXARGB_R(src_plt[1]);
    }
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, (uint8_t*)plt, (const uint8_t*)plt, 2);
    } else {
        if (pSrcBitmap->IsCmykImage()) {
            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
                               bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
                               bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);
        }
    }
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row);
        for (int col = src_left; col < src_left + width; col ++) {
            if (src_scan[col / 8] & (1 << (7 - col % 8))) {
                *dest_scan++ = bgr_ptr[3];
                *dest_scan++ = bgr_ptr[4];
                *dest_scan   = bgr_ptr[5];
            } else {
                *dest_scan++ = bgr_ptr[0];
                *dest_scan++ = bgr_ptr[1];
                *dest_scan   = bgr_ptr[2];
            }
            dest_scan += comps - 2;
        }
    }
    return true;
}
bool _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, uint8_t* dest_buf, int dest_pitch, int width, int height,
                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    int comps = (dst_format & 0xff) / 8;
    FX_DWORD* src_plt = pSrcBitmap->GetPalette();
    FX_DWORD plt[256];
    uint8_t* bgr_ptr = (uint8_t*)plt;
    if (!pSrcBitmap->IsCmykImage()) {
        for (int i = 0; i < 256; i++) {
            *bgr_ptr++ = FXARGB_B(src_plt[i]);
            *bgr_ptr++ = FXARGB_G(src_plt[i]);
            *bgr_ptr++ = FXARGB_R(src_plt[i]);
        }
        bgr_ptr = (uint8_t*)plt;
    }
    if (pIccTransform) {
        if (pSrcBitmap->IsCmykImage()) {
            for (int i = 0; i < 256; i++) {
                plt[i] = FXCMYK_TODIB(src_plt[i]);
            }
        }
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, (uint8_t*)plt, (const uint8_t*)plt, 256);
    } else {
        if (pSrcBitmap->IsCmykImage()) {
            for (int i = 0; i < 256; i++) {
                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
                                   bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
                bgr_ptr += 3;
            }
            bgr_ptr = (uint8_t*)plt;
        }
    }
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
        for (int col = 0; col < width; col ++) {
            uint8_t* src_pixel = bgr_ptr + 3 * (*src_scan++);
            *dest_scan++ = *src_pixel++;
            *dest_scan++ = *src_pixel++;
            *dest_scan   = *src_pixel++;
            dest_scan += comps - 2;
        }
    }
    return true;
}
bool _ConvertBuffer_24bppRgb2Rgb24(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
        }
    } else {
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
            FXSYS_memcpy(dest_scan, src_scan, width * 3);
        }
    }
    return true;
}
bool _ConvertBuffer_32bppRgb2Rgb24(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    for (int row = 0; row < height; row ++) {
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
        for (int col = 0; col < width; col ++) {
            *dest_scan++ = *src_scan++;
            *dest_scan++ = *src_scan++;
            *dest_scan++ = *src_scan++;
            src_scan++;
        }
    }
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);
        }
    }
    return true;
}
bool _ConvertBuffer_Rgb2Rgb32(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                 const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    int comps = pSrcBitmap->GetBPP() / 8;
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
            for (int col = 0; col < width; col ++) {
                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                dest_scan += 4;
                src_scan += comps;
            }
        }
    } else {
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
            for (int col = 0; col < width; col ++) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                dest_scan++;
                src_scan += comps - 3;
            }
        }
    }
    return true;
}
bool _ConvertBuffer_32bppCmyk2Rgb32(uint8_t* dest_buf, int dest_pitch, int width, int height,
                                       const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
{
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
            for (int col = 0; col < width; col ++) {
                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                dest_scan += 4;
                src_scan += 4;
            }
        }
    } else {
        for (int row = 0; row < height; row ++) {
            uint8_t* dest_scan = dest_buf + row * dest_pitch;
            const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
            for (int col = 0; col < width; col ++) {
                AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],
                                   dest_scan[2], dest_scan[1], dest_scan[0]);
                dest_scan += 4;
                src_scan += 4;
            }
        }
    }
    return true;
}
bool ConvertBuffer(FXDIB_Format dest_format, uint8_t* dest_buf, int dest_pitch, int width, int height,
                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)
{
    FXDIB_Format src_format = pSrcBitmap->GetFormat();
    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
        pIccTransform = NULL;
    }
    switch (dest_format) {
        case FXDIB_Invalid:
        case FXDIB_1bppCmyk:
        case FXDIB_1bppMask:
        case FXDIB_1bppRgb:
            ASSERT(false);
            return false;
        case FXDIB_8bppMask: {
                if ((src_format & 0xff) == 1) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) == 8) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) >= 24) {
                    return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                }
                return false;
            }
        case FXDIB_8bppRgb:
        case FXDIB_8bppRgba: {
                if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {
                    return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
                }
                d_pal = FX_Alloc(FX_DWORD, 256);
                if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {
                    return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
                }
                if ((src_format & 0xff) >= 24) {
                    return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
                }
                return false;
            }
        case FXDIB_Rgb:
        case FXDIB_Rgba: {
                if ((src_format & 0xff) == 1) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) == 8) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) == 24) {
                    return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                }
                if ((src_format & 0xff) == 32) {
                    return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                }
                return false;
            }
        case FXDIB_Argb:
        case FXDIB_Rgb32: {
                if ((src_format & 0xff) == 1) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) == 8) {
                    if (pSrcBitmap->GetPalette()) {
                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
                }
                if ((src_format & 0xff) >= 24) {
                    if (src_format & 0x0400) {
                        return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                    }
                    return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
                }
                return false;
            }
        default:
            return false;
    }
    return false;
}
CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const
{
    if(dest_format == GetFormat() && pIccTransform == NULL) {
        return Clone(pClip);
    }
    if (pClip) {
        CFX_DIBitmap* pClone = Clone(pClip);
        if (pClone == NULL) {
            return NULL;
        }
        if(!pClone->ConvertFormat(dest_format, pIccTransform)) {
            delete pClone;
            return NULL;
        }
        return pClone;
    }
    CFX_DIBitmap* pClone = new CFX_DIBitmap;
    if(!pClone->Create(m_Width, m_Height, dest_format)) {
        delete pClone;
        return NULL;
    }
    bool ret = true;
    CFX_DIBitmap* pSrcAlpha = NULL;
    if (m_AlphaFlag & 2) {
        pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;
        if (pSrcAlpha == NULL) {
            delete pClone;
            return NULL;
        }
    }
    if (dest_format & 0x0200) {
        if (dest_format == FXDIB_Argb)
            ret = pSrcAlpha ?
                  pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :
                  pClone->LoadChannel(FXDIB_Alpha, 0xff);
        else {
            ret = pClone->CopyAlphaMask(pSrcAlpha);
        }
    }
    if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {
        delete pSrcAlpha;
        pSrcAlpha = NULL;
    }
    if (!ret) {
        delete pClone;
        return NULL;
    }
    FX_DWORD* pal_8bpp = NULL;
    ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
    if (!ret) {
        if (pal_8bpp) {
            FX_Free(pal_8bpp);
        }
        delete pClone;
        return NULL;
    }
    if (pal_8bpp) {
        pClone->CopyPalette(pal_8bpp);
        FX_Free(pal_8bpp);
        pal_8bpp = NULL;
    }
    return pClone;
}
bool CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)
{
    FXDIB_Format src_format = GetFormat();
    if (dest_format == src_format && pIccTransform == NULL) {
        return true;
    }
    if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {
        m_AlphaFlag = 1;
        return true;
    }
    if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {
        m_AlphaFlag = 2;
        for (int row = 0; row < m_Height; row ++) {
            uint8_t* scanline = m_pBuffer + row * m_Pitch + 3;
            for (int col = 0; col < m_Width; col ++) {
                *scanline = 0xff;
                scanline += 4;
            }
        }
        return true;
    }
    int dest_bpp = dest_format & 0xff;
    int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;
    uint8_t* dest_buf = FX_TryAlloc(uint8_t, dest_pitch * m_Height + 4);
    if (dest_buf == NULL) {
        return false;
    }
    CFX_DIBitmap* pAlphaMask = NULL;
    if (dest_format == FXDIB_Argb) {
        FXSYS_memset(dest_buf, 0xff, dest_pitch * m_Height + 4);
        if (m_pAlphaMask) {
            for (int row = 0; row < m_Height; row ++) {
                uint8_t* pDstScanline = dest_buf + row * dest_pitch + 3;
                const uint8_t* pSrcScanline = m_pAlphaMask->GetScanline(row);
                for (int col = 0; col < m_Width; col ++) {
                    *pDstScanline = *pSrcScanline++;
                    pDstScanline += 4;
                }
            }
        }
    } else if (dest_format & 0x0200) {
        if (src_format == FXDIB_Argb) {
            pAlphaMask = GetAlphaMask();
            if (pAlphaMask == NULL) {
                FX_Free(dest_buf);
                return false;
            }
        } else {
            if (m_pAlphaMask == NULL) {
                if (!BuildAlphaMask()) {
                    FX_Free(dest_buf);
                    return false;
                }
                pAlphaMask = m_pAlphaMask;
                m_pAlphaMask = NULL;
            } else {
                pAlphaMask = m_pAlphaMask;
            }
        }
    }
    bool ret = false;
    FX_DWORD* pal_8bpp = NULL;
    ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
    if (!ret) {
        if (pal_8bpp) {
            FX_Free(pal_8bpp);
        }
        if (pAlphaMask != m_pAlphaMask) {
            delete pAlphaMask;
        }
        if (dest_buf) {
            FX_Free(dest_buf);
        }
        return false;
    }
    if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {
        delete m_pAlphaMask;
    }
    m_pAlphaMask = pAlphaMask;
    if (m_pPalette) {
        FX_Free(m_pPalette);
    }
    m_pPalette = pal_8bpp;
    if (!m_bExtBuf) {
        FX_Free(m_pBuffer);
    }
    m_bExtBuf = false;
    m_pBuffer = dest_buf;
    m_bpp = (uint8_t)dest_format;
    m_AlphaFlag = (uint8_t)(dest_format >> 8);
    m_Pitch = dest_pitch;
    return true;
}
