ソフトウェア開発 Win32プログラミング

MaskBltの代わり

戻る


Windows 95でMaskBltと同じようなことをやるコードは以下の通り。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

static const DWORD adwTable[256] = 
{
    0x00000042, 0x00010289, 0x00040C88, 0x000500A9, 0x00020C89, 0x000300AA, 
    0x00060865, 0x000702C5, 0x00080F08, 0x00090245, 0x000C0324, 0x000D0B25, 
    0x000A0329, 0x000B0B2A, 0x000E08A5, 0x000F0001, 0x00100C85, 0x001100A6, 
    0x00140869, 0x001502C9, 0x00120868, 0x001302C8, 0x00165CCA, 0x00171D54, 
    0x00180D59, 0x00191CC8, 0x001C06CA, 0x001D0766, 0x001A06C5, 0x001B0768, 
    0x001E01A5, 0x001F0385, 0x00400F0A, 0x00410249, 0x00440328, 0x00450B29, 
    0x00420D5D, 0x00431CC4, 0x004606C6, 0x0047076A, 0x00480368, 0x004916C5, 
    0x004C0CC8, 0x004D1954, 0x004A0789, 0x004B0605, 0x004E0645, 0x004F0E25, 
    0x00500325, 0x00510B26, 0x005408A9, 0x00550009, 0x005206C9, 0x00530764, 
    0x005601A9, 0x00570389, 0x00580785, 0x00590609, 0x005C0649, 0x005D0E29, 
    0x005A0049, 0x005B18A9, 0x005E1B29, 0x005F00E9, 0x00200F09, 0x00210248, 
    0x00240D55, 0x00251CC5, 0x00220326, 0x00230B24, 0x002606C8, 0x00271868, 
    0x00280369, 0x002916CA, 0x002C0784, 0x002D060A, 0x002A0CC9, 0x002B1D58, 
    0x002E064A, 0x002F0E2A, 0x0030032A, 0x00310B28, 0x003406C4, 0x00351864, 
    0x00320688, 0x00330008, 0x003601A8, 0x00370388, 0x0038078A, 0x00390604, 
    0x003C004A, 0x003D18A4, 0x003A0644, 0x003B0E24, 0x003E1B24, 0x003F00EA, 
    0x00600365, 0x006116C6, 0x00640788, 0x00650606, 0x00620786, 0x00630608, 
    0x00660046, 0x006718A8, 0x006858A6, 0x00690145, 0x006C01E8, 0x006D1785, 
    0x006A01E9, 0x006B178A, 0x006E1E28, 0x006F0C65, 0x00700CC5, 0x00711D5C, 
    0x00740646, 0x00750E26, 0x00720648, 0x00730E28, 0x00761B28, 0x007700E6, 
    0x007801E5, 0x00791786, 0x007C1E24, 0x007D0C69, 0x007A1E29, 0x007B0C68, 
    0x007E0955, 0x007F03C9, 0x008003E9, 0x00810975, 0x00840C48, 0x00851E05, 
    0x00820C49, 0x00831E04, 0x008617A6, 0x008701C5, 0x008800C6, 0x00891B08, 
    0x008C0E08, 0x008D0668, 0x008A0E06, 0x008B0666, 0x008E1D7C, 0x008F0CE5, 
    0x00900C45, 0x00911E08, 0x009417AA, 0x009501C9, 0x009217A9, 0x009301C4, 
    0x00960169, 0x0097588A, 0x00981888, 0x00990066, 0x009C0704, 0x009D07A6, 
    0x009A0709, 0x009B07A8, 0x009E16E6, 0x009F0345, 0x00C000CA, 0x00C11B04, 
    0x00C40E04, 0x00C50664, 0x00C21884, 0x00C3006A, 0x00C60708, 0x00C707AA, 
    0x00C803A8, 0x00C90184, 0x00CC0020, 0x00CD0888, 0x00CA0749, 0x00CB06E4, 
    0x00CE0B08, 0x00CF0224, 0x00D00E0A, 0x00D1066A, 0x00D41D78, 0x00D50CE9, 
    0x00D20705, 0x00D307A4, 0x00D616EA, 0x00D70349, 0x00D80745, 0x00D906E8, 
    0x00DC0B04, 0x00DD0228, 0x00DA1CE9, 0x00DB0D75, 0x00DE0268, 0x00DF08C8, 
    0x00A000C9, 0x00A11B05, 0x00A41885, 0x00A50065, 0x00A20E09, 0x00A30669, 
    0x00A60706, 0x00A707A5, 0x00A803A9, 0x00A90189, 0x00AC0744, 0x00AD06E9, 
    0x00AA0029, 0x00AB0889, 0x00AE0B06, 0x00AF0229, 0x00B00E05, 0x00B10665, 
    0x00B4070A, 0x00B507A9, 0x00B21974, 0x00B30CE8, 0x00B616E9, 0x00B70348, 
    0x00B8074A, 0x00B906E6, 0x00BC1CE4, 0x00BD0D7D, 0x00BA0B09, 0x00BB0226, 
    0x00BE0269, 0x00BF08C9, 0x00E003A5, 0x00E10185, 0x00E40748, 0x00E506E5, 
    0x00E20746, 0x00E306EA, 0x00E61CE8, 0x00E70D79, 0x00E81D74, 0x00E95CE6, 
    0x00EC02E8, 0x00ED0848, 0x00EA02E9, 0x00EB0849, 0x00EE0086, 0x00EF0A08, 
    0x00F00021, 0x00F10885, 0x00F40B0A, 0x00F50225, 0x00F20B05, 0x00F3022A, 
    0x00F60265, 0x00F708C5, 0x00F802E5, 0x00F90845, 0x00FC008A, 0x00FD0A0A, 
    0x00FA0089, 0x00FB0A09, 0x00FE02A9, 0x00FF0062
};

