Changeset 231 for trunk/Lucide


Ignore:
Timestamp:
Aug 19, 2007, 5:41:40 PM (14 years ago)
Author:
Eugene Romanenko
Message:

load icon EA/pmview thhumbnails for preview

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/SOURCE/gui/lcdfdlg.cpp

    r230 r231  
    2222struct previewData
    2323{
    24     PFNWP   oldPvProc;
    25     HDC     hdc;
    26     HPS     hps;
    27     HBITMAP image;
    28     char    *text;
     24    PFNWP    oldPvProc;
     25    HDC      hdc;
     26    HPS      hps;
     27    HBITMAP  image;
     28    char     *text;
    2929};
    3030
     
    5959                    bmi.cbFix = sizeof( BITMAPINFOHEADER );
    6060                    GpiQueryBitmapParameters( pd->image, &bmi );
     61                    //printf( "bmi.cx: %d,  bmi.cy: %d\n", bmi.cx, bmi.cy );
    6162                    LONG xPos = ( rect.xRight - bmi.cx ) / 2;
    6263                    LONG yPos = ( rect.yTop - bmi.cy ) / 2;
     
    237238                            if ( !strcmp( pFEA2->szName, pszEAname ) )
    238239                            {
    239                                 pEABase = (CHAR*)pFEA2->szName + pFEA2->cbName+1;
    240                                 USHORT len = pFEA2->cbValue;
    241                                 if(len) {
    242                                     pEAValue=malloc( len );
    243                                     memcpy( pEAValue, pEABase, len );
     240                                USHORT len = 0;
     241                                PVOID pValue = NULL;
     242                                pEABase = (CHAR*)pFEA2->szName + pFEA2->cbName + 1;
     243                                if ( pszEAname[0] == '.' ) {
     244                                    len = *(USHORT *)( pEABase + sizeof( USHORT ) );
     245                                    pValue = pEABase + ( sizeof( USHORT ) * 2 );
     246                                }
     247                                else {
     248                                    len = pFEA2->cbValue;
     249                                    pValue = pEABase;
     250                                }
     251                                if ( len )
     252                                {
     253                                    pEAValue = malloc( len );
     254                                    memcpy( pEAValue, pValue, len );
    244255                                    *ealen = len;
    245256                                }
     
    280291}
    281292
     293static BOOL GetPointerBitmaps( HWND hwnd, PBYTE pchIcon, PBITMAPARRAYFILEHEADER2 pbafh2,
     294                               HBITMAP *phbmPointer, HBITMAP *phbmColor, USHORT usIconSize )
     295{
     296    HPS   hps;
     297    USHORT usBitCount, usRGB;
     298    PBITMAPFILEHEADER2 pbfh2;
     299    PBITMAPINFOHEADER2 pbmp2;
     300    USHORT usExtra, usExp;
     301    PBYTE  p;
     302
     303    *phbmPointer = (HBITMAP)0;
     304    *phbmColor   = (HBITMAP)0;
     305
     306    // Is it the correct icon type ?
     307    switch (pbafh2->usType)
     308    {
     309        case BFT_BITMAPARRAY:
     310            pbfh2 = &pbafh2->bfh2;
     311            break;
     312
     313        case BFT_ICON:
     314        case BFT_BMAP:
     315        case BFT_POINTER:
     316        case BFT_COLORICON:
     317        case BFT_COLORPOINTER:
     318            pbfh2 = (PBITMAPFILEHEADER2)pbafh2;
     319            break;
     320
     321        default :
     322            return FALSE;
     323    }
     324    pbmp2 = &pbfh2->bmp2;
     325
     326    // Is it a BITMAPINFOHEADER or BITMAPINFOHEADER2 ?
     327    if (pbmp2->cbFix == sizeof (BITMAPINFOHEADER2))
     328    {
     329        usRGB = sizeof (RGB2);
     330        usBitCount = pbmp2->cBitCount;
     331        if (usIconSize && pbmp2->cx != usIconSize)
     332            return FALSE;
     333    }
     334    else if (pbmp2->cbFix == sizeof (BITMAPINFOHEADER))
     335    {
     336        PBITMAPINFOHEADER pbmp = (PBITMAPINFOHEADER)pbmp2;
     337        usRGB = sizeof (RGB);
     338        usBitCount = pbmp->cBitCount;
     339        if (usIconSize && pbmp->cx != usIconSize)
     340            return FALSE;
     341    }
     342    else  // Unknown length found
     343        return FALSE;
     344
     345    // Create the first pointer by getting the presentation space first
     346    // and than call GpiCreateBitmap
     347    hps = WinGetPS(hwnd);
     348    *phbmPointer = GpiCreateBitmap( hps, pbmp2, CBM_INIT,
     349                                    (PBYTE)pchIcon + pbfh2->offBits, (PBITMAPINFO2)pbmp2 );
     350    if (*phbmPointer == GPI_ERROR)
     351    {
     352        WinReleasePS(hps);
     353        return FALSE;
     354    }
     355    WinReleasePS(hps);
     356
     357    // If it is a color icon than another BITMAPFILEHEADER follow after
     358    // the color information. This color information contains of a number
     359    // of RGB or RGB2 structures. The number depends of the number of colors
     360    // in the bitmap. The number of colors is calculated by looking at
     361    // the Number of bits per pel and using this number as an exponent on 2.
     362    if (pbfh2->usType != BFT_COLORICON && pbfh2->usType != BFT_COLORPOINTER)
     363        return TRUE;
     364
     365    // Calculate beginning of BITMAPFILEHEADER structure 2^Bits_per_pel
     366    for (usExtra = 1, usExp = 0; usExp < usBitCount; usExp++)
     367        usExtra *= 2;
     368
     369    p = (PBYTE)(pbfh2) + (pbfh2->cbSize + usExtra * usRGB);
     370    pbfh2 = (PBITMAPFILEHEADER2)p;
     371    // Get adress of BITMAPINFOHEADER
     372    pbmp2 = &pbfh2->bmp2;
     373
     374    if (pbmp2->cbFix == sizeof (BITMAPINFOHEADER2))
     375    {
     376        if (pbmp2->cBitCount == 1)
     377            return TRUE;
     378    }
     379    else if (pbmp2->cbFix == sizeof (BITMAPINFOHEADER))
     380    {
     381        PBITMAPINFOHEADER pbmp = (PBITMAPINFOHEADER)pbmp2;
     382        if (pbmp->cBitCount == 1)
     383            return TRUE;
     384    }
     385    else  // Unknown length found
     386        return TRUE;
     387
     388    // And create bitmap number 2
     389    hps = WinGetPS(hwnd);
     390    *phbmColor = GpiCreateBitmap( hps, pbmp2, CBM_INIT,
     391                                  (PBYTE)pchIcon + pbfh2->offBits, (PBITMAPINFO2)pbmp2 );
     392    if (*phbmColor == GPI_ERROR)
     393    {
     394        GpiDeleteBitmap(*phbmPointer);
     395        return FALSE;
     396    }
     397    WinReleasePS(hps);
     398    return TRUE;
     399}
     400
     401static HBITMAP IconBufferToBitmap( HWND hwnd, PBYTE pchIcon, USHORT usIconSize )
     402{
     403    static USHORT usDeviceCX = 0;
     404    static USHORT usDeviceCY = 0;
     405    BOOL fContinue, fIconFound;
     406    POINTERINFO PointerInfo;
     407    PBITMAPARRAYFILEHEADER2 pbafh2;
     408    PBYTE p;
     409    HPOINTER hptrIcon = NULLHANDLE;
     410
     411    memset(&PointerInfo, 0, sizeof PointerInfo);
     412
     413    if (!usDeviceCX)
     414    {
     415        usDeviceCX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
     416        usDeviceCY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
     417    }
     418
     419    fIconFound = FALSE;
     420    pbafh2 = (PBITMAPARRAYFILEHEADER2)pchIcon;
     421
     422    switch (pbafh2->usType)
     423    {
     424        case BFT_BITMAPARRAY:
     425            break;
     426        case BFT_ICON:
     427        case BFT_BMAP:
     428        case BFT_POINTER:
     429        case BFT_COLORICON:
     430        case BFT_COLORPOINTER:
     431            if (GetPointerBitmaps( hwnd, pchIcon, pbafh2, &PointerInfo.hbmPointer,
     432                                   &PointerInfo.hbmColor, 0))
     433            {
     434                fIconFound = TRUE;
     435            }
     436            else
     437                return NULLHANDLE;
     438            break;
     439        default :
     440            return NULLHANDLE;
     441    }
     442
     443    // First see if the icon contains an icon for the current device size.
     444    fContinue = TRUE;
     445    while (!fIconFound && fContinue)
     446    {
     447        if (pbafh2->cxDisplay == usDeviceCX && pbafh2->cyDisplay == usDeviceCY)
     448        {
     449            if (GetPointerBitmaps( hwnd, pchIcon, pbafh2, &PointerInfo.hbmPointer,
     450                                   &PointerInfo.hbmColor, usIconSize ))
     451            {
     452                fIconFound = TRUE;
     453                break;
     454            }
     455        }
     456
     457        p = (PBYTE)pchIcon + pbafh2->offNext;
     458        if (!pbafh2->offNext)
     459            break;
     460        pbafh2 = (PBITMAPARRAYFILEHEADER2)p;
     461    }
     462
     463    // Now look for the independed icons
     464    if (!fIconFound)
     465    {
     466        pbafh2 = (PBITMAPARRAYFILEHEADER2)pchIcon;
     467        fContinue = TRUE;
     468        while (fContinue)
     469        {
     470            if (pbafh2->cxDisplay == 0 && pbafh2->cyDisplay == 0)
     471            {
     472                if (GetPointerBitmaps( hwnd, pchIcon, pbafh2, &PointerInfo.hbmPointer,
     473                                       &PointerInfo.hbmColor, usIconSize ))
     474                {
     475                    fIconFound = TRUE;
     476                    break;
     477                }
     478            }
     479
     480            p = (PBYTE)pchIcon + pbafh2->offNext;
     481            if (!pbafh2->offNext)
     482                break;
     483            pbafh2 = (PBITMAPARRAYFILEHEADER2)p;
     484        }
     485    }
     486
     487    // if we still haven't found an icon we take the first icon there is
     488    if (!fIconFound)
     489    {
     490        pbafh2 = (PBITMAPARRAYFILEHEADER2)pchIcon;
     491        if (GetPointerBitmaps( hwnd, pchIcon, pbafh2, &PointerInfo.hbmPointer,
     492                               &PointerInfo.hbmColor, 0 ))
     493        {
     494            fIconFound = TRUE;
     495        }
     496    }
     497
     498    if (!fIconFound)
     499        return NULLHANDLE;
     500
     501    if ( PointerInfo.hbmPointer != NULLHANDLE ) {
     502        GpiDeleteBitmap(PointerInfo.hbmPointer);
     503    }
     504
     505    return PointerInfo.hbmColor;
     506}
     507
    282508static void previewFile( HWND hwnd, const char *fn )
    283509{
     
    322548        free( eadata );
    323549    }
    324 }
    325 
     550    else // eadata == NULL
     551    {
     552        eadata = getEA( fn, ".ICON", &ealen );
     553        if ( eadata != NULL )
     554        {
     555            HBITMAP hbm = IconBufferToBitmap( hwnd, (PBYTE)eadata, ealen );
     556
     557            previewData *pd = (previewData *)WinQueryWindowULong( hwnd, QWL_USER );
     558            pd->image = hbm;
     559            WinInvalidateRect( hwnd, NULL, FALSE );
     560
     561            free( eadata );
     562        }
     563    }
     564}
     565
     566
Note: See TracChangeset for help on using the changeset viewer.