// 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_ge.h"
#include "../../../include/fxcodec/fx_codec.h"
#include "dib_int.h"
const FX_BYTE g_GammaRamp[256] = {
    0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
    1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,
    4,   4,   4,   4,   4,   5,   5,   5,   5,   6,   6,   6,   6,   7,   7,   7,
    8,   8,   8,   8,   9,   9,   9,  10,  10,  10,  11,  11,  12,  12,  12,  13,
    13,  13,  14,  14,  15,  15,  16,  16,  17,  17,  17,  18,  18,  19,  19,  20,
    20,  21,  22,  22,  23,  23,  24,  24,  25,  25,  26,  27,  27,  28,  29,  29,
    30,  30,  31,  32,  32,  33,  34,  35,  35,  36,  37,  37,  38,  39,  40,  41,
    41,  42,  43,  44,  45,  45,  46,  47,  48,  49,  50,  51,  51,  52,  53,  54,
    55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,
    71,  72,  73,  74,  76,  77,  78,  79,  80,  81,  82,  84,  85,  86,  87,  88,
    90,  91,  92,  93,  95,  96,  97,  99, 100, 101, 103, 104, 105, 107, 108, 109,
    111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,
    134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,
    161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,
    190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
    222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,
};
const FX_BYTE g_GammaInverse[256] = {
    0,  13,  22,  28,  34,  38,  42,  46,  50,  53,  56,  59,  61,  64,  66,  69,
    71,  73,  75,  77,  79,  81,  83,  85,  86,  88,  90,  92,  93,  95,  96,  98,
    99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,
    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
};
const FX_BYTE _color_sqrt[256] = {
    0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,
    0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,
    0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
    0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
    0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,
    0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,
    0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,
    0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,
    0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,
    0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,
    0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,
    0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
    0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,
    0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,
    0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
};
int _BLEND(int blend_mode, int back_color, int src_color)
{
    switch (blend_mode) {
        case FXDIB_BLEND_NORMAL:
            return src_color;
        case FXDIB_BLEND_MULTIPLY:
            return src_color * back_color / 255;
        case FXDIB_BLEND_SCREEN:
            return src_color + back_color - src_color * back_color / 255;
        case FXDIB_BLEND_OVERLAY:
            return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
        case FXDIB_BLEND_DARKEN:
            return src_color < back_color ? src_color : back_color;
        case FXDIB_BLEND_LIGHTEN:
            return src_color > back_color ? src_color : back_color;
        case FXDIB_BLEND_COLORDODGE: {
                if (src_color == 255) {
                    return src_color;
                }
                int result = back_color * 255 / (255 - src_color);
                if (result > 255) {
                    return 255;
                }
                return result;
            }
        case FXDIB_BLEND_COLORBURN: {
                if (src_color == 0) {
                    return src_color;
                }
                int result = (255 - back_color) * 255 / src_color;
                if (result > 255) {
                    result = 255;
                }
                return 255 - result;
            }
        case FXDIB_BLEND_HARDLIGHT:
            if (src_color < 128) {
                return (src_color * back_color * 2) / 255;
            }
            return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
        case FXDIB_BLEND_SOFTLIGHT: {
                if (src_color < 128) {
                    return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;
                }
                return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;
            }
        case FXDIB_BLEND_DIFFERENCE:
            return back_color < src_color ? src_color - back_color : back_color - src_color;
        case FXDIB_BLEND_EXCLUSION:
            return back_color + src_color - 2 * back_color * src_color / 255;
    }
    return src_color;
}
struct _RGB {
    int red;
    int green;
    int blue;
};
static inline int _Lum(_RGB color)
{
    return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
}
static _RGB _ClipColor(_RGB color)
{
    int l = _Lum(color);
    int n = color.red;
    if (color.green < n) {
        n = color.green;
    }
    if (color.blue < n) {
        n = color.blue;
    }
    int x = color.red;
    if (color.green > x) {
        x = color.green;
    }
    if (color.blue > x) {
        x = color.blue;
    }
    if (n < 0) {
        color.red = l + ((color.red - l) * l / (l - n));
        color.green = l + ((color.green - l) * l / (l - n));
        color.blue = l + ((color.blue - l) * l / (l - n));
    }
    if (x > 255) {
        color.red = l + ((color.red - l) * (255 - l) / (x - l));
        color.green = l + ((color.green - l) * (255 - l) / (x - l));
        color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
    }
    return color;
}
static _RGB _SetLum(_RGB color, int l)
{
    int d = l - _Lum(color);
    color.red += d;
    color.green += d;
    color.blue += d;
    return _ClipColor(color);
}
static int _Sat(_RGB color)
{
    int n = color.red;
    if (color.green < n) {
        n = color.green;
    }
    if (color.blue < n) {
        n = color.blue;
    }
    int x = color.red;
    if (color.green > x) {
        x = color.green;
    }
    if (color.blue > x) {
        x = color.blue;
    }
    return x - n;
}
static _RGB _SetSat(_RGB color, int s)
{
    int* max = &color.red;
    int* mid = &color.red;
    int* min = &color.red;
    if (color.green > *max) {
        max = &color.green;
    }
    if (color.blue > *max) {
        max = &color.blue;
    }
    if (color.green < *min) {
        min = &color.green;
    }
    if (color.blue < *min) {
        min = &color.blue;
    }
    if (*max == *min) {
        color.red = 0;
        color.green = 0;
        color.blue = 0;
        return color;
    }
    if (max == &color.red) {
        if (min == &color.green) {
            mid = &color.blue;
        } else {
            mid = &color.green;
        }
    } else if (max == &color.green) {
        if (min == &color.red) {
            mid = &color.blue;
        } else {
            mid = &color.red;
        }
    } else {
        if (min == &color.green) {
            mid = &color.red;
        } else {
            mid = &color.green;
        }
    }
    if (*max > *min) {
        *mid = (*mid - *min) * s / (*max - *min);
        *max = s;
        *min = 0;
    }
    return color;
}
void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])
{
    _RGB src, back, result;
    src.red = src_scan[2];
    src.green = src_scan[1];
    src.blue = src_scan[0];
    back.red = dest_scan[2];
    back.green = dest_scan[1];
    back.blue = dest_scan[0];
    switch (blend_mode) {
        case FXDIB_BLEND_HUE:
            result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
            break;
        case FXDIB_BLEND_SATURATION:
            result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
            break;
        case FXDIB_BLEND_COLOR:
            result = _SetLum(src, _Lum(back));
            break;
        case FXDIB_BLEND_LUMINOSITY:
            result = _SetLum(back, _Lum(src));
            break;
    }
    results[0] = result.blue;
    results[1] = result.green;
    results[2] = result.red;
}
inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)
{
    src_scan += 3;
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha = *src_scan;
        if (clip_scan) {
            src_alpha = clip_scan[col] * src_alpha / 255;
        }
        FX_BYTE back_alpha = *dest_scan;
        if (!back_alpha) {
            *dest_scan = src_alpha;
        } else if (src_alpha) {
            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        }
        dest_scan ++;
        src_scan += 4;
    }
}
void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha = *src_alpha_scan++;
        if (clip_scan) {
            src_alpha = clip_scan[col] * src_alpha / 255;
        }
        FX_BYTE back_alpha = *dest_scan;
        if (!back_alpha) {
            *dest_scan = src_alpha;
        } else if (src_alpha) {
            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        }
        dest_scan ++;
    }
}
void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)
{
    if (clip_scan) {
        for (int i = 0; i < width; i ++) {
            *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
            dest_scan ++;
            clip_scan ++;
        }
    } else {
        FXSYS_memset8(dest_scan, 0xff, width);
    }
}
void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
                              FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = NULL;
    if (pIccTransform) {
        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    }
    if (blend_type) {
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int blended_color;
        if (src_alpha_scan) {
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE back_alpha = *dst_alpha_scan;
                if (back_alpha == 0) {
                    int src_alpha = *src_alpha_scan++;
                    if (clip_scan) {
                        src_alpha = clip_scan[col] * src_alpha / 255;
                    }
                    if (src_alpha) {
                        if (pIccTransform) {
                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                        } else {
                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                        }
                        *dst_alpha_scan = src_alpha;
                    }
                    dest_scan ++;
                    dst_alpha_scan ++;
                    src_scan += 3;
                    continue;
                }
                FX_BYTE src_alpha = *src_alpha_scan++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha == 0) {
                    dest_scan ++;
                    dst_alpha_scan ++;
                    src_scan += 3;
                    continue;
                }
                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
                FX_BYTE gray;
                if (pIccTransform) {
                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                } else {
                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                }
                if (bNonseparableBlend) {
                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                }
                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
                dest_scan ++;
                dst_alpha_scan++;
                src_scan += 3;
            }
        } else
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE back_alpha = *dst_alpha_scan;
                if (back_alpha == 0) {
                    int src_alpha = src_scan[3];
                    if (clip_scan) {
                        src_alpha = clip_scan[col] * src_alpha / 255;
                    }
                    if (src_alpha) {
                        if (pIccTransform) {
                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                        } else {
                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                        }
                        *dst_alpha_scan = src_alpha;
                    }
                    dest_scan ++;
                    dst_alpha_scan ++;
                    src_scan += 4;
                    continue;
                }
                FX_BYTE src_alpha = src_scan[3];
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha == 0) {
                    dest_scan ++;
                    dst_alpha_scan ++;
                    src_scan += 4;
                    continue;
                }
                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
                FX_BYTE gray;
                if (pIccTransform) {
                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                } else {
                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                }
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
                dest_scan ++;
                dst_alpha_scan++;
                src_scan += 4;
            }
        return;
    }
    if (src_alpha_scan) {
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE back_alpha = *dst_alpha_scan;
            if (back_alpha == 0) {
                int src_alpha = *src_alpha_scan++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha) {
                    if (pIccTransform) {
                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                    } else {
                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                    }
                    *dst_alpha_scan = src_alpha;
                }
                dest_scan ++;
                dst_alpha_scan ++;
                src_scan += 3;
                continue;
            }
            FX_BYTE src_alpha = *src_alpha_scan++;
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha == 0) {
                dest_scan ++;
                dst_alpha_scan ++;
                src_scan += 3;
                continue;
            }
            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
            FX_BYTE gray;
            if (pIccTransform) {
                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
            } else {
                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
            }
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
            dst_alpha_scan++;
            src_scan += 3;
        }
    } else
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE back_alpha = *dst_alpha_scan;
            if (back_alpha == 0) {
                int src_alpha = src_scan[3];
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha) {
                    if (pIccTransform) {
                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                    } else {
                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                    }
                    *dst_alpha_scan = src_alpha;
                }
                dest_scan ++;
                dst_alpha_scan ++;
                src_scan += 4;
                continue;
            }
            FX_BYTE src_alpha = src_scan[3];
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha == 0) {
                dest_scan ++;
                dst_alpha_scan ++;
                src_scan += 4;
                continue;
            }
            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
            FX_BYTE gray;
            if (pIccTransform) {
                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
            } else {
                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
            }
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
            dst_alpha_scan++;
            src_scan += 4;
        }
}
inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,
                                    int blend_type, FX_LPCBYTE clip_scan,
                                    FX_LPCBYTE src_alpha_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = NULL;
    FX_BYTE gray;
    if (pIccTransform) {
        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    }
    if (blend_type) {
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int blended_color;
        if (src_alpha_scan) {
            for (int col = 0; col < pixel_count; col ++) {
                int src_alpha = *src_alpha_scan++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha) {
                    if (pIccTransform) {
                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                    } else {
                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                    }
                    if (bNonseparableBlend) {
                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                    }
                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
                }
                dest_scan ++;
                src_scan += 3;
            }
        } else
            for (int col = 0; col < pixel_count; col ++) {
                int src_alpha = src_scan[3];
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha) {
                    if (pIccTransform) {
                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                    } else {
                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                    }
                    if (bNonseparableBlend) {
                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                    }
                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
                }
                dest_scan ++;
                src_scan += 4;
            }
        return;
    }
    if (src_alpha_scan) {
        for (int col = 0; col < pixel_count; col ++) {
            int src_alpha = *src_alpha_scan++;
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha) {
                if (pIccTransform) {
                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                } else {
                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                }
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
            }
            dest_scan ++;
            src_scan += 3;
        }
    } else
        for (int col = 0; col < pixel_count; col ++) {
            int src_alpha = src_scan[3];
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha) {
                if (pIccTransform) {
                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
                } else {
                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                }
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
            }
            dest_scan ++;
            src_scan += 4;
        }
}
inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
                                   int blend_type, FX_LPCBYTE clip_scan,
                                   void* pIccTransform)
{
    ICodec_IccModule* pIccModule = NULL;
    FX_BYTE gray;
    if (pIccTransform) {
        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    }
    if (blend_type) {
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int blended_color;
        for (int col = 0; col < pixel_count; col ++) {
            if (pIccTransform) {
                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
            } else {
                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
            }
            if (bNonseparableBlend) {
                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
            }
            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
            if (clip_scan && clip_scan[col] < 255) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
            } else {
                *dest_scan = gray;
            }
            dest_scan ++;
            src_scan += src_Bpp;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (pIccTransform) {
            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
        } else {
            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
        }
        if (clip_scan && clip_scan[col] < 255) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
        } else {
            *dest_scan = gray;
        }
        dest_scan ++;
        src_scan += src_Bpp;
    }
}
void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
                             int blend_type, FX_LPCBYTE clip_scan,
                             FX_LPBYTE dest_alpha_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = NULL;
    if (pIccTransform) {
        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    }
    if (blend_type) {
        int blended_color;
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        for (int col = 0; col < pixel_count; col ++) {
            int back_alpha = *dest_alpha_scan;
            if (back_alpha == 0) {
                if (pIccTransform) {
                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
                } else {
                    *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
                }
                dest_scan ++;
                dest_alpha_scan++;
                src_scan += src_Bpp;
                continue;
            }
            int src_alpha = 255;
            if (clip_scan) {
                src_alpha = clip_scan[col];
            }
            if (src_alpha == 0) {
                dest_scan ++;
                dest_alpha_scan ++;
                src_scan += src_Bpp;
                continue;
            }
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            FX_BYTE gray;
            if (pIccTransform) {
                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
            } else {
                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
            }
            if (bNonseparableBlend) {
                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
            }
            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
            src_scan += src_Bpp;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha = 255;
        if (clip_scan) {
            src_alpha = clip_scan[col];
        }
        if (src_alpha == 255) {
            if (pIccTransform) {
                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
            } else {
                *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
            }
            dest_scan ++;
            *dest_alpha_scan++ = 255;
            src_scan += src_Bpp;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan ++;
            dest_alpha_scan ++;
            src_scan += src_Bpp;
            continue;
        }
        int back_alpha = *dest_alpha_scan;
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        FX_BYTE gray;
        if (pIccTransform) {
            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
        } else {
            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
        }
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
        dest_scan ++;
        src_scan += src_Bpp;
    }
}
void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
                             FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    if (dest_alpha_scan == NULL) {
        if (src_alpha_scan == NULL) {
            FX_BYTE back_alpha = 0;
            for (int col = 0; col < pixel_count; col ++) {
                back_alpha = dest_scan[3];
                if (back_alpha == 0) {
                    if (clip_scan) {
                        int src_alpha = clip_scan[col] * src_scan[3] / 255;
                        FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
                    } else {
                        FXARGB_COPY(dest_scan, src_scan);
                    }
                    dest_scan += 4;
                    src_scan += 4;
                    continue;
                }
                FX_BYTE src_alpha;
                if (clip_scan == NULL) {
                    src_alpha = src_scan[3];
                } else {
                    src_alpha = clip_scan[col] * src_scan[3] / 255;
                }
                if (src_alpha == 0) {
                    dest_scan += 4;
                    src_scan += 4;
                    continue;
                }
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                dest_scan[3] = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
                }
                for (int color = 0; color < 3; color ++) {
                    if (blend_type) {
                        int blended = bNonseparableBlend ? blended_colors[color] :
                                      _BLEND(blend_type, *dest_scan, *src_scan);
                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                    } else {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                    }
                    dest_scan ++;
                    src_scan ++;
                }
                dest_scan ++;
                src_scan ++;
            }
        } else {
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE back_alpha = dest_scan[3];
                if (back_alpha == 0) {
                    if (clip_scan) {
                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
                    } else {
                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
                    }
                    dest_scan += 4;
                    src_scan += 3;
                    src_alpha_scan ++;
                    continue;
                }
                FX_BYTE src_alpha;
                if (clip_scan == NULL) {
                    src_alpha = *src_alpha_scan ++;
                } else {
                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
                }
                if (src_alpha == 0) {
                    dest_scan += 4;
                    src_scan += 3;
                    continue;
                }
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                dest_scan[3] = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
                }
                for (int color = 0; color < 3; color ++) {
                    if (blend_type) {
                        int blended = bNonseparableBlend ? blended_colors[color] :
                                      _BLEND(blend_type, *dest_scan, *src_scan);
                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                    } else {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                    }
                    dest_scan ++;
                    src_scan ++;
                }
                dest_scan ++;
            }
        }
    } else {
        if (src_alpha_scan) {
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE back_alpha = *dest_alpha_scan;
                if (back_alpha == 0) {
                    if (clip_scan) {
                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
                        *dest_alpha_scan = src_alpha;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                    } else {
                        *dest_alpha_scan = *src_alpha_scan;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                    }
                    dest_alpha_scan ++;
                    src_alpha_scan ++;
                    continue;
                }
                FX_BYTE src_alpha;
                if (clip_scan == NULL) {
                    src_alpha = *src_alpha_scan ++;
                } else {
                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
                }
                if (src_alpha == 0) {
                    dest_scan += 3;
                    src_scan += 3;
                    dest_alpha_scan ++;
                    continue;
                }
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                *dest_alpha_scan ++ = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
                }
                for (int color = 0; color < 3; color ++) {
                    if (blend_type) {
                        int blended = bNonseparableBlend ? blended_colors[color] :
                                      _BLEND(blend_type, *dest_scan, *src_scan);
                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                    } else {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                    }
                    dest_scan ++;
                    src_scan ++;
                }
            }
        } else {
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE back_alpha = *dest_alpha_scan;
                if (back_alpha == 0) {
                    if (clip_scan) {
                        int src_alpha = clip_scan[col] * src_scan[3] / 255;
                        *dest_alpha_scan = src_alpha;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                    } else {
                        *dest_alpha_scan = src_scan[3];
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                        *dest_scan++ = *src_scan++;
                    }
                    dest_alpha_scan ++;
                    src_scan ++;
                    continue;
                }
                FX_BYTE src_alpha;
                if (clip_scan == NULL) {
                    src_alpha = src_scan[3];
                } else {
                    src_alpha = clip_scan[col] * src_scan[3] / 255;
                }
                if (src_alpha == 0) {
                    dest_scan += 3;
                    src_scan += 4;
                    dest_alpha_scan ++;
                    continue;
                }
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                *dest_alpha_scan++ = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
                }
                for (int color = 0; color < 3; color ++) {
                    if (blend_type) {
                        int blended = bNonseparableBlend ? blended_colors[color] :
                                      _BLEND(blend_type, *dest_scan, *src_scan);
                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                    } else {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                    }
                    dest_scan ++;
                    src_scan ++;
                }
                src_scan ++;
            }
        }
    }
}
void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
        FX_LPBYTE dest_alpha_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    if (dest_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            FX_BYTE back_alpha = dest_scan[3];
            if (back_alpha == 0) {
                if (src_Bpp == 4) {
                    FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
                } else {
                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
                }
                dest_scan += 4;
                src_scan += src_Bpp;
                continue;
            }
            dest_scan[3] = 0xff;
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int src_color = *src_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, *dest_scan, src_color);
                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan ++;
            src_scan += src_gap;
        }
    } else {
        for (int col = 0; col < width; col ++) {
            FX_BYTE back_alpha = *dest_alpha_scan;
            if (back_alpha == 0) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_alpha_scan++ = 0xff;
                src_scan += src_gap;
                continue;
            }
            *dest_alpha_scan++ = 0xff;
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int src_color = *src_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, *dest_scan, src_color);
                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
                dest_scan ++;
                src_scan ++;
            }
            src_scan += src_gap;
        }
    }
}
inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE dest_alpha_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    if (dest_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            int src_alpha = *clip_scan ++;
            FX_BYTE back_alpha = dest_scan[3];
            if (back_alpha == 0) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                src_scan += src_gap;
                dest_scan ++;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += 4;
                src_scan += src_Bpp;
                continue;
            }
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            dest_scan[3] = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int src_color = *src_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, *dest_scan, src_color);
                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan ++;
            src_scan += src_gap;
        }
    } else {
        for (int col = 0; col < width; col ++) {
            int src_alpha = *clip_scan ++;
            FX_BYTE back_alpha = *dest_alpha_scan;
            if (back_alpha == 0) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                src_scan += src_gap;
                dest_alpha_scan++;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += 3;
                dest_alpha_scan++;
                src_scan += src_Bpp;
                continue;
            }
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int src_color = *src_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, *dest_scan, src_color);
                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                dest_scan ++;
                src_scan ++;
            }
            src_scan += src_gap;
        }
    }
}
inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE dest_alpha_scan)
{
    int src_gap = src_Bpp - 3;
    if (dest_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            int src_alpha = clip_scan[col];
            if (src_alpha == 255) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = 255;
                src_scan += src_gap;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += 4;
                src_scan += src_Bpp;
                continue;
            }
            int back_alpha = dest_scan[3];
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            dest_scan[3] = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            for (int color = 0; color < 3; color ++) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan ++;
            src_scan += src_gap;
        }
    } else {
        for (int col = 0; col < width; col ++) {
            int src_alpha = clip_scan[col];
            if (src_alpha == 255) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_alpha_scan++ = 255;
                src_scan += src_gap;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += 3;
                dest_alpha_scan ++;
                src_scan += src_Bpp;
                continue;
            }
            int back_alpha = *dest_alpha_scan;
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan ++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            for (int color = 0; color < 3; color ++) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
                dest_scan ++;
                src_scan ++;
            }
            src_scan += src_gap;
        }
    }
}
inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
        FX_LPBYTE dest_alpha_scan)
{
    if (dest_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            if (src_Bpp == 4) {
                FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
            } else {
                FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
            }
            dest_scan += 4;
            src_scan += src_Bpp;
        }
    } else {
        int src_gap = src_Bpp - 3;
        for (int col = 0; col < width; col ++) {
            *dest_scan++ = *src_scan++;
            *dest_scan++ = *src_scan++;
            *dest_scan++ = *src_scan++;
            *dest_alpha_scan++ = 0xff;
            src_scan += src_gap;
        }
    }
}
inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int dest_gap = dest_Bpp - 3;
    if (src_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = src_scan[3] * (*clip_scan++) / 255;
            } else {
                src_alpha = src_scan[3];
            }
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_scan += 4;
                continue;
            }
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int back_color = *dest_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, back_color, *src_scan);
                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan += dest_gap;
            src_scan ++;
        }
    } else {
        for (int col = 0; col < width; col ++) {
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
            } else {
                src_alpha = *src_alpha_scan++;
            }
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_scan += 3;
                continue;
            }
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int back_color = *dest_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, back_color, *src_scan);
                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan += dest_gap;
        }
    }
}
inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan)
{
    int dest_gap = dest_Bpp - 3;
    if (src_alpha_scan == NULL) {
        for (int col = 0; col < width; col ++) {
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = src_scan[3] * (*clip_scan++) / 255;
            } else {
                src_alpha = src_scan[3];
            }
            if (src_alpha == 255) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                dest_scan += dest_gap;
                src_scan ++;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_scan += 4;
                continue;
            }
            for (int color = 0; color < 3; color ++) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan += dest_gap;
            src_scan ++;
        }
    } else {
        for (int col = 0; col < width; col ++) {
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
            } else {
                src_alpha = *src_alpha_scan++;
            }
            if (src_alpha == 255) {
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                *dest_scan++ = *src_scan++;
                dest_scan += dest_gap;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_scan += 3;
                continue;
            }
            for (int color = 0; color < 3; color ++) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
                dest_scan ++;
                src_scan ++;
            }
            dest_scan += dest_gap;
        }
    }
}
inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int dest_gap = dest_Bpp - 3;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        if (bNonseparableBlend) {
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int back_color = *dest_scan;
            int src_color = *src_scan;
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, back_color, src_color);
            *dest_scan = blended;
            dest_scan ++;
            src_scan ++;
        }
        dest_scan += dest_gap;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int dest_gap = dest_Bpp - 3;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        FX_BYTE src_alpha = *clip_scan ++;
        if (src_alpha == 0) {
            dest_scan += dest_Bpp;
            src_scan += src_Bpp;
            continue;
        }
        if (bNonseparableBlend) {
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int src_color = *src_scan;
            int back_color = *dest_scan;
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, back_color, src_color);
            *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
            dest_scan ++;
            src_scan ++;
        }
        dest_scan += dest_gap;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
{
    if (dest_Bpp == src_Bpp) {
        FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
        return;
    }
    for (int col = 0; col < width; col ++) {
        dest_scan[0] = src_scan[0];
        dest_scan[1] = src_scan[1];
        dest_scan[2] = src_scan[2];
        dest_scan += dest_Bpp;
        src_scan += src_Bpp;
    }
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < width; col ++) {
        int src_alpha = clip_scan[col];
        if (src_alpha == 255) {
            dest_scan[0] = src_scan[0];
            dest_scan[1] = src_scan[1];
            dest_scan[2] = src_scan[2];
        } else if (src_alpha) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
            dest_scan ++;
            src_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
            dest_scan ++;
            src_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
            dest_scan += dest_Bpp - 2;
            src_scan += src_Bpp - 2;
            continue;
        }
        dest_scan += dest_Bpp;
        src_scan += src_Bpp;
    }
}
void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
                                       FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    FX_LPBYTE dp = src_cache_scan;
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_alpha_scan) {
        if (dest_alpha_scan == NULL) {
            for (int col = 0; col < pixel_count; col ++) {
                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
                dp[3] = *src_alpha_scan++;
                src_scan += 3;
                dp += 4;
            }
            src_alpha_scan = NULL;
        } else {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
        }
    } else {
        if (dest_alpha_scan == NULL) {
            for (int col = 0; col < pixel_count; col ++) {
                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
                dp[3] = src_scan[3];
                src_scan += 4;
                dp += 4;
            }
        } else {
            int blended_colors[3];
            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
            for (int col = 0; col < pixel_count; col ++) {
                pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
                FX_BYTE back_alpha = *dest_alpha_scan;
                if (back_alpha == 0) {
                    if (clip_scan) {
                        int src_alpha = clip_scan[col] * src_scan[3] / 255;
                        *dest_alpha_scan = src_alpha;
                        *dest_scan++ = *src_cache_scan++;
                        *dest_scan++ = *src_cache_scan++;
                        *dest_scan++ = *src_cache_scan++;
                    } else {
                        *dest_alpha_scan = src_scan[3];
                        *dest_scan++ = *src_cache_scan++;
                        *dest_scan++ = *src_cache_scan++;
                        *dest_scan++ = *src_cache_scan++;
                    }
                    dest_alpha_scan ++;
                    src_scan += 4;
                    continue;
                }
                FX_BYTE src_alpha;
                if (clip_scan == NULL) {
                    src_alpha = src_scan[3];
                } else {
                    src_alpha = clip_scan[col] * src_scan[3] / 255;
                }
                src_scan += 4;
                if (src_alpha == 0) {
                    dest_scan += 3;
                    src_cache_scan += 3;
                    dest_alpha_scan ++;
                    continue;
                }
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                *dest_alpha_scan ++ = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
                }
                for (int color = 0; color < 3; color ++) {
                    if (blend_type) {
                        int blended = bNonseparableBlend ? blended_colors[color] :
                                      _BLEND(blend_type, *dest_scan, *src_cache_scan);
                        blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
                    } else {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
                    }
                    dest_scan ++;
                    src_cache_scan ++;
                }
            }
            return;
        }
    }
    _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
}
void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
}
inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);
}
inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
}
inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
}
inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_alpha_scan) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        int blended_colors[3];
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int dest_gap = dest_Bpp - 3;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = src_scan[3] * (*clip_scan++) / 255;
            } else {
                src_alpha = src_scan[3];
            }
            src_scan += 4;
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_cache_scan += 3;
                continue;
            }
            if (bNonseparableBlend) {
                _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
            }
            for (int color = 0; color < 3; color ++) {
                int back_color = *dest_scan;
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, back_color, *src_cache_scan);
                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
                dest_scan ++;
                src_cache_scan ++;
            }
            dest_scan += dest_gap;
        }
        return;
    }
    _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);
}
inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_alpha_scan) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        int dest_gap = dest_Bpp - 3;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
            FX_BYTE src_alpha;
            if (clip_scan) {
                src_alpha = src_scan[3] * (*clip_scan++) / 255;
            } else {
                src_alpha = src_scan[3];
            }
            src_scan += 4;
            if (src_alpha == 255) {
                *dest_scan++ = *src_cache_scan++;
                *dest_scan++ = *src_cache_scan++;
                *dest_scan++ = *src_cache_scan++;
                dest_scan += dest_gap;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += dest_Bpp;
                src_cache_scan += 3;
                continue;
            }
            for (int color = 0; color < 3; color ++) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
                dest_scan ++;
                src_cache_scan ++;
            }
            dest_scan += dest_gap;
        }
        return;
    }
    _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
}
inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
        FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
}
inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
        FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
        FX_LPBYTE src_cache_scan, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    if (src_Bpp == 3) {
        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
    } else {
        FX_LPBYTE dp = src_cache_scan;
        for (int col = 0; col < width; col ++) {
            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
            src_scan += 4;
            dp += 3;
        }
    }
    _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
}
inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
                                       int blend_type, FX_LPCBYTE clip_scan,
                                       FX_LPCBYTE src_alpha_scan)
{
    if (src_alpha_scan) {
        if (blend_type) {
            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
            int blended_color;
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE gray = pPalette[*src_scan];
                int src_alpha = *src_alpha_scan++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (bNonseparableBlend) {
                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                }
                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                if (src_alpha) {
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
                } else {
                    *dest_scan = gray;
                }
                dest_scan ++;
                src_scan ++;
            }
            return;
        }
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = pPalette[*src_scan];
            int src_alpha = *src_alpha_scan++;
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
            } else {
                *dest_scan = gray;
            }
            dest_scan ++;
            src_scan ++;
        }
    } else {
        if (blend_type) {
            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
            int blended_color;
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE gray = pPalette[*src_scan];
                if (bNonseparableBlend) {
                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                }
                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                if (clip_scan && clip_scan[col] < 255) {
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
                } else {
                    *dest_scan = gray;
                }
                dest_scan ++;
                src_scan ++;
            }
            return;
        }
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = pPalette[*src_scan];
            if (clip_scan && clip_scan[col] < 255) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
            } else {
                *dest_scan = gray;
            }
            dest_scan ++;
            src_scan ++;
        }
    }
}
inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
                                        int blend_type, FX_LPCBYTE clip_scan,
                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
{
    if (src_alpha_scan) {
        if (blend_type) {
            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
            int blended_color;
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE gray = pPalette[*src_scan];
                src_scan ++;
                FX_BYTE back_alpha = *dest_alpha_scan;
                if (back_alpha == 0) {
                    int src_alpha = *src_alpha_scan ++;
                    if (clip_scan) {
                        src_alpha = clip_scan[col] * src_alpha / 255;
                    }
                    if (src_alpha) {
                        *dest_scan = gray;
                        *dest_alpha_scan = src_alpha;
                    }
                    dest_scan ++;
                    dest_alpha_scan ++;
                    continue;
                }
                FX_BYTE src_alpha = *src_alpha_scan++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha == 0) {
                    dest_scan ++;
                    dest_alpha_scan ++;
                    continue;
                }
                *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
                if (bNonseparableBlend) {
                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                }
                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
                dest_alpha_scan ++;
                dest_scan ++;
            }
            return;
        }
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = pPalette[*src_scan];
            src_scan ++;
            FX_BYTE back_alpha = *dest_alpha_scan;
            if (back_alpha == 0) {
                int src_alpha = *src_alpha_scan ++;
                if (clip_scan) {
                    src_alpha = clip_scan[col] * src_alpha / 255;
                }
                if (src_alpha) {
                    *dest_scan = gray;
                    *dest_alpha_scan = src_alpha;
                }
                dest_scan ++;
                dest_alpha_scan ++;
                continue;
            }
            FX_BYTE src_alpha = *src_alpha_scan++;
            if (clip_scan) {
                src_alpha = clip_scan[col] * src_alpha / 255;
            }
            if (src_alpha == 0) {
                dest_scan ++;
                dest_alpha_scan ++;
                continue;
            }
            *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
            dest_alpha_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
        }
    } else {
        if (blend_type) {
            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
            int blended_color;
            for (int col = 0; col < pixel_count; col ++) {
                FX_BYTE gray = pPalette[*src_scan];
                src_scan ++;
                if (clip_scan == NULL || clip_scan[col] == 255) {
                    *dest_scan++ = gray;
                    *dest_alpha_scan++ = 255;
                    continue;
                }
                int src_alpha = clip_scan[col];
                if (src_alpha == 0) {
                    dest_scan ++;
                    dest_alpha_scan ++;
                    continue;
                }
                int back_alpha = *dest_alpha_scan;
                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                *dest_alpha_scan ++ = dest_alpha;
                int alpha_ratio = src_alpha * 255 / dest_alpha;
                if (bNonseparableBlend) {
                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
                }
                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
                dest_scan ++;
            }
            return;
        }
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = pPalette[*src_scan];
            src_scan ++;
            if (clip_scan == NULL || clip_scan[col] == 255) {
                *dest_scan++ = gray;
                *dest_alpha_scan++ = 255;
                continue;
            }
            int src_alpha = clip_scan[col];
            if (src_alpha == 0) {
                dest_scan ++;
                dest_alpha_scan ++;
                continue;
            }
            int back_alpha = *dest_alpha_scan;
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan ++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
        }
    }
}
inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
                                       FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
{
    int reset_gray = pPalette[0];
    int set_gray = pPalette[1];
    if (blend_type) {
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int blended_color;
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
            if (bNonseparableBlend) {
                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
            }
            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
            if (clip_scan && clip_scan[col] < 255) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
            } else {
                *dest_scan = gray;
            }
            dest_scan ++;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
        if (clip_scan && clip_scan[col] < 255) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
        } else {
            *dest_scan = gray;
        }
        dest_scan ++;
    }
}
inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
                                        FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
                                        FX_LPBYTE dest_alpha_scan)
{
    int reset_gray = pPalette[0];
    int set_gray = pPalette[1];
    if (blend_type) {
        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
        int blended_color;
        for (int col = 0; col < pixel_count; col ++) {
            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
            if (clip_scan == NULL || clip_scan[col] == 255) {
                *dest_scan++ = gray;
                *dest_alpha_scan ++ = 255;
                continue;
            }
            int src_alpha = clip_scan[col];
            if (src_alpha == 0) {
                dest_scan ++;
                dest_alpha_scan ++;
                continue;
            }
            int back_alpha = *dest_alpha_scan;
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan ++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            if (bNonseparableBlend) {
                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
            }
            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
            dest_scan ++;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
        if (clip_scan == NULL || clip_scan[col] == 255) {
            *dest_scan++ = gray;
            *dest_alpha_scan ++ = 255;
            continue;
        }
        int src_alpha = clip_scan[col];
        if (src_alpha == 0) {
            dest_scan ++;
            dest_alpha_scan ++;
            continue;
        }
        int back_alpha = *dest_alpha_scan;
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan ++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
        dest_scan ++;
    }
}
inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,
        int DestBpp, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan)
{
    if (src_alpha_scan) {
        int dest_gap = DestBpp - 3;
        FX_ARGB argb = 0;
        for (int col = 0; col < pixel_count; col ++) {
            argb = pPalette[*src_scan];
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            src_scan ++;
            FX_BYTE src_alpha = 0;
            if (clip_scan) {
                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
            } else {
                src_alpha = *src_alpha_scan++;
            }
            if (src_alpha == 255) {
                *dest_scan++ = src_b;
                *dest_scan++ = src_g;
                *dest_scan++ = src_r;
                dest_scan += dest_gap;
                continue;
            }
            if (src_alpha == 0) {
                dest_scan += DestBpp;
                continue;
            }
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
            dest_scan ++;
            dest_scan += dest_gap;
        }
    } else {
        FX_ARGB argb = 0;
        for (int col = 0; col < pixel_count; col ++) {
            argb = pPalette[*src_scan];
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            if (clip_scan && clip_scan[col] < 255) {
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
                dest_scan ++;
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
                dest_scan ++;
                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
                dest_scan ++;
            } else {
                *dest_scan++ = src_b;
                *dest_scan++ = src_g;
                *dest_scan++ = src_r;
            }
            if (DestBpp == 4) {
                dest_scan++;
            }
            src_scan ++;
        }
    }
}
inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
        FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
{
    int reset_r, reset_g, reset_b;
    int set_r, set_g, set_b;
    reset_r = FXARGB_R(pPalette[0]);
    reset_g = FXARGB_G(pPalette[0]);
    reset_b = FXARGB_B(pPalette[0]);
    set_r = FXARGB_R(pPalette[1]);
    set_g = FXARGB_G(pPalette[1]);
    set_b = FXARGB_B(pPalette[1]);
    for (int col = 0; col < pixel_count; col ++) {
        int src_r, src_g, src_b;
        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
            src_r = set_r;
            src_g = set_g;
            src_b = set_b;
        } else {
            src_r = reset_r;
            src_g = reset_g;
            src_b = reset_b;
        }
        if (clip_scan && clip_scan[col] < 255) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
            dest_scan ++;
        } else {
            *dest_scan++ = src_b;
            *dest_scan++ = src_g;
            *dest_scan++ = src_r;
        }
        if (DestBpp == 4) {
            dest_scan++;
        }
    }
}
inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_alpha_scan)
{
    if (src_alpha_scan) {
        for (int col = 0; col < width; col ++) {
            FX_ARGB argb = pPalette[*src_scan];
            src_scan ++;
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            FX_BYTE back_alpha = dest_scan[3];
            if (back_alpha == 0) {
                if (clip_scan) {
                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
                } else {
                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
                }
                dest_scan += 4;
                src_alpha_scan ++;
                continue;
            }
            FX_BYTE src_alpha;
            if (clip_scan == NULL) {
                src_alpha = *src_alpha_scan ++;
            } else {
                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
            }
            if (src_alpha == 0) {
                dest_scan += 4;
                continue;
            }
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            dest_scan[3] = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
            dest_scan ++;
        }
    } else
        for (int col = 0; col < width; col ++) {
            FX_ARGB argb = pPalette[*src_scan];
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            if (clip_scan == NULL || clip_scan[col] == 255) {
                *dest_scan++ = src_b;
                *dest_scan++ = src_g;
                *dest_scan++ = src_r;
                *dest_scan++ = 255;
                src_scan ++;
                continue;
            }
            int src_alpha = clip_scan[col];
            if (src_alpha == 0) {
                dest_scan += 4;
                src_scan ++;
                continue;
            }
            int back_alpha = dest_scan[3];
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            dest_scan[3] = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
            dest_scan ++;
            src_scan ++;
        }
}
void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
{
    if (src_alpha_scan) {
        for (int col = 0; col < width; col ++) {
            FX_ARGB argb = pPalette[*src_scan];
            src_scan ++;
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            FX_BYTE back_alpha = *dest_alpha_scan;
            if (back_alpha == 0) {
                if (clip_scan) {
                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
                    *dest_alpha_scan ++ = src_alpha;
                } else {
                    *dest_alpha_scan ++ = *src_alpha_scan;
                }
                *dest_scan ++ = src_b;
                *dest_scan ++ = src_g;
                *dest_scan ++ = src_r;
                src_alpha_scan ++;
                continue;
            }
            FX_BYTE src_alpha;
            if (clip_scan == NULL) {
                src_alpha = *src_alpha_scan++;
            } else {
                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
            }
            if (src_alpha == 0) {
                dest_scan += 3;
                dest_alpha_scan ++;
                continue;
            }
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan ++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
        }
    } else
        for (int col = 0; col < width; col ++) {
            FX_ARGB argb = pPalette[*src_scan];
            int src_r = FXARGB_R(argb);
            int src_g = FXARGB_G(argb);
            int src_b = FXARGB_B(argb);
            if (clip_scan == NULL || clip_scan[col] == 255) {
                *dest_scan++ = src_b;
                *dest_scan++ = src_g;
                *dest_scan++ = src_r;
                *dest_alpha_scan++ = 255;
                src_scan ++;
                continue;
            }
            int src_alpha = clip_scan[col];
            if (src_alpha == 0) {
                dest_scan += 3;
                dest_alpha_scan ++;
                src_scan ++;
                continue;
            }
            int back_alpha = *dest_alpha_scan;
            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
            *dest_alpha_scan ++ = dest_alpha;
            int alpha_ratio = src_alpha * 255 / dest_alpha;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
            src_scan ++;
        }
}
inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
        FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
{
    int reset_r, reset_g, reset_b;
    int set_r, set_g, set_b;
    reset_r = FXARGB_R(pPalette[0]);
    reset_g = FXARGB_G(pPalette[0]);
    reset_b = FXARGB_B(pPalette[0]);
    set_r = FXARGB_R(pPalette[1]);
    set_g = FXARGB_G(pPalette[1]);
    set_b = FXARGB_B(pPalette[1]);
    for (int col = 0; col < width; col ++) {
        int src_r, src_g, src_b;
        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
            src_r = set_r;
            src_g = set_g;
            src_b = set_b;
        } else {
            src_r = reset_r;
            src_g = reset_g;
            src_b = reset_b;
        }
        if (clip_scan == NULL || clip_scan[col] == 255) {
            *dest_scan++ = src_b;
            *dest_scan++ = src_g;
            *dest_scan++ = src_r;
            *dest_scan++ = 255;
            continue;
        }
        int src_alpha = clip_scan[col];
        if (src_alpha == 0) {
            dest_scan += 4;
            continue;
        }
        int back_alpha = dest_scan[3];
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
        dest_scan ++;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
        dest_scan ++;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
        dest_scan ++;
        dest_scan ++;
    }
}
void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
                                        FX_LPBYTE dest_alpha_scan)
{
    int reset_r, reset_g, reset_b;
    int set_r, set_g, set_b;
    reset_r = FXARGB_R(pPalette[0]);
    reset_g = FXARGB_G(pPalette[0]);
    reset_b = FXARGB_B(pPalette[0]);
    set_r = FXARGB_R(pPalette[1]);
    set_g = FXARGB_G(pPalette[1]);
    set_b = FXARGB_B(pPalette[1]);
    for (int col = 0; col < width; col ++) {
        int src_r, src_g, src_b;
        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
            src_r = set_r;
            src_g = set_g;
            src_b = set_b;
        } else {
            src_r = reset_r;
            src_g = reset_g;
            src_b = reset_b;
        }
        if (clip_scan == NULL || clip_scan[col] == 255) {
            *dest_scan++ = src_b;
            *dest_scan++ = src_g;
            *dest_scan++ = src_r;
            *dest_alpha_scan++ = 255;
            continue;
        }
        int src_alpha = clip_scan[col];
        if (src_alpha == 0) {
            dest_scan += 3;
            dest_alpha_scan ++;
            continue;
        }
        int back_alpha = *dest_alpha_scan;
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan ++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
        dest_scan ++;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
        dest_scan ++;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
        dest_scan ++;
    }
}
void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
                                 int blend_type, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
            dest_scan += 4;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += 4;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
        }
        dest_scan += 2;
    }
}
void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
                                 int blend_type, FX_LPCBYTE clip_scan,
                                 FX_LPBYTE dest_alpha_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        FX_BYTE back_alpha = *dest_alpha_scan;
        if (back_alpha == 0) {
            *dest_scan ++ = src_b;
            *dest_scan ++ = src_g;
            *dest_scan ++ = src_r;
            *dest_alpha_scan ++ = src_alpha;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += 3;
            dest_alpha_scan ++;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan ++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
            dest_scan ++;
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
        }
    }
}
void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
                                int blend_type, int Bpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        if (src_alpha == 0) {
            dest_scan += Bpp;
            continue;
        }
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
        }
        dest_scan += Bpp - 2;
    }
}
void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,
                                 FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        FX_BYTE back_alpha = *dest_scan;
        if (!back_alpha) {
            *dest_scan = src_alpha;
        } else if (src_alpha) {
            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        }
        dest_scan ++;
    }
}
void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
                                 int pixel_count, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        if (src_alpha) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
        }
        dest_scan ++;
    }
}
void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
                                  int pixel_count, FX_LPCBYTE clip_scan,
                                  FX_LPBYTE dest_alpha_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        FX_BYTE back_alpha = *dest_alpha_scan;
        if (back_alpha == 0) {
            *dest_scan ++ = src_gray;
            *dest_alpha_scan ++ = src_alpha;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan ++;
            dest_alpha_scan ++;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
        dest_scan ++;
    }
}
void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
{
    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
        for (int col = 0; col < pixel_count; col ++) {
            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
                FXARGB_SETDIB(dest_scan, argb);
            }
            dest_scan += 4;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan += 4;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
            dest_scan += 4;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
        }
        dest_scan += 2;
    }
}
void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
                                FX_LPBYTE dest_alpha_scan)
{
    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
        for (int col = 0; col < pixel_count; col ++) {
            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
                dest_scan[0] = src_b;
                dest_scan[1] = src_g;
                dest_scan[2] = src_r;
                *dest_alpha_scan = mask_alpha;
            }
            dest_scan += 3;
            dest_alpha_scan ++;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan += 3;
            dest_alpha_scan ++;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            *dest_scan ++ = src_b;
            *dest_scan ++ = src_g;
            *dest_scan ++ = src_r;
            *dest_alpha_scan ++ = mask_alpha;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan ++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
            dest_scan ++;
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
            dest_scan ++;
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
            dest_scan ++;
        }
    }
}
void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
                               int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
{
    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
        for (int col = 0; col < pixel_count; col ++) {
            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
                dest_scan[2] = src_r;
                dest_scan[1] = src_g;
                dest_scan[0] = src_b;
            }
            dest_scan += Bpp;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan += Bpp;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        if (src_alpha == 0) {
            dest_scan += Bpp;
            continue;
        }
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, *dest_scan, src_b);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
            dest_scan++;
            blended = _BLEND(blend_type, *dest_scan, src_g);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
            dest_scan++;
            blended = _BLEND(blend_type, *dest_scan, src_r);
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
        } else {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
            dest_scan ++;
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
        }
        dest_scan += Bpp - 2;
    }
}
void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,
                                int pixel_count, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan ++;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        FX_BYTE back_alpha = *dest_scan;
        if (!back_alpha) {
            *dest_scan = src_alpha;
        } else if (src_alpha) {
            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        }
        dest_scan ++;
    }
}
void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
                                int src_left, int pixel_count, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan ++;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        if (src_alpha) {
            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
        }
        dest_scan ++;
    }
}
void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
                                 int src_left, int pixel_count, FX_LPCBYTE clip_scan,
                                 FX_LPBYTE dest_alpha_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan ++;
            dest_alpha_scan ++;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        FX_BYTE back_alpha = *dest_alpha_scan;
        if (back_alpha == 0) {
            *dest_scan ++ = src_gray;
            *dest_alpha_scan ++ = src_alpha;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan ++;
            dest_alpha_scan ++;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        *dest_alpha_scan++ = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
        dest_scan ++;
    }
}
void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    for (int col = 0; col < pixel_count; col ++) {
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            if (clip_scan) {
                int src_alpha = clip_scan[col] * src_scan[3] / 255;
                dest_scan[3] = src_alpha;
                dest_scan[0] = src_scan[2];
                dest_scan[1] = src_scan[1];
                dest_scan[2] = src_scan[0];
            } else {
                FXARGB_RGBORDERCOPY(dest_scan, src_scan);
            }
            dest_scan += 4;
            src_scan += 4;
            continue;
        }
        FX_BYTE src_alpha;
        if (clip_scan == NULL) {
            src_alpha = src_scan[3];
        } else {
            src_alpha = clip_scan[col] * src_scan[3] / 255;
        }
        if (src_alpha == 0) {
            dest_scan += 4;
            src_scan += 4;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (bNonseparableBlend) {
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            if (blend_type) {
                int blended = bNonseparableBlend ? blended_colors[color] :
                              _BLEND(blend_type, dest_scan[index], *src_scan);
                blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
            } else {
                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
            }
            src_scan ++;
        }
        dest_scan += 4;
        src_scan++;
    }
}
void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            if (src_Bpp == 4) {
                FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
            } else {
                FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
            }
            dest_scan += 4;
            src_scan += src_Bpp;
            continue;
        }
        dest_scan[3] = 0xff;
        if (bNonseparableBlend)	{
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            int src_color = FX_GAMMA(*src_scan);
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, dest_scan[index], src_color);
            dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
            src_scan ++;
        }
        dest_scan += 4;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    for (int col = 0; col < width; col ++) {
        FX_BYTE src_alpha;
        if (clip_scan) {
            src_alpha = src_scan[3] * (*clip_scan++) / 255;
        } else {
            src_alpha = src_scan[3];
        }
        if (src_alpha == 0) {
            dest_scan += dest_Bpp;
            src_scan += 4;
            continue;
        }
        if (bNonseparableBlend) {
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            int back_color = FX_GAMMA(dest_scan[index]);
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, back_color, *src_scan);
            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
            src_scan ++;
        }
        dest_scan += dest_Bpp;
        src_scan ++;
    }
}
inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)
{
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        if (src_Bpp == 4) {
            FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
        } else {
            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
        }
        dest_scan += 4;
        src_scan += src_Bpp;
    }
}
inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        if (bNonseparableBlend) {
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            int back_color = FX_GAMMA(dest_scan[index]);
            int src_color = FX_GAMMA(*src_scan);
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, back_color, src_color);
            dest_scan[index] = FX_GAMMA_INVERSE(blended);
            src_scan ++;
        }
        dest_scan += dest_Bpp;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < width; col ++) {
        FX_BYTE src_alpha;
        if (clip_scan) {
            src_alpha = src_scan[3] * (*clip_scan++) / 255;
        } else {
            src_alpha = src_scan[3];
        }
        if (src_alpha == 255) {
            dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
            dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
            dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
            dest_scan += dest_Bpp;
            src_scan ++;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += dest_Bpp;
            src_scan += 4;
            continue;
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
            src_scan ++;
        }
        dest_scan += dest_Bpp;
        src_scan ++;
    }
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
{
    for (int col = 0; col < width; col ++) {
        dest_scan[2] = src_scan[0];
        dest_scan[1] = src_scan[1];
        dest_scan[0] = src_scan[2];
        dest_scan += dest_Bpp;
        src_scan += src_Bpp;
    }
}
inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        int src_alpha = *clip_scan ++;
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            dest_scan[2] = FX_GAMMA(*src_scan++);
            dest_scan[1] = FX_GAMMA(*src_scan++);
            dest_scan[0] = FX_GAMMA(*src_scan++);
            src_scan += src_gap;
            dest_scan += 4;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += 4;
            src_scan += src_Bpp;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (bNonseparableBlend) {
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            int src_color = FX_GAMMA(*src_scan);
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, dest_scan[index], src_color);
            blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
            src_scan ++;
        }
        dest_scan += 4;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
{
    int blended_colors[3];
    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        FX_BYTE src_alpha = *clip_scan ++;
        if (src_alpha == 0) {
            dest_scan += dest_Bpp;
            src_scan += src_Bpp;
            continue;
        }
        if (bNonseparableBlend) {
            FX_BYTE dest_scan_o[3];
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
        }
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            int src_color = FX_GAMMA(*src_scan);
            int back_color = FX_GAMMA(dest_scan[index]);
            int blended = bNonseparableBlend ? blended_colors[color] :
                          _BLEND(blend_type, back_color, src_color);
            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
            src_scan ++;
        }
        dest_scan += dest_Bpp;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
{
    int src_gap = src_Bpp - 3;
    for (int col = 0; col < width; col ++) {
        int src_alpha = clip_scan[col];
        if (src_alpha == 255) {
            dest_scan[2] = FX_GAMMA(*src_scan++);
            dest_scan[1] = FX_GAMMA(*src_scan++);
            dest_scan[0] = FX_GAMMA(*src_scan++);
            dest_scan[3] = 255;
            dest_scan += 4;
            src_scan  += src_gap;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += 4;
            src_scan += src_Bpp;
            continue;
        }
        int back_alpha = dest_scan[3];
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        for (int color = 0; color < 3; color ++) {
            int index = 2 - color;
            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
            src_scan ++;
        }
        dest_scan += 4;
        src_scan += src_gap;
    }
}
inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < width; col ++) {
        int src_alpha = clip_scan[col];
        if (src_alpha == 255) {
            dest_scan[2] = src_scan[0];
            dest_scan[1] = src_scan[1];
            dest_scan[0] = src_scan[2];
        } else if (src_alpha) {
            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
            src_scan ++;
            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
            src_scan ++;
            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
            dest_scan += dest_Bpp;
            src_scan += src_Bpp - 2;
            continue;
        }
        dest_scan += dest_Bpp;
        src_scan += src_Bpp;
    }
}
inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
        int DestBpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
        int src_r = FXARGB_R(argb);
        int src_g = FXARGB_G(argb);
        int src_b = FXARGB_B(argb);
        if (clip_scan && clip_scan[col] < 255) {
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
        } else {
            dest_scan[2] = src_b;
            dest_scan[1] = src_g;
            dest_scan[0] = src_r;
        }
        dest_scan += DestBpp;
        src_scan ++;
    }
}
inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
        FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
{
    int reset_r, reset_g, reset_b;
    int set_r, set_g, set_b;
    if (pPalette) {
        reset_r = FXARGB_R(pPalette[0]);
        reset_g = FXARGB_G(pPalette[0]);
        reset_b = FXARGB_B(pPalette[0]);
        set_r = FXARGB_R(pPalette[1]);
        set_g = FXARGB_G(pPalette[1]);
        set_b = FXARGB_B(pPalette[1]);
    } else {
        reset_r = reset_g = reset_b = 0;
        set_r = set_g = set_b = 255;
    }
    for (int col = 0; col < pixel_count; col ++) {
        int src_r, src_g, src_b;
        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
            src_r = set_r;
            src_g = set_g;
            src_b = set_b;
        } else {
            src_r = reset_r;
            src_g = reset_g;
            src_b = reset_b;
        }
        if (clip_scan && clip_scan[col] < 255) {
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
        } else {
            dest_scan[2] = src_b;
            dest_scan[1] = src_g;
            dest_scan[0] = src_r;
        }
        dest_scan += DestBpp;
    }
}
inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < width; col ++) {
        int src_r, src_g, src_b;
        if (pPalette) {
            FX_ARGB argb = pPalette[*src_scan];
            src_r = FXARGB_R(argb);
            src_g = FXARGB_G(argb);
            src_b = FXARGB_B(argb);
        } else {
            src_r = src_g = src_b = *src_scan;
        }
        if (clip_scan == NULL || clip_scan[col] == 255) {
            dest_scan[2] = FX_GAMMA(src_b);
            dest_scan[1] = FX_GAMMA(src_g);
            dest_scan[0] = FX_GAMMA(src_r);
            dest_scan[3] = 255;
            src_scan ++;
            dest_scan += 4;
            continue;
        }
        int src_alpha = clip_scan[col];
        if (src_alpha == 0) {
            dest_scan += 4;
            src_scan ++;
            continue;
        }
        int back_alpha = dest_scan[3];
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
        dest_scan += 4;
        src_scan ++;
    }
}
inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
{
    int reset_r, reset_g, reset_b;
    int set_r, set_g, set_b;
    if (pPalette) {
        reset_r = FXARGB_R(pPalette[0]);
        reset_g = FXARGB_G(pPalette[0]);
        reset_b = FXARGB_B(pPalette[0]);
        set_r = FXARGB_R(pPalette[1]);
        set_g = FXARGB_G(pPalette[1]);
        set_b = FXARGB_B(pPalette[1]);
    } else {
        reset_r = reset_g = reset_b = 0;
        set_r = set_g = set_b = 255;
    }
    for (int col = 0; col < width; col ++) {
        int src_r, src_g, src_b;
        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
            src_r = set_r;
            src_g = set_g;
            src_b = set_b;
        } else {
            src_r = reset_r;
            src_g = reset_g;
            src_b = reset_b;
        }
        if (clip_scan == NULL || clip_scan[col] == 255) {
            dest_scan[2] = FX_GAMMA(src_b);
            dest_scan[1] = FX_GAMMA(src_g);
            dest_scan[0] = FX_GAMMA(src_r);
            dest_scan[3] = 255;
            dest_scan += 4;
            continue;
        }
        int src_alpha = clip_scan[col];
        if (src_alpha == 0) {
            dest_scan += 4;
            continue;
        }
        int back_alpha = dest_scan[3];
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
        dest_scan += 4;
    }
}
void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
        int blend_type, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
            dest_scan += 4;
            continue;
        }
        if (src_alpha == 0) {
            dest_scan += 4;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            FX_BYTE dest_scan_o[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, dest_scan[2], src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
            blended = _BLEND(blend_type, dest_scan[1], src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
            blended = _BLEND(blend_type, dest_scan[0], src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
        } else {
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
        }
        dest_scan += 4;
    }
}
void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
        int blend_type, int Bpp, FX_LPCBYTE clip_scan)
{
    for (int col = 0; col < pixel_count; col ++) {
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
        } else {
            src_alpha = mask_alpha * src_scan[col] / 255;
        }
        if (src_alpha == 0) {
            dest_scan += Bpp;
            continue;
        }
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            FX_BYTE dest_scan_o[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, dest_scan[2], src_b);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
            blended = _BLEND(blend_type, dest_scan[1], src_g);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
            blended = _BLEND(blend_type, dest_scan[0], src_r);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
        } else {
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
        }
        dest_scan += Bpp;
    }
}
void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
        int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
{
    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
        for (int col = 0; col < pixel_count; col ++) {
            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
                FXARGB_SETRGBORDERDIB(dest_scan, argb);
            }
            dest_scan += 4;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan += 4;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        FX_BYTE back_alpha = dest_scan[3];
        if (back_alpha == 0) {
            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
            dest_scan += 4;
            continue;
        }
        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
        dest_scan[3] = dest_alpha;
        int alpha_ratio = src_alpha * 255 / dest_alpha;
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            FX_BYTE dest_scan_o[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
        } else if (blend_type) {
            int blended = _BLEND(blend_type, dest_scan[2], src_b);
            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
            blended = _BLEND(blend_type, dest_scan[1], src_g);
            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
            blended = _BLEND(blend_type, dest_scan[0], src_r);
            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
        } else {
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
        }
        dest_scan += 4;
    }
}
void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
        int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
{
    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
        for (int col = 0; col < pixel_count; col ++) {
            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
                dest_scan[2] = src_b;
                dest_scan[1] = src_g;
                dest_scan[0] = src_r;
            }
            dest_scan += Bpp;
        }
        return;
    }
    for (int col = 0; col < pixel_count; col ++) {
        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
            dest_scan += Bpp;
            continue;
        }
        int src_alpha;
        if (clip_scan) {
            src_alpha = mask_alpha * clip_scan[col] / 255;
        } else {
            src_alpha = mask_alpha;
        }
        if (src_alpha == 0) {
            dest_scan += Bpp;
            continue;
        }
        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
            int blended_colors[3];
            FX_BYTE src_scan[3];
            FX_BYTE dest_scan_o[3];
            src_scan[0] = src_b;
            src_scan[1] = src_g;
            src_scan[2] = src_r;
            dest_scan_o[0] = dest_scan[2];
            dest_scan_o[1] = dest_scan[1];
            dest_scan_o[2] = dest_scan[0];
            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
        } else if (blend_type) {
            int back_color = FX_GAMMA(dest_scan[2]);
            int blended = _BLEND(blend_type, back_color, src_b);
            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
            back_color = FX_GAMMA(dest_scan[1]);
            blended = _BLEND(blend_type, back_color, src_g);
            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
            back_color = FX_GAMMA(dest_scan[0]);
            blended = _BLEND(blend_type, back_color, src_r);
            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
        } else {
            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
        }
        dest_scan += Bpp;
    }
}
inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
        int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
        void* icc_module, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
    if (alpha_flag >> 8) {
        mask_alpha = alpha_flag & 0xff;
        mask_red = FXSYS_GetCValue(mask_color);
        mask_green = FXSYS_GetMValue(mask_color);
        mask_blue = FXSYS_GetYValue(mask_color);
        mask_black = FXSYS_GetKValue(mask_color);
    } else {
        mask_alpha = FXARGB_A(mask_color);
        mask_red = FXARGB_R(mask_color);
        mask_green = FXARGB_G(mask_color);
        mask_blue = FXARGB_B(mask_color);
    }
    if (dest_format == FXDIB_8bppMask) {
        return TRUE;
    }
    if ((dest_format & 0xff) == 8) {
        if (pIccTransform) {
            mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
            FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
            pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
            mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
        } else {
            if (alpha_flag >> 8) {
                FX_BYTE r, g, b;
                AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
                                   r, g, b);
                mask_red = FXRGB2GRAY(r, g, b);
            } else {
                mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
            }
            if (dest_format & 0x0400) {
                mask_red = FX_CCOLOR(mask_red);
            }
        }
    } else {
        FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
        mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
        if (pIccTransform) {
            pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);
            mask_red = mask_color_p[2];
            mask_green = mask_color_p[1];
            mask_blue = mask_color_p[0];
        } else if (alpha_flag >> 8) {
            AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],
                               mask_color_p[2], mask_color_p[1], mask_color_p[0]);
            mask_red = mask_color_p[2];
            mask_green = mask_color_p[1];
            mask_blue = mask_color_p[0];
        }
    }
    return TRUE;
}
inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,
        FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
        void* icc_module, void* pIccTransform)
{
    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
    FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
    FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
    pDestPalette = NULL;
    if (pIccTransform) {
        if (pSrcPalette) {
            if ((dest_format & 0xff) == 8) {
                int pal_count = 1 << (src_format & 0xff);
                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
                if (!gray_pal) {
                    return;
                }
                pDestPalette = (FX_DWORD*)gray_pal;
                for (int i = 0; i < pal_count; i ++) {
                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
                    pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
                    gray_pal ++;
                }
            } else {
                int palsize = 1 << (src_format & 0xff);
                pDestPalette = FX_Alloc(FX_DWORD, palsize);
                if (!pDestPalette) {
                    return;
                }
                for (int i = 0; i < palsize; i ++) {
                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
                }
            }
        } else {
            int pal_count = 1 << (src_format & 0xff);
            FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
            if (!gray_pal) {
                return;
            }
            if (pal_count == 2) {
                gray_pal[0] = 0;
                gray_pal[1] = 255;
            } else {
                for (int i = 0; i < pal_count; i++) {
                    gray_pal[i] = i;
                }
            }
            if ((dest_format & 0xff) == 8) {
                pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
                pDestPalette = (FX_DWORD*)gray_pal;
            } else {
                pDestPalette = FX_Alloc(FX_DWORD, pal_count);
                if (!pDestPalette) {
                    FX_Free(gray_pal);
                    return;
                }
                for (int i = 0; i < pal_count; i ++) {
                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
                }
                FX_Free(gray_pal);
            }
        }
    } else {
        if (pSrcPalette) {
            if ((dest_format & 0xff) == 8) {
                int pal_count = 1 << (src_format & 0xff);
                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
                if (!gray_pal) {
                    return;
                }
                pDestPalette = (FX_DWORD*)gray_pal;
                if (isSrcCmyk) {
                    for (int i = 0; i < pal_count; i ++) {
                        FX_CMYK cmyk = pSrcPalette[i];
                        FX_BYTE r, g, b;
                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
                                           r, g, b);
                        *gray_pal ++ = FXRGB2GRAY(r, g, b);
                    }
                } else
                    for (int i = 0; i < pal_count; i ++) {
                        FX_ARGB argb = pSrcPalette[i];
                        *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
                    }
            } else {
                int palsize = 1 << (src_format & 0xff);
                pDestPalette = FX_Alloc(FX_DWORD, palsize);
                if (!pDestPalette) {
                    return;
                }
                if (isDstCmyk == isSrcCmyk) {
                    FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
                } else {
                    for (int i = 0; i < palsize; i ++) {
                        FX_CMYK cmyk = pSrcPalette[i];
                        FX_BYTE r, g, b;
                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
                                           r, g, b);
                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
                    }
                }
            }
        } else {
            if ((dest_format & 0xff) == 8) {
                int pal_count = 1 << (src_format & 0xff);
                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
                if (!gray_pal) {
                    return;
                }
                if (pal_count == 2) {
                    gray_pal[0] = 0;
                    gray_pal[1] = 255;
                } else {
                    for (int i = 0; i < pal_count; i++) {
                        gray_pal[i] = i;
                    }
                }
                pDestPalette = (FX_DWORD*)gray_pal;
            } else {
                int palsize = 1 << (src_format & 0xff);
                pDestPalette = FX_Alloc(FX_DWORD, palsize);
                if (!pDestPalette) {
                    return;
                }
                if (palsize == 2) {
                    pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
                    pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
                } else {
                    for (int i = 0; i < palsize; i++) {
                        pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
                    }
                }
                if (isSrcCmyk != isDstCmyk) {
                    for (int i = 0; i < palsize; i ++) {
                        FX_CMYK cmyk = pDestPalette[i];
                        FX_BYTE r, g, b;
                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
                                           r, g, b);
                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
                    }
                }
            }
        }
    }
}
CFX_ScanlineCompositor::CFX_ScanlineCompositor()
{
    m_pSrcPalette = NULL;
    m_pCacheScanline = NULL;
    m_CacheSize = 0;
    m_bRgbByteOrder = FALSE;
    m_BlendType = FXDIB_BLEND_NORMAL;
}
CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
{
    if (m_pSrcPalette) {
        FX_Free(m_pSrcPalette);
    }
    if (m_pCacheScanline) {
        FX_Free(m_pCacheScanline);
    }
}
FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
                                     FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
{
    m_SrcFormat = src_format;
    m_DestFormat = dest_format;
    m_BlendType = blend_type;
    m_bRgbByteOrder = bRgbByteOrder;
    ICodec_IccModule* pIccModule = NULL;
    if (CFX_GEModule::Get()->GetCodecModule()) {
        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
    }
    if (pIccModule == NULL) {
        pIccTransform = NULL;
    }
    m_pIccTransform = pIccTransform;
    if ((dest_format & 0xff) == 1) {
        return FALSE;
    }
    if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
        return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,
                m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,
                pIccModule, pIccTransform);
    }
    if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {
        return FALSE;
    }
    if ((m_SrcFormat & 0xff) <= 8) {
        if (dest_format == FXDIB_8bppMask) {
            return TRUE;
        }
        _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,
                                              pIccModule, pIccTransform);
        m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)
                         + (dest_format & 0x0200 ? 2 : 0)
                         + (dest_format & 0x0400 ? 4 : 0)
                         + ((src_format & 0xff) == 1 ? 8 : 0);
        return TRUE;
    }
    m_Transparency = (src_format & 0x0200 ? 0 : 1)
                     + (dest_format & 0x0200 ? 0 : 2)
                     + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)
                     + (bClip ? 8 : 0)
                     + (src_format & 0x0400 ? 16 : 0)
                     + (dest_format & 0x0400 ? 32 : 0)
                     + (pIccTransform ? 64 : 0);
    return TRUE;
}
void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
{
    int src_Bpp = (m_SrcFormat & 0xff) >> 3;
    int dest_Bpp = (m_DestFormat & 0xff) >> 3;
    if (m_bRgbByteOrder) {
        switch (m_Transparency) {
            case 0:
            case 4:
            case 8:
            case 12:
                _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
                break;
            case 1:
                _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);
                break;
            case 2:
            case 10:
                _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
                break;
            case 3:
                _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
                break;
            case 5:
                _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);
                break;
            case 6:
            case 14:
                _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
                break;
            case 7:
                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
                break;
            case 9:
                _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
                break;
            case 11:
                _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
                break;
            case 13:
                _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);
                break;
            case 15:
                _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
                break;
        }
        return;
    }
    if (m_DestFormat == FXDIB_8bppMask) {
        if (m_SrcFormat & 0x0200) {
            if (m_SrcFormat == FXDIB_Argb) {
                _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
            } else {
                _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
            }
        } else {
            _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
        }
    } else if ((m_DestFormat & 0xff) == 8) {
        if (m_DestFormat & 0x0400) {
            for (int i = 0; i < width; i ++) {
                *dest_scan = ~*dest_scan;
                dest_scan++;
            }
        }
        if (m_SrcFormat & 0x0200) {
            if (m_DestFormat & 0x0200) {
                _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
            } else {
                _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
            }
        } else {
            if (m_DestFormat & 0x0200) {
                _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);
            } else {
                _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);
            }
        }
        if (m_DestFormat & 0x0400) {
            for (int i = 0; i < width; i ++) {
                *dest_scan = ~*dest_scan;
                dest_scan++;
            }
        }
    } else {
        int dest_Size = width * dest_Bpp + 4;
        if (dest_Size > m_CacheSize) {
            m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
            if (!m_pCacheScanline) {
                return;
            }
            m_CacheSize = dest_Size;
        }
        switch (m_Transparency) {
            case 0:
            case 4:
            case 8:
            case 4+8: {
                    _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,
                                            dst_extra_alpha, src_extra_alpha);
                }
                break;
            case 64:
            case 4+64:
            case 8+64:
            case 4+8+64: {
                    _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,
                                                      dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);
                }
                break;
            case 1:
                _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
                                                    dst_extra_alpha);
                break;
            case 1+64:
                _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,
                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 1+8:
                _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
                                                  dst_extra_alpha);
                break;
            case 1+8+64:
                _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 1+4:
                _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,
                                                      dst_extra_alpha);
                break;
            case 1+4+64:
                _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,
                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 1+4+8:
                _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
                                                    dst_extra_alpha);
                break;
            case 1+4+8+64:
                _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,
                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 2:
            case 2+8:
                _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
                                             src_extra_alpha);
                break;
            case 2+64:
            case 2+8+64:
                _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
                                                       src_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 2+4:
            case 2+4+8:
                _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,
                                               src_extra_alpha);
                break;
            case 2+4+64:
            case 2+4+8+64:
                _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,
                        src_extra_alpha, m_pCacheScanline, m_pIccTransform);
                break;
            case 1+2:
                _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
                break;
            case 1+2+64:
                _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
                        m_pCacheScanline, m_pIccTransform);
                break;
            case 1+2+8:
                _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
                break;
            case 1+2+8+64:
                _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
                        m_pCacheScanline, m_pIccTransform);
                break;
            case 1+2+4:
                _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
                break;
            case 1+2+4+64:
                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,
                        m_pCacheScanline, m_pIccTransform);
                break;
            case 1+2+4+8:
                _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
                break;
            case 1+2+4+8+64:
                _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,
                        m_pCacheScanline, m_pIccTransform);
                break;
        }
    }
}
void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
{
    if (m_bRgbByteOrder) {
        if (m_SrcFormat == FXDIB_1bppRgb) {
            if (m_DestFormat == FXDIB_8bppRgb) {
                return;
            } else if(m_DestFormat == FXDIB_Argb) {
                _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
            } else {
                _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
            }
        } else {
            if (m_DestFormat == FXDIB_8bppRgb) {
                return;
            } else if (m_DestFormat == FXDIB_Argb) {
                _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
            } else {
                _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
            }
        }
        return;
    }
    if (m_DestFormat == FXDIB_8bppMask) {
        _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
        return;
    } else if ((m_DestFormat & 0xff) == 8) {
        if (m_Transparency & 8) {
            if (m_DestFormat & 0x0200) {
                _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
            } else {
                _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
            }
        } else {
            if (m_DestFormat & 0x0200)
                _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
                                            dst_extra_alpha, src_extra_alpha);
            else
                _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
                                           src_extra_alpha);
        }
    } else {
        switch (m_Transparency) {
            case 1+2:
                _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,
                                                   src_extra_alpha);
                break;
            case 1+2+8:
                _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
                break;
            case 0:
                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
                                                  src_extra_alpha);
                break;
            case 0+8:
                _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
                break;
            case 0+2:
                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
                                                  src_extra_alpha);
                break;
            case 0+2+8:
                _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,
                                                   dst_extra_alpha);
                break;
                break;
        }
    }
}
void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
        FX_LPBYTE dst_extra_alpha)
{
    if (m_DestFormat == FXDIB_8bppMask) {
        _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
    } else if ((m_DestFormat & 0xff) == 8) {
        if (m_DestFormat & 0x0200) {
            _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);
        } else {
            _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
        }
    } else if (m_bRgbByteOrder) {
        if (m_DestFormat == FXDIB_Argb)
            _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                    width, m_BlendType, clip_scan);
        else
            _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                                    width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
        return;
    } else if (m_DestFormat == FXDIB_Argb)
        _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                    width, m_BlendType, clip_scan);
    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
        _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                   width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
    else if (m_DestFormat == FXDIB_Rgba)
        _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                    width, m_BlendType, clip_scan, dst_extra_alpha);
}
void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
        FX_LPBYTE dst_extra_alpha)
{
    if (m_DestFormat == FXDIB_8bppMask) {
        _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
    } else if ((m_DestFormat & 0xff) == 8) {
        if (m_DestFormat & 0x0200)
            _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,
                                        dst_extra_alpha);
        else {
            _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);
        }
    } else if (m_bRgbByteOrder) {
        if (m_DestFormat == FXDIB_Argb)
            _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                                    src_left, width, m_BlendType, clip_scan);
        else
            _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                                   src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
        return;
    } else if (m_DestFormat == FXDIB_Argb)
        _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                   src_left, width, m_BlendType, clip_scan);
    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
        _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
                                  src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
}
FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,
                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
                                      int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)
{
    if (m_pBuffer == NULL) {
        return FALSE;
    }
    ASSERT(!pSrcBitmap->IsAlphaMask());
    ASSERT(m_bpp >= 8);
    if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
        return FALSE;
    }
    GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
                   src_left, src_top, pClipRgn);
    if (width == 0 || height == 0) {
        return TRUE;
    }
    const CFX_DIBitmap* pClipMask = NULL;
    FX_RECT clip_box;
    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
        pClipMask = pClipRgn->GetMask();
        clip_box = pClipRgn->GetBox();
    }
    CFX_ScanlineCompositor compositor;
    if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,
                         pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {
        return FALSE;
    }
    int dest_Bpp = m_bpp / 8;
    int src_Bpp = pSrcBitmap->GetBPP() / 8;
    FX_BOOL bRgb = FALSE;
    FX_BOOL bCmyk = FALSE;
    if (src_Bpp > 1) {
        if (pSrcBitmap->IsCmykImage()) {
            bCmyk = TRUE;
        } else {
            bRgb = TRUE;
        }
    }
    CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
    for (int row = 0; row < height; row ++) {
        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
        FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;
        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
        FX_LPCBYTE clip_scan = NULL;
        if (pClipMask) {
            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
        }
        if (bRgb) {
            compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
        } else {
            compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
        }
    }
    return TRUE;
}
FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,
                                    const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
                                    int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
{
    if (m_pBuffer == NULL) {
        return FALSE;
    }
    ASSERT(pMask->IsAlphaMask());
    ASSERT(m_bpp >= 8);
    if (!pMask->IsAlphaMask() || m_bpp < 8) {
        return FALSE;
    }
    GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);
    if (width == 0 || height == 0) {
        return TRUE;
    }
    int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
    if (src_alpha == 0) {
        return TRUE;
    }
    const CFX_DIBitmap* pClipMask = NULL;
    FX_RECT clip_box;
    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
        pClipMask = pClipRgn->GetMask();
        clip_box = pClipRgn->GetBox();
    }
    int src_bpp = pMask->GetBPP();
    int Bpp = GetBPP() / 8;
    CFX_ScanlineCompositor compositor;
    if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
        return FALSE;
    }
    for (int row = 0; row < height; row ++) {
        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
        FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
        FX_LPCBYTE clip_scan = NULL;
        if (pClipMask) {
            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
        }
        if (src_bpp == 1) {
            compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);
        } else {
            compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);
        }
    }
    return TRUE;
}
FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)
{
    if (m_pBuffer == NULL) {
        return FALSE;
    }
    int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
    if (src_alpha == 0) {
        return TRUE;
    }
    FX_RECT rect(left, top, left + width, top + height);
    rect.Intersect(0, 0, m_Width, m_Height);
    if (rect.IsEmpty()) {
        return TRUE;
    }
    width = rect.Width();
    FX_DWORD dst_color;
    if (alpha_flag >> 8) {
        dst_color = FXCMYK_TODIB(color);
    } else {
        dst_color = FXARGB_TODIB(color);
    }
    FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
    if (m_bpp == 8) {
        FX_BYTE gray = 255;
        if (!IsAlphaMask()) {
            if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
                ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
                pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
            } else {
                if (alpha_flag >> 8) {
                    FX_BYTE r, g, b;
                    AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],
                                       r, g, b);
                    gray = FXRGB2GRAY(r, g, b);
                } else {
                    gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
                }
            }
            if (IsCmykImage()) {
                gray = ~gray;
            }
        }
        for (int row = rect.top; row < rect.bottom; row ++) {
            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
            if (src_alpha == 255) {
                FXSYS_memset8(dest_scan, gray, width);
            } else
                for (int col = 0; col < width; col ++) {
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
                    dest_scan ++;
                }
        }
        return TRUE;
    } else if (m_bpp == 1) {
        ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
        int left_shift = rect.left % 8;
        int right_shift = rect.right % 8;
        int width = rect.right / 8 - rect.left / 8;
        int index = 0;
        if (m_pPalette == NULL) {
            index = ((FX_BYTE)color == 0xff) ? 1 : 0;
        } else {
            for (int i = 0; i < 2; i ++)
                if (m_pPalette[i] == color) {
                    index = i;
                }
        }
        for (int row = rect.top; row < rect.bottom; row ++) {
            FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
            FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
            FX_BYTE left_flag =  *dest_scan_top & (255 << (8 - left_shift));
            FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
            if (width) {
                FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
                if (!index) {
                    *dest_scan_top &= left_flag;
                    *dest_scan_top_r &= right_flag;
                } else {
                    *dest_scan_top |= ~left_flag;
                    *dest_scan_top_r |= ~right_flag;
                }
            } else {
                if (!index) {
                    *dest_scan_top &= left_flag | right_flag;
                } else {
                    *dest_scan_top |= ~(left_flag | right_flag);
                }
            }
        }
        return TRUE;
    }
    ASSERT(m_bpp >= 24);
    if (m_bpp < 24) {
        return FALSE;
    }
    if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
    } else {
        if (alpha_flag >> 8 && !IsCmykImage())
            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
                               color_p[2], color_p[1], color_p[0]);
        else if (!(alpha_flag >> 8) && IsCmykImage()) {
            return FALSE;
        }
    }
    if(!IsCmykImage()) {
        color_p[3] = (FX_BYTE)src_alpha;
    }
    int Bpp = m_bpp / 8;
    FX_BOOL bAlpha = HasAlpha();
    FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
    if (src_alpha == 255) {
        for (int row = rect.top; row < rect.bottom; row ++) {
            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
            FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;
            if (dest_scan_alpha) {
                FXSYS_memset8(dest_scan_alpha, 0xff, width);
            }
            if (Bpp == 4) {
                FX_DWORD* scan = (FX_DWORD*)dest_scan;
                for (int col = 0; col < width; col ++) {
                    *scan ++ = dst_color;
                }
            } else {
                for (int col = 0; col < width; col ++) {
                    *dest_scan ++ = color_p[0];
                    *dest_scan ++ = color_p[1];
                    *dest_scan ++ = color_p[2];
                }
            }
        }
        return TRUE;
    }
    for (int row = rect.top; row < rect.bottom; row ++) {
        FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
        if (bAlpha) {
            if (bArgb) {
                for (int col = 0; col < width; col ++) {
                    FX_BYTE back_alpha = dest_scan[3];
                    if (back_alpha == 0) {
                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
                        dest_scan += 4;
                        continue;
                    }
                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                    int alpha_ratio = src_alpha * 255 / dest_alpha;
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
                    dest_scan ++;
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
                    dest_scan ++;
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
                    dest_scan ++;
                    *dest_scan++ = dest_alpha;
                }
            } else {
                FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
                for (int col = 0; col < width; col ++) {
                    FX_BYTE back_alpha = *dest_scan_alpha;
                    if (back_alpha == 0) {
                        *dest_scan_alpha++ = src_alpha;
                        FXSYS_memcpy32(dest_scan, color_p, Bpp);
                        dest_scan += Bpp;
                        continue;
                    }
                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
                    *dest_scan_alpha ++ = dest_alpha;
                    int alpha_ratio = src_alpha * 255 / dest_alpha;
                    for(int comps = 0; comps < Bpp; comps ++) {
                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
                        dest_scan ++;
                    }
                }
            }
        } else {
            for (int col = 0; col < width; col ++) {
                for(int comps = 0; comps < Bpp; comps ++) {
                    if (comps == 3) {
                        *dest_scan ++ = 255;
                        continue;
                    }
                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
                    dest_scan ++;
                }
            }
        }
    }
    return TRUE;
}
CFX_BitmapComposer::CFX_BitmapComposer()
{
    m_pScanlineV = NULL;
    m_pScanlineAlphaV = NULL;
    m_pClipScanV = NULL;
    m_pAddClipScan = NULL;
    m_bRgbByteOrder = FALSE;
    m_BlendType = FXDIB_BLEND_NORMAL;
}
CFX_BitmapComposer::~CFX_BitmapComposer()
{
    if (m_pScanlineV) {
        FX_Free(m_pScanlineV);
    }
    if (m_pScanlineAlphaV) {
        FX_Free(m_pScanlineAlphaV);
    }
    if (m_pClipScanV) {
        FX_Free(m_pClipScanV);
    }
    if (m_pAddClipScan) {
        FX_Free(m_pAddClipScan);
    }
}
void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
                                 FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
                                 FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,
                                 int alpha_flag, void* pIccTransform, int blend_type)
{
    m_pBitmap = pDest;
    m_pClipRgn = pClipRgn;
    m_DestLeft = dest_rect.left;
    m_DestTop = dest_rect.top;
    m_DestWidth = dest_rect.Width();
    m_DestHeight = dest_rect.Height();
    m_BitmapAlpha = bitmap_alpha;
    m_MaskColor = mask_color;
    m_pClipMask = NULL;
    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
        m_pClipMask = pClipRgn->GetMask();
    }
    m_bVertical = bVertical;
    m_bFlipX = bFlipX;
    m_bFlipY = bFlipY;
    m_AlphaFlag = alpha_flag;
    m_pIccTransform = pIccTransform;
    m_bRgbByteOrder = bRgbByteOrder;
    m_BlendType = blend_type;
}
FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
{
    m_SrcFormat = src_format;
    if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,
                           m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {
        return FALSE;
    }
    if (m_bVertical) {
        m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
        if (!m_pScanlineV) {
            return FALSE;
        }
        m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
        if (!m_pClipScanV) {
            return FALSE;
        }
        if (m_pBitmap->m_pAlphaMask) {
            m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
            if (!m_pScanlineAlphaV) {
                return FALSE;
            }
        }
    }
    if (m_BitmapAlpha < 255) {
        m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
        if (!m_pAddClipScan) {
            return FALSE;
        }
    }
    return TRUE;
}
void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
                                   FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
{
    if (m_BitmapAlpha < 255) {
        if (clip_scan) {
            for (int i = 0; i < dest_width; i ++) {
                m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
            }
        } else {
            FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
        }
        clip_scan = m_pAddClipScan;
    }
    if (m_SrcFormat == FXDIB_8bppMask) {
        m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
    } else if ((m_SrcFormat & 0xff) == 8) {
        m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
    } else {
        m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
    }
}
void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
{
    if (m_bVertical) {
        ComposeScanlineV(line, scanline, scan_extra_alpha);
        return;
    }
    FX_LPCBYTE clip_scan = NULL;
    if (m_pClipMask)
        clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *
                    m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);
    FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
                          m_DestLeft * m_pBitmap->GetBPP() / 8;
    FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
                                (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;
    DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);
}
void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
{
    int i;
    int Bpp = m_pBitmap->GetBPP() / 8;
    int dest_pitch = m_pBitmap->GetPitch();
    int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
    int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
    FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
    FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
                               m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;
    if (m_bFlipY) {
        dest_buf += dest_pitch * (m_DestHeight - 1);
        dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
    }
    int y_step = dest_pitch;
    int y_alpha_step = dest_alpha_pitch;
    if (m_bFlipY) {
        y_step = -y_step;
        y_alpha_step = -y_alpha_step;
    }
    FX_LPBYTE src_scan = m_pScanlineV;
    FX_LPBYTE dest_scan = dest_buf;
    for (i = 0; i < m_DestHeight; i ++) {
        for (int j = 0; j < Bpp; j ++) {
            *src_scan++ = dest_scan[j];
        }
        dest_scan += y_step;
    }
    FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
    FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
    if (dest_alpha_scan) {
        for (i = 0; i < m_DestHeight; i ++) {
            *src_alpha_scan++ = *dest_alpha_scan;
            dest_alpha_scan += y_alpha_step;
        }
    }
    FX_LPBYTE clip_scan = NULL;
    if (m_pClipMask) {
        clip_scan = m_pClipScanV;
        int clip_pitch = m_pClipMask->GetPitch();
        FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *
                              clip_pitch + (dest_x - m_pClipRgn->GetBox().left);
        if (m_bFlipY) {
            src_clip += clip_pitch * (m_DestHeight - 1);
            clip_pitch = -clip_pitch;
        }
        for (i = 0; i < m_DestHeight; i ++) {
            clip_scan[i] = *src_clip;
            src_clip += clip_pitch;
        }
    }
    DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
    src_scan = m_pScanlineV;
    dest_scan = dest_buf;
    for (i = 0; i < m_DestHeight; i ++) {
        for (int j = 0; j < Bpp; j ++) {
            dest_scan[j] = *src_scan++;
        }
        dest_scan += y_step;
    }
    src_alpha_scan = m_pScanlineAlphaV;
    dest_alpha_scan = dest_alpha_buf;
    if (dest_alpha_scan) {
        for (i = 0; i < m_DestHeight; i ++) {
            *dest_alpha_scan = *src_alpha_scan++;
            dest_alpha_scan += y_alpha_step;
        }
    }
}
