⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap-comm.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "readbmp.h"

// This function expand monochorate bitmap.
void GUIAPI ExpandMonoBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow, 
                             BYTE* bitmap, int pitch, int bg, int fg)
{
    int x, y;
    const BYTE* buf;
    BYTE* dst_line;
    int b = 0;
    int bpp;

    bpp = GAL_BytesPerPixel (dc_HDC2PDC(hdc)->gc);

    if (bits_flow == MYBMP_FLOW_UP)
        buf = my_bits + my_pitch * h;
    else
        buf = my_bits;

    // expand my_bits here.
    for (y = 0; y < h; y++) {
        dst_line = bitmap;

        if (bits_flow == MYBMP_FLOW_UP)
            buf -= my_pitch;
        my_bits = buf;
        for (x = 0; x < w; x++) {
            if (x % 8 == 0)
                b = *my_bits++;
            if ((b & (128 >> (x % 8))))   /* pixel */
                switch (bpp) {
                case 1:
                    *dst_line = fg;
                    dst_line++;
                    break;
                case 2:
                    *(Uint16 *) dst_line = fg;
                    dst_line += 2;
                    break;
                case 3:
                    *(Uint16 *) dst_line = fg;
                    *(dst_line + 2) = fg >> 16;
                    dst_line += 3;
                    break;
                case 4:
                    *(Uint32 *) dst_line = fg;
                    dst_line += 4;
                }
             else              /* background pixel */
                switch (bpp) {
                case 1:
                    *dst_line = bg;
                    dst_line++;
                    break;
                case 2:
                    *(Uint16 *) dst_line = bg;
                    dst_line += 2;
                    break;
                case 3:
                    *(Uint16 *) dst_line = bg;
                    *(dst_line + 2) = bg;
                    dst_line += 3;
                    break;
                case 4:
                    *(Uint32 *) dst_line = bg;
                    dst_line += 4;
                }
        }
        
        if (bits_flow != MYBMP_FLOW_UP)
            buf += my_pitch;

        bitmap += pitch;
    }
}

static const RGB WindowsStdColor [] = {
    {0x00, 0x00, 0x00},     // black         --0
    {0x80, 0x00, 0x00},     // dark red      --1
    {0x00, 0x80, 0x00},     // dark green    --2
    {0x80, 0x80, 0x00},     // dark yellow   --3
    {0x00, 0x00, 0x80},     // dark blue     --4
    {0x80, 0x00, 0x80},     // dark magenta  --5
    {0x00, 0x80, 0x80},     // dark cyan     --6
    {0xC0, 0xC0, 0xC0},     // light gray    --7
    {0x80, 0x80, 0x80},     // dark gray     --8
    {0xFF, 0x00, 0x00},     // red           --9
    {0x00, 0xFF, 0x00},     // green         --10
    {0xFF, 0xFF, 0x00},     // yellow        --11
    {0x00, 0x00, 0xFF},     // blue          --12
    {0xFF, 0x00, 0xFF},     // magenta       --13
    {0x00, 0xFF, 0xFF},     // cyan          --14
    {0xFF, 0xFF, 0xFF},     // light white   --15
};

// This function expand 16-color bitmap.
void GUIAPI Expand16CBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
                            BYTE* bitmap, int pitch, const RGB* pal)
{
    PDC pdc;
    int x, y;
    const BYTE* buf;
    BYTE* dst_line;
    int b = 0;
    int c;
    int bpp;

    pdc = dc_HDC2PDC(hdc);
    bpp = GAL_BytesPerPixel (pdc->gc);

    if (bits_flow == MYBMP_FLOW_UP)
        buf = my_bits + my_pitch * h;
    else
        buf = my_bits;
    // expand my_bits here.
    for (y = 0; y < h; y++) {
        dst_line = bitmap;

        if (bits_flow == MYBMP_FLOW_UP)
            buf -= my_pitch;
        my_bits = buf;
        for (x = 0; x < w; x++) {
            if (x % 2 == 0)
                b = *my_bits++;

            if (x % 2 == 0)
                c = (b >> 4) & 0x0f;
            else
                c = b & 0x0f;

            if (pal)
                c = GAL_MapColor (pdc->gc, (GAL_Color*)(pal + c));
            else
                c = GAL_MapColor (pdc->gc, (GAL_Color*)(WindowsStdColor + c));

            switch (bpp) {
                case 1:
                    *dst_line = c;
                    dst_line++;
                    break;
                case 2:
                    *(Uint16 *) dst_line = c;
                    dst_line += 2;
                    break;
                case 3:
                    *(Uint16 *) dst_line = c;
                    *(dst_line + 2) = c >> 16;
                    dst_line += 3;
                    break;
                case 4:
                    *(Uint32 *) dst_line = c;
                    dst_line += 4;
            }
        }

        if (bits_flow != MYBMP_FLOW_UP)
            buf += my_pitch;

        bitmap += pitch;
    }
}

