Ignore:
Timestamp:
Aug 18, 2007, 11:35:31 AM (14 years ago)
Author:
Eugene Romanenko
Message:

custom file dialog with preview

File:
1 edited

Legend:

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

    r198 r230  
    7373ULONG  APIENTRY (*pMmioSetHeader)(HMMIO,PVOID,LONG,PLONG,ULONG,ULONG);
    7474USHORT APIENTRY (*pMmioClose)(HMMIO,USHORT);
     75ULONG  APIENTRY (*pMmioIdentifyFile)(PSZ,PMMIOINFO,PMMFORMATINFO,PFOURCC,ULONG,ULONG);
     76ULONG  APIENTRY (*pMmioQueryHeaderLength)(HMMIO,PLONG,ULONG,ULONG);
     77ULONG  APIENTRY (*pMmioGetHeader)(HMMIO,PVOID,LONG,PLONG,ULONG,ULONG);
     78LONG   APIENTRY (*pMmioRead)(HMMIO,PCHAR,LONG);
    7579
    7680static bool loadMMIOFuncs()
     
    8892            break;
    8993        if ( DosQueryProcAddr( mmioHndl, 0, "mmioClose", (PFN *)&pMmioClose ) != 0 )
     94            break;
     95        if ( DosQueryProcAddr( mmioHndl, 0, "mmioIdentifyFile", (PFN *)&pMmioIdentifyFile ) != 0 )
     96            break;
     97        if ( DosQueryProcAddr( mmioHndl, 0, "mmioQueryHeaderLength", (PFN *)&pMmioQueryHeaderLength ) != 0 )
     98            break;
     99        if ( DosQueryProcAddr( mmioHndl, 0, "mmioGetHeader", (PFN *)&pMmioGetHeader ) != 0 )
     100            break;
     101        if ( DosQueryProcAddr( mmioHndl, 0, "mmioRead", (PFN *)&pMmioRead ) != 0 )
    90102            break;
    91103
     
    347359}
    348360
     361
     362HBITMAP LoadBitmap( HAB hab, HDC hdc, HPS *hps, PSZ pszFileName )
     363{
     364    HBITMAP       hbm;
     365    MMIOINFO      mmioinfo;
     366    MMFORMATINFO  mmFormatInfo;
     367    HMMIO         hmmio;
     368    ULONG         ulImageHeaderLength;
     369    MMIMAGEHEADER mmImgHdr;
     370    ULONG         ulBytesRead;
     371    ULONG         dwNumRowBytes;
     372    PBYTE         pRowBuffer;
     373    ULONG         dwRowCount;
     374    SIZEL         ImageSize;
     375    ULONG         dwHeight, dwWidth;
     376    SHORT         wBitCount;
     377    FOURCC        fccStorageSystem;
     378    ULONG         dwPadBytes;
     379    ULONG         dwRowBits;
     380    ULONG         ulReturnCode;
     381    ULONG         dwReturnCode;
     382    HBITMAP       hbReturnCode;
     383    LONG          lReturnCode;
     384    FOURCC        fccIOProc;
     385
     386
     387    ulReturnCode = pMmioIdentifyFile( pszFileName, 0L, &mmFormatInfo,
     388                                      &fccStorageSystem, 0L, 0L );
     389    if ( ulReturnCode == MMIO_ERROR ) {
     390         return NULLHANDLE;
     391    }
     392
     393    if( mmFormatInfo.fccIOProc == FOURCC_DOS ) {
     394         return NULLHANDLE;
     395    }
     396
     397    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
     398         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) ) {
     399         return NULLHANDLE;
     400    }
     401    else {
     402         fccIOProc = mmFormatInfo.fccIOProc;
     403    }
     404
     405    memset( &mmioinfo, 0L, sizeof( MMIOINFO ) );
     406    mmioinfo.fccIOProc = fccIOProc;
     407    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
     408
     409    hmmio = pMmioOpen( (PSZ)pszFileName, &mmioinfo,
     410                      MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
     411
     412    if ( !hmmio ) {
     413         return NULLHANDLE;
     414    }
     415
     416    dwReturnCode = pMmioQueryHeaderLength( hmmio, (PLONG)&ulImageHeaderLength, 0L, 0L );
     417
     418    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) ) {
     419         pMmioClose( hmmio, 0L );
     420         return NULLHANDLE;
     421    }
     422
     423    ulReturnCode = pMmioGetHeader( hmmio, &mmImgHdr, sizeof( MMIMAGEHEADER ),
     424                                   (PLONG)&ulBytesRead, 0L, 0L );
     425
     426    if ( ulReturnCode != MMIO_SUCCESS ) {
     427         pMmioClose( hmmio, 0L );
     428         return NULLHANDLE;
     429    }
     430
     431    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
     432    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
     433    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
     434    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
     435    dwNumRowBytes = dwRowBits >> 3;
     436
     437    if ( dwRowBits % 8 ) {
     438         dwNumRowBytes++;
     439    }
     440
     441    dwPadBytes = ( dwNumRowBytes % 4 );
     442
     443    if ( dwPadBytes ) {
     444         dwNumRowBytes += 4 - dwPadBytes;
     445    }
     446
     447    pRowBuffer = (PBYTE)malloc( dwNumRowBytes );
     448
     449    ImageSize.cx = dwWidth;
     450    ImageSize.cy = dwHeight;
     451
     452    *hps = GpiCreatePS( hab, hdc, &ImageSize,
     453                        PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC );
     454
     455    if ( !*hps ) {
     456        free( pRowBuffer );
     457        pMmioClose( hmmio, 0L );
     458        return NULLHANDLE;
     459    }
     460
     461    hbm = GpiCreateBitmap( *hps, &mmImgHdr.mmXDIBHeader.BMPInfoHeader2, 0L, NULL, NULL );
     462
     463    if ( !hbm )
     464    {
     465        free( pRowBuffer );
     466        pMmioClose( hmmio, 0L );
     467        return NULLHANDLE;
     468    }
     469
     470    hbReturnCode = GpiSetBitmap( *hps, hbm );
     471
     472    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
     473    {
     474         ulBytesRead = pMmioRead( hmmio, pRowBuffer, dwNumRowBytes );
     475
     476         if ( !ulBytesRead ) {
     477              break;
     478         }
     479
     480         lReturnCode = GpiSetBitmapBits( *hps, dwRowCount, 1, pRowBuffer,
     481                                         (PBITMAPINFO2)&mmImgHdr.mmXDIBHeader.BMPInfoHeader2 );
     482    }
     483
     484    pMmioClose( hmmio, 0L );
     485    free( pRowBuffer );
     486
     487    return hbm;
     488}
     489
Note: See TracChangeset for help on using the changeset viewer.