#define FORE_ROP3(dwROP4) (0x00FFFFFF & (dwROP4))
#define BACK_ROP3(dwROP4) adwTable[(BYTE)((dwROP4) >> 24)]
#define DSTCOPY     0x00AA0029
#define DSTERASE    0x00220326

BOOL APIENTRY MaskBlt95(
    HDC hdc, INT x, INT y, INT cx, INT cy,
    HDC hdcSrc, INT xSrc, INT ySrc,
    HBITMAP hbmMask, INT xMask, INT yMask, DWORD dwRop)
{
    HDC hdcMask, hDC1, hDC2;
    HBITMAP hbm2, hbm3;
    HGDIOBJ hbmMaskOld, hbm2Old, hbm3Old;
    DWORD dwRop3;
    
    if (hbmMask == NULL)
    {
        return BitBlt(hdc, x, y, cx, cy, 
                      hdcSrc, xSrc, ySrc, FORE_ROP3(dwRop));
    }

    hdcMask = CreateCompatibleDC(hdc);
    if (hdcMask != NULL)
    {
        hDC1 = CreateCompatibleDC(hdc);
        if (hDC1 != NULL)
        {
            hbm2 = CreateCompatibleBitmap(hdc, cx, cy);
            if (hbm2 != NULL)
            {
                hDC2 = CreateCompatibleDC(hdc);
                if (hDC2 != NULL)
                {
                    hbm3 = CreateCompatibleBitmap(hdc, cx, cy);
                    if (hbm3 != NULL)
                        goto success;
                    DeleteDC(hDC2);
                }
                DeleteObject(hbm2);
            }
            DeleteDC(hDC1);
        }
        DeleteDC(hdcMask);
    }
    return FALSE;

success:
    hbmMaskOld = SelectObject(hdcMask, hbmMask);
    hbm2Old = SelectObject(hDC1, hbm2);
    dwRop3 = BACK_ROP3(dwRop);
    BitBlt(hDC1, 0, 0, cx, cy, hdcSrc, xSrc, ySrc, SRCCOPY);
    BitBlt(hDC1, 0, 0, cx, cy, hdc, x, y, dwRop3);
    BitBlt(hDC1, 0, 0, cx, cy, hdcMask, xMask, yMask, DSTERASE);

    hbm3Old = SelectObject(hDC2, hbm3);
    dwRop3 = FORE_ROP3(dwRop);
    BitBlt(hDC2, 0, 0, cx, cy, hdc, x, y, SRCCOPY);
    BitBlt(hDC2, 0, 0, cx, cy, hdcSrc, xSrc, ySrc, dwRop3);
    BitBlt(hDC2, 0, 0, cx, cy, hdcMask, xMask, yMask, SRCAND);
    BitBlt(hDC1, 0, 0, cx, cy, hDC2, 0, 0, SRCPAINT);
    BitBlt(hdc, x, y, cx, cy, hDC1, 0, 0, SRCCOPY);
    SelectObject(hdcMask, hbmMaskOld);
    SelectObject(hDC1, hbm2Old);
    SelectObject(hDC2, hbm3Old);

    DeleteObject(hbm2);
    DeleteObject(hbm3);
    DeleteDC(hDC1);
    DeleteDC(hDC2);
    DeleteDC(hdcMask);

    return TRUE;
}

ソース: maskblt.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system