// This function expands 256-color bitmap.
void GUIAPI Expand256CBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
                             BYTE* bitmap, int pitch, const RGB* pal)
{
    PDC pdc;
    int x, y;
    const BYTE* buf;
    BYTE* dst_line;
    int c;
    int bpp;

    pdc = dc_HDC2PDC (hdc);
    bpp = GAL_BytesPerPixel (pdc->gc);

    if (bits_flow == MYBMP_FLOW_UP)
        buf = my_bits + my_pitch * h;
    else
        buf = my_bits;

    // expand my_bits here.
    for (y = 0; y < h; y++) {
        dst_line = bitmap;

        if (bits_flow == MYBMP_FLOW_UP)
            buf -= my_pitch;
        my_bits = buf;
        for (x = 0; x < w; x++) {
            c = *my_bits++;
            c = GAL_MapColor (pdc->gc, (GAL_Color*)(pal + c));
            
            switch (bpp) {
                case 1:
                    *dst_line = c;
                    dst_line++;
                    break;
                case 2:
                    *(Uint16 *) dst_line = c;
                    dst_line += 2;
                    break;
                case 3:
                    *(Uint16 *) dst_line = c;
                    *(dst_line + 2) = c >> 16;
                    dst_line += 3;
                    break;
                case 4:
                    *(Uint32 *) dst_line = c;
                    dst_line += 4;
            }
        }

        if (bits_flow != MYBMP_FLOW_UP)
            buf += my_pitch;

        bitmap += pitch;
    }
}

// This function compile a RGB bitmap
void GUIAPI CompileRGBBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
                             BYTE* bitmap, int pitch, int rgb_order)
{
    PDC pdc;
    int x, y;
    const BYTE* buf;
    BYTE* dst_line;
    int c;
    GAL_Color rgb;
    int bpp;

    pdc = dc_HDC2PDC (hdc);
    bpp = GAL_BytesPerPixel (pdc->gc);

    if (bits_flow == MYBMP_FLOW_UP)
        buf = my_bits + my_pitch * h;
    else
        buf = my_bits;

    // expand my_bits here.
    for (y = 0; y < h; y++) {
        dst_line = bitmap;

        if (bits_flow == MYBMP_FLOW_UP)
            buf -= my_pitch;
        my_bits = buf;
        for (x = 0; x < w; x++) {
            if (rgb_order == MYBMP_TYPE_BGR) {
                rgb.b = *my_bits++;
                rgb.g = *my_bits++;
                rgb.r = *my_bits++;
            }
            else {
                rgb.r = *my_bits++;
                rgb.g = *my_bits++;
                rgb.b = *my_bits++;
            }
            c = GAL_MapColor (pdc->gc, &rgb);
            
            switch (bpp) {
                case 1:
                    *dst_line = c;
                    dst_line++;
                    break;
                case 2:
                    *(Uint16 *) dst_line = c;
                    dst_line += 2;
                    break;
                case 3:
                    *(Uint16 *) dst_line = c;
                    *(dst_line + 2) = c >> 16;
                    dst_line += 3;
                    break;
                case 4:
                    *(Uint32 *) dst_line = c;
                    dst_line += 4;
            }
        }

        if (bits_flow != MYBMP_FLOW_UP)
            buf += my_pitch;

        bitmap += pitch;
    }
}

// This function replaces one color with specified color.
void GUIAPI ReplaceBitmapColor (HDC hdc, PBITMAP pBitmap, gal_pixel iOColor, gal_pixel iNColor)
{
    PDC pdc;
    int i, size;
    BYTE* bitmap;
    int bpp;

    pdc = dc_HDC2PDC (hdc);
    bpp = GAL_BytesPerPixel (pdc->gc);

    size = pBitmap->bmPitch * pBitmap->bmHeight;
    bitmap = pBitmap->bmBits;

    switch (bpp) {
        case 1:
            for(i=0; i<size; i++) {
                if( *bitmap == iOColor)
                    *bitmap = iNColor;
                bitmap++;
            }
            break;
        case 2:
            for(i=0; i<size; i+=2) {
                if( *(Uint16 *) bitmap == iOColor)
                    *(Uint16 *) bitmap = iNColor;
                bitmap += 2;
            }
            break;
        case 3: 
            for(i=0; i<size; i+=3) {
                if( (*(Uint16 *) bitmap == iOColor) 
                   && (*(bitmap + 2) == (iOColor >> 16)) )
                {
                    *(Uint16 *) bitmap = iNColor;
                    *(bitmap + 2) = iNColor >> 16;
                }
                bitmap += 3;
            }
            break;
        case 4:    
            for(i=0; i<size; i+=4) {
                if( *(Uint32 *) bitmap == iOColor )
                    *(Uint32 *) bitmap = iNColor;
                bitmap += 4;
            }
            break;
    }
}

void GUIAPI DrawHVDotLine (HDC hdc, int x, int y, int w_h, BOOL H_V)
{
    PDC pdc;
    BYTE* bitmap, *vbuff;
    int i, bpp, size;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -