colormap.c

来自「linux下的一款播放器」· C语言 代码 · 共 807 行 · 第 1/2 页

C
807
字号
        cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _BITMAP) ||        (lpcidd = ciddTbl[cid].lpBitmapCIDD) == NULL)        return -1;    /* set color-format releated fields in BITMAPINFO: */    lpHXbi->bmiHeader.biCompression = lpcidd->dwFourCC;    lpHXbi->bmiHeader.biBitCount    = (UINT16)lpcidd->dwBitCount;    /* set color masks: */    if (lpcidd->dwFlags & _BITMASK) {        /* get offset of color masks in the bitmap: */        ULONG32 *lpColors = (ULONG32*)&lpHXbi->un.dwBitMask[0];        lpColors[0] = lpcidd->dwBitMask[0];        lpColors[1] = lpcidd->dwBitMask[1];        lpColors[2] = lpcidd->dwBitMask[2];    }    /* success: */    return 0;}/* * Calculates the size of an image with a given color format. */static int ImageSize (int cid, ULONG32 dwWidth, ULONG32 dwHeight){    int pitch, size;    /* do it in a lazy way: */    switch (cid) {        /* planar YUV 4:2:0 formats: */        case CID_I420:        case CID_YV12:            size = dwHeight * dwWidth * 3 / 2;            break;        /* YUV 9 format: */       case CID_YUVA:           size = (dwHeight * dwWidth) * 5 / 2;           break;        case CID_YVU9:            size = dwHeight * dwWidth * 9 / 8;            break;        /* packet YUV 4:2:2 formats: */        case CID_YUY2:        case CID_UYVY:            size = dwHeight * dwWidth * 2;            break;        /* RGB formats: */        case CID_RGB32:        case CID_ARGB32:        case CID_RGB24:        case CID_RGB565:        case CID_RGB555:        case CID_RGB8:        case CID_BGR32:        case CID_BGR24:        case CID_RGB32S:        case CID_RGB444:            pitch = dwWidth * ciddTbl[cid].nBPP;            pitch = (pitch + 3) & ~3;            size = dwHeight * pitch;			break;        /* the other formats: */        default:            size = 0; /* no idea what size should be??? */    }    return size;}/* * Get pitch of the bitmap image. * Use: *  int GetBitmapPitch (LPBITMAPINFO lpbi); * Input: *  lpbi - pointer to BITMAPINFO structure containing image format * Returns: *  !0 -- pitch of the bitmap image; <0 if bottom-up bitmap *  0 - unrecognized bitmap format */#ifdef _WIN32int GetBitmapPitch (LPBITMAPINFO lpbi)#else      int GetBitmapPitch (HXBitmapInfo* lpbi)#endif      {    register int cid, pitch;    /* check bitmap pointer & format: */    cid = GetBitmapColor (lpbi);    if (cid == CID_UNKNOWN || !(ciddTbl[cid].dwFlags & _BITMAP))        return 0;    if (cid == CID_XING)        return 768;        /* calculate image pitch: */    pitch = lpbi->bmiHeader.biWidth * ciddTbl[cid].nBPP;    if (ciddTbl[cid].dwFlags & (_RGB|_BGR))#if defined(_MACINTOSH) || defined(_UNIX)        pitch = ((pitch + 3) & ~3);#else        pitch = -((pitch + 3) & ~3);#endif    /* return pitch: */    return pitch;}/* * Get size of the bitmap image. * Use: *  int GetBitmapImageSize (LPBITMAPINFO lpbi); * Input: *  lpbi - pointer to BITMAPINFO structure containing image format * Returns: *  !0 -- size of the bitmap image *  0 - unrecognized bitmap format */#ifdef _WIN32int GetBitmapImageSize (LPBITMAPINFO lpbi)#else      int GetBitmapImageSize (HXBitmapInfo* lpbi)#endif      {    /* check bitmap pointer & format: */    register int cid = GetBitmapColor (lpbi);    if (cid == CID_UNKNOWN ||        !(ciddTbl[cid].dwFlags & _BITMAP) ||        lpbi->bmiHeader.biWidth <= 0 ||        lpbi->bmiHeader.biHeight <= 0 ||        lpbi->bmiHeader.biPlanes != 1)        return 0;    return ImageSize (cid, lpbi->bmiHeader.biWidth, lpbi->bmiHeader.biHeight);}/* * Build a bitmap structure. * Use: *  int MakeBitmap (LPBITMAPINFO lpbi, int nBISize, *   int cid, ULONG32 dwWidth, ULONG32 dwHeight, LPPALETTEENTRY lppe, int nColors); * Input: *  lpbi - pointer to BITMAPINFO structure to contain image format *  nBISize - size of memory block allocated for BITMAPINFO structure *  cid - color format to use for bitmap *  dwWidth, dwHeight - image width/height *  lppe, nColors - palette info * Returns: *  !0 - bitmap has been successfully created *  0 - invalid bitmap parameters */#ifdef _WIN32int MakeBitmap (LPBITMAPINFO lpbi, int nBISize,    int cid, ULONG32 dwWidth, ULONG32 dwHeight, LPPALETTEENTRY lppe, int nColors)#elseint MakeBitmap(HXBitmapInfo* lpbi, int nBISize, int cid, ULONG32 dwWidth,               ULONG32 dwHeight, void* lppe, int nColors)#endif      {    const struct _greg* lpcidd;    int setPalette, bitmapinfoSize;    /* check input parameters: */    if (lpbi == NULL ||        cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _BITMAP) ||        (lpcidd = ciddTbl[cid].lpBitmapCIDD) == NULL ||        (int)dwWidth <= 0 || (int)dwHeight <= 0)        return 0;    /* calculate bitmapinfo size: */    setPalette = 0;#ifdef _WIN32        bitmapinfoSize = sizeof(BITMAPINFOHEADER);#else    bitmapinfoSize = sizeof(HXBitmapInfoHeader);#endif        if (lpcidd->dwFlags & _BITMASK)        bitmapinfoSize += 3 * sizeof(ULONG32);    else    if ((lpcidd->dwFlags & (_FOURCC|_BITCOUNT)) == (_FOURCC|_BITCOUNT) &&        lpcidd->dwFourCC == BI_RGB && lpcidd->dwBitCount <= 8 &&        nColors) {        /* check palette parameters: */        if (lppe == NULL || nColors < 0 || nColors > 256)            return 0;#ifdef _WIN32                bitmapinfoSize += nColors * sizeof(PALETTEENTRY);        setPalette = 1;#endif            }    /* check if we have sufficient amount of memory: */    if (nBISize < bitmapinfoSize)        return 0;    /* initialize bitmapinfo structure: */    memset((void *)lpbi, 0, bitmapinfoSize);#ifdef _WIN32        lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);#else    lpbi->bmiHeader.biSize = sizeof(HXBitmapInfoHeader);#endif        /* set image parameters: */    lpbi->bmiHeader.biWidth = dwWidth;    lpbi->bmiHeader.biHeight = dwHeight;    lpbi->bmiHeader.biPlanes = 1;    lpbi->bmiHeader.biSizeImage = ImageSize (cid, dwWidth, dwHeight);    /* set color format: */    SetBitmapColor (lpbi, cid);#ifdef _WIN32    /* set palette: */    if (setPalette)        SetBitmapPalette (lpbi, lppe, nColors);#endif    return bitmapinfoSize;  /* the number of bytes written */}#ifdef _WIN32#ifndef WINCEint SetDirectDrawColor (LPDDPIXELFORMAT lpddpf, int cid){    LPCIDD lpcidd;    /* check input parameters: */    if (lpddpf == NULL ||        lpddpf->dwSize < sizeof(DDPIXELFORMAT) ||        cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _DIRECTDRAW) ||        (lpcidd = ciddTbl[cid].lpDirectDrawCIDD) == NULL)        return -1;    /* set color-format releated fields in DDPIXELFORMAT: */    lpddpf->dwFourCC      = lpcidd->dwFourCC;    lpddpf->dwRGBBitCount = lpcidd->dwBitCount;    lpddpf->dwRBitMask    = lpcidd->dwBitMask[0];    lpddpf->dwGBitMask    = lpcidd->dwBitMask[1];    lpddpf->dwBBitMask    = lpcidd->dwBitMask[2];    /* set control flags: */    lpddpf->dwFlags = (lpddpf->dwFourCC == BI_RGB)? DDPF_RGB: DDPF_FOURCC;    /* success: */    return 0;}#endif/* * Get bitmap palette. * Use: *  int GetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe); * Input: *  lpbi - pointer to BITMAPINFO structure *  lppe - pointer to a buffer to contain palette entries * Returns: *  the number of colors in palette *  0, if bitmap does not use palette. */int GetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe){    int i, n = 0;    /* check input parameters: */    if (lpbi != NULL && lppe != NULL &&        lpbi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) &&        lpbi->bmiHeader.biCompression == BI_RGB &&        lpbi->bmiHeader.biBitCount <= 8) {        /* get pointer to palette entries: */        RGBQUAD *prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->bmiHeader.biSize);        /* get number of entries to process: */        n = lpbi->bmiHeader.biClrUsed;        if (!n) n = 1U << lpbi->bmiHeader.biBitCount; /* !!! */        /* a DIB color table has its colors stored BGR not RGB         * so flip them around: */        for (i = 0; i < n; i ++) {            lppe[i].peRed   = prgb[i].rgbRed;            lppe[i].peGreen = prgb[i].rgbGreen;            lppe[i].peBlue  = prgb[i].rgbBlue;            lppe[i].peFlags = 0;        }    }    /* return # of colors extracted */    return n;}/* * Set bitmap palette. * Use: *  int SetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe, int n); * Input: *  lpbi - pointer to BITMAPINFO structure *  lppe - pointer to a buffer containing palette entries *  n    - the total number of colors in palette * Returns: *  the number of colors set *  0, if bitmap does not use palette. */int SetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe, int nColors){    int i, m, n = 0;    /* check input parameters: */    if (lpbi != NULL && lppe != NULL && nColors > 0 && nColors <= 256 &&        lpbi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) &&        lpbi->bmiHeader.biCompression == BI_RGB &&        lpbi->bmiHeader.biBitCount <= 8) {        /* get pointer to palette entries: */        RGBQUAD *prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->bmiHeader.biSize);        /* check the number of entries to copy: */        m = 1U << lpbi->bmiHeader.biBitCount; /* !!! */        n = nColors; if (n > m) n = m;        /* a DIB color table has its colors stored BGR not RGB         * so flip them around: */        for (i = 0; i < n; i ++) {            prgb[i].rgbRed      = lppe[i].peRed;            prgb[i].rgbGreen    = lppe[i].peGreen;            prgb[i].rgbBlue     = lppe[i].peBlue;            prgb[i].rgbReserved = 0;        }        /* set number of palette entries copied: */        if (i == m) i = 0;  /* !!! */        lpbi->bmiHeader.biClrUsed = i;        lpbi->bmiHeader.biClrImportant = i;    }    /* return # of colors set */    return n;}/* * Check the validity of a bitmap structure. * Use: *  int CheckBitmap (LPBITMAPINFO lpbi); * Input: *  lpbi - pointer to BITMAPINFO structure to check * Returns: *  !0 - bitmap parameters are correct *  0 - otherwise */int CheckBitmap (LPBITMAPINFO lpbi){    /* check bitmap pointer & format: */    register int cid = GetBitmapColor (lpbi);    if (cid == CID_UNKNOWN ||        !(ciddTbl[cid].dwFlags & _BITMAP) ||        lpbi->bmiHeader.biWidth <= 0 ||        lpbi->bmiHeader.biHeight <= 0 ||        lpbi->bmiHeader.biPlanes != 1 ||        lpbi->bmiHeader.biSizeImage != ImageSize (cid, lpbi->bmiHeader.biWidth, lpbi->bmiHeader.biHeight))        return 0;    /* check if image should contain a palette: */    if (lpbi->bmiHeader.biCompression == BI_RGB &&        lpbi->bmiHeader.biBitCount <= 8) {        /* check ## of palette entries: */        unsigned int m = 1U << lpbi->bmiHeader.biBitCount;        if (lpbi->bmiHeader.biClrUsed > m ||            lpbi->bmiHeader.biClrImportant > lpbi->bmiHeader.biClrUsed)            return 0;    } else /* no palette: */    if (lpbi->bmiHeader.biClrUsed != 0 ||        lpbi->bmiHeader.biClrImportant != 0)        return 0;    /* all tests passed... */    return 1;}#endif //_WIN32/* colormap.c -- end of file */

⌨️ 快捷键说明

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