Changeset 11 for trunk/savebmp.cpp


Ignore:
Timestamp:
Feb 21, 2018, 1:01:16 AM (7 years ago)
Author:
Gregg Young
Message:

This changes the bitmap save from an internal bitmap or the use of MMOS2 to using GBM. The save code was adapted from GBMv2 by Heiko Nitzsche and Andy Keys. Also fixed the failure of the file dialog to update the file extension name on the first save after a format changes. Non English resources haven't been updated yet. Several more build error warning fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/savebmp.cpp

    r2 r11  
    2020#include <time.h>
    2121
    22 // ** SaveBitmap ********************************************************** /*fold00*/
    23 
    24 VOID SaveBitmap (HBITMAP hbm, HPS hps)
     22#include "gbm\gbm.h"
     23#include "gbm\gbmmem.h"
     24#include "model.h"
     25
     26#define  __PMPRINTF__
     27#include "PMPRINTF.H"
     28
     29/* ------------------------------ */
     30static int StrideOf(const MOD *mod)
    2531{
     32    DebugHereIAm();
     33        return ( ( mod->gbm.w * mod->gbm.bpp + 31 ) / 32 ) * 4;
     34        }
     35/*...e*/
     36
     37/*...sAllocateData:0:*/
     38static BOOL AllocateData(MOD *mod)
     39        {
     40        const unsigned long stride = StrideOf(mod);
     41        if ( (mod->pbData = (UCHAR*) gbmmem_malloc(stride * mod->gbm.h)) == NULL )
     42            return FALSE;
     43        DebugHereIAm();
     44        return TRUE;
     45        }
     46/*...e*/
     47
     48/*...sModCreate:0:*/
     49MOD_ERR ModCreate(
     50        int w, int h, int bpp, const GBMRGB gbmrgb[],
     51        MOD *modNew
     52        )
     53        {
     54        modNew->gbm.w   = w;
     55        modNew->gbm.h   = h;
     56        modNew->gbm.bpp = bpp;
     57        if ( gbmrgb != NULL && bpp != 24 )
     58                memcpy(&(modNew->gbmrgb), gbmrgb, sizeof(GBMRGB) << bpp);
     59        if ( !AllocateData(modNew) )
     60            return MOD_ERR_MEM;
     61        DebugHereIAm();
     62        return MOD_ERR_OK;
     63        }
     64/*...e*/
     65
     66/*MOD_ERR ModCreateFromHPS(
     67        HPS hps, int w, int h, int bpp, //lBitCountScreen > 8 ) ? 24 : lBitCountScreen
     68        MOD *modNew
     69        )*/
     70/*...sModCreateFromHPS:0:*/
     71MOD_ERR ModCreateFromHPS(
     72        HPS hps, int w, int h, int bpp,
     73        MOD *modNew
     74        )
     75        {
     76        MOD_ERR mrc;
     77
     78    #pragma pack(2)
     79        struct
     80                {
     81                BITMAPINFOHEADER2 bmp2;
     82                RGB2 argb2Color[0x100];
     83                } bm;
     84    #pragma pack()
     85
     86        if ( (mrc = ModCreate(w, h, bpp, NULL, modNew)) != MOD_ERR_OK )
     87                return mrc;
     88        DebugHereIAm();
     89        memset(&(bm.bmp2), 0, sizeof(bm.bmp2));
     90        bm.bmp2.cbFix     = sizeof(BITMAPINFOHEADER2);
     91        bm.bmp2.cx        = w;
     92        bm.bmp2.cy        = h;
     93        bm.bmp2.cBitCount = bpp;
     94        bm.bmp2.cPlanes   = 1;
     95        GpiQueryBitmapBits(hps, 0L, h, modNew->pbData, (BITMAPINFO2 *) &bm);
     96
     97        if ( bpp != 24 )
     98                {
     99                int i;
     100                for ( i = 0; i < (1<<bpp); i++ )
     101                        {
     102                        modNew->gbmrgb[i].r = bm.argb2Color[i].bRed  ;
     103                        modNew->gbmrgb[i].g = bm.argb2Color[i].bGreen;
     104                        modNew->gbmrgb[i].b = bm.argb2Color[i].bBlue ;
     105                        }
     106                }
     107        DebugHereIAm();
     108        return MOD_ERR_OK;
     109        }
     110/*...e*/
     111
     112/*MOD_ERR ModWriteToFile(
     113        const MOD *mod,
     114        const CHAR *szFn, const CHAR *szOpt // ""
     115        )*/
     116/*...sModWriteToFile:0:*/
     117MOD_ERR ModWriteToFile(
     118        const MOD *mod,
     119        const CHAR *szFn, const CHAR *szOpt
     120        )
     121        {
     122        GBM_ERR grc;
     123        int fd, ft, flag = 0;
     124        GBMFT gbmft;
     125
     126        if ( (grc = gbm_guess_filetype(szFn, &ft)) != GBM_ERR_OK ) {
     127            return grc;
     128        }
     129        PmpfF(( "file type %i", ft ));
     130        DebugHereIAm();
     131        gbm_query_filetype(ft, &gbmft);
     132        PmpfF(( "file type %i name %s flags %i bpp %i", ft, gbmft.short_name,
     133               gbmft.flags, mod->gbm.bpp));
     134        switch ( mod->gbm.bpp )
     135                {
     136                case 1:         flag = GBM_FT_W1;       break;
     137                case 4:         flag = GBM_FT_W4;       break;
     138                case 8:         flag = GBM_FT_W8;       break;
     139                case 24:        flag = GBM_FT_W24;      break;
     140                default:        flag = 0;       break;
     141                }
     142
     143        if ( (gbmft.flags & flag) == 0 )
     144            return MOD_ERR_SUPPORT;
     145        DebugHereIAm();
     146        if ( (fd = gbm_io_create(szFn, GBM_O_WRONLY)) == -1 )
     147                return MOD_ERR_CREATE;
     148        DebugHereIAm();
     149        if ( (grc = gbm_write(szFn, fd, ft, &(mod->gbm), mod->gbmrgb, mod->pbData, szOpt)) != GBM_ERR_OK )
     150                {
     151                gbm_io_close(fd);
     152                unlink(szFn);
     153                return MOD_ERR_GBM(grc);
     154                }
     155        DebugHereIAm();
     156        gbm_io_close(fd);
     157        DebugHereIAm();
     158        return MOD_ERR_OK;
     159        }
     160/*...e*/
     161// ** SaveBitmap ********************************************************** /*FOLD00*/
     162
     163VOID SaveBitmap (HBITMAP hbm, HPS hps, int width, int height, int bitCount)
     164{
    26165#ifdef _DOLOGMEM_
    27166    LogMem("SaveBitmap", TRUE);
    28167#endif
     168    MOD newmod;
    29169
    30170    if( pset->QueryFileSaveStyle () == FSS_FORCEFILE )
     
    32172        PSZ psz = pset->QueryForceSaveFile();
    33173        psz = AddExtensionToFilename( psz );
    34         SaveBitmapToFile( hbm, psz, hps );
     174        //
     175        /*if( ( pset->QueryFileFormat() == BMF_12 ) ||
     176           ( pset->QueryFileFormat() == BMF_16 ) ||
     177           ( pset->QueryFileFormat() == BMF_20 ) ) {
     178            SaveBitmapToFile( hbm, psz, hps );
     179            DebugHereIAm();
     180        }
     181        else { */
     182            ModCreateFromHPS( hps, width, height,
     183                             (bitCount > 8 ) ? 24 : bitCount,
     184                             &newmod );
     185            ModWriteToFile(&newmod, psz, "" );
     186        //}
    35187#ifdef _DOLOGMEM_
    36188        LogMem( "SaveBitmap-1", FALSE );
     
    60212            LogDebug( "Before call to SaveBitmapToFile()" );
    61213#endif
    62             SaveBitmapToFile (hbm, pset->QuerySaveFile (), hps);
     214            //DebugHereIAm();
     215            /*if( ( pset->QueryFileFormat() == BMF_12 ) ||
     216               ( pset->QueryFileFormat() == BMF_16 ) ||
     217               ( pset->QueryFileFormat() == BMF_20 ) ) {
     218                DebugHereIAm();
     219                SaveBitmapToFile( hbm, pset->QuerySaveFile (), hps );
     220                DebugHereIAm();
     221            }
     222            else {*/
     223                ModCreateFromHPS( hps, width, height,
     224                                 (bitCount > 8 ) ? 24 : bitCount,
     225                                 &newmod );
     226                ModWriteToFile(&newmod, pset->QuerySaveFile (), "" );
     227            //}
    63228#ifdef _DOLOGDEBUG_
    64229            LogDebug( "After call to SaveBitmapToFile()" );
     
    96261#define CB_20HEADER       sizeof (BITMAPINFOHEADER2) // == 64
    97262
     263#if 0
    98264VOID SaveBitmapToFile (HBITMAP hbm, PSZ psz, HPS hps)
    99265{
     
    274440        fwrite (pb, cbBits, 1, pf);
    275441        fclose (pf);
    276     } else {
     442    }
     443
     444    /*else {
    277445#ifdef _DOLOGDEBUG_
    278446        LogDebug( "SaveBitmapToFile(): Starting 'else' path." );
     
    304472        // Open target file.
    305473        HMMIO hmmioTarget;
    306         if( ! ( hmmioTarget = pset->GetMMIO()->pfmmioOpen( psz,
     474        if( ! ( hmmioTarget = mmioOpen( psz,
    307475                                        &mmioinfoTarget,
    308476                                        MMIO_CREATE | MMIO_WRITE |
    309                                         MMIO_DENYWRITE | MMIO_NOIDENTIFY ) ) ) {
     477                                        MMIO_DENYWRITE | MMIO_NOIDENTIFY ))) {
    310478            DisplayError ("mmioOpen()-Error",
    311479                          "mmioOpen()-Error %ld", mmioinfoTarget.ulErrorRet );
     
    319487        ULONG ulImageHeaderLength;
    320488
    321         xmmioQueryHeaderLength( hmmioTarget, (PLONG)&ulImageHeaderLength, 0L, 0L );
     489        mmioQueryHeaderLength( hmmioTarget, (PLONG)&ulImageHeaderLength, 0L, 0L );
    322490        if( ulImageHeaderLength != sizeof( MMIMAGEHEADER ) )
    323491        {
    324492            // We have a problem.....possibly incompatible versions.
    325             xmmioClose( hmmioTarget, 0L );
     493            mmioClose( hmmioTarget, 0L );
    326494            DisplayError ("mmioQueryHeaderLength()-Error",
    327495                          "mmioQueryHeaderLength()-Error",
     
    355523#endif
    356524        ULONG ulBytesRead;
    357         if( ( rc = (LONG)xmmioSetHeader( hmmioTarget, (MMIMAGEHEADER*)&mmImgHdr,
     525        if( ( rc = (LONG)mmioSetHeader( hmmioTarget, (MMIMAGEHEADER*)&mmImgHdr,
    358526                                         (LONG)sizeof( MMIMAGEHEADER ), (PLONG)&ulBytesRead,
    359527                                         0L, 0L ) ) != MMIO_SUCCESS )
    360528        {
    361529            // Header unavailable.
    362             xmmioClose( hmmioTarget, 0L );
     530            mmioClose( hmmioTarget, 0L );
    363531            DisplayError ("mmioSetHeader()-Error",
    364532                          "mmioSetHeader()-Error %ld", rc );
     
    370538
    371539        // write the actual bitmap data bits
    372         if( ( rc = xmmioWrite( hmmioTarget, pb, cbBits ) ) == MMIO_ERROR )
     540        if( ( rc = mmioWrite( hmmioTarget, (CHAR *) pb, cbBits ) ) == MMIO_ERROR )
    373541            DisplayError ("mmioWrite()-Error",
    374542                          "mmioWrite()-Error %ld", rc );
     
    377545#endif
    378546
    379         if( ( rc = xmmioClose( hmmioTarget, 0 ) ) != MMIO_SUCCESS )
     547        if( ( rc = mmioClose( hmmioTarget, 0 ) ) != MMIO_SUCCESS )
    380548            DisplayError ("mmioClose()-Error",
    381549                          "mmioClose()-Error %ld", rc );
     
    383551        LogDebug( "SaveBitmapToFile(): xmmioClose ok." );
    384552#endif
    385     }
     553    } */
    386554
    387555#ifdef _DOLOGDEBUG_
     
    399567#endif
    400568}
    401 
     569#endif
    402570// ** SetEAs ************************************************************** /*FOLD00*/
    403571
     
    620788}
    621789
    622 // ** AddExtensionToFilename ********************************************** /*fold00*/
     790// ** AddExtensionToFilename ********************************************** /*FOLD00*/
    623791
    624792PSZ AddExtensionToFilename( PSZ psz )
     
    629797    PSZ pszExtension;
    630798
    631     PSZ apszValidExtensions[10] =
    632     { "bmp", "tif", "tiff", "tga", "targa", "pcx", "gif", "jpg", "jpeg", "dib" };
     799    PSZ apszValidExtensions[16] =
     800    { "bmp", "tif", "tiff", "tga", "targa", "pcx", "pnm", "jpg", "jpeg",
     801    "jpg2", "jbg", "jbig", "png", "ppm", "raw", "dib" };
    633802
    634803    if( ! ( pszExtension = strrchr( psz, '.' ) ) ) {
     
    641810        // Some extension, but not the correct one - change or append.
    642811        BOOL fValidExtension = FALSE;
    643         for( int i = 0; i < 10; i++ ) {
     812        for( int i = 0; i < 16; i++ ) {
    644813            if( stricmp( pszExtension+1, apszValidExtensions[i] ) == 0 ) {
    645814                fValidExtension = TRUE;
Note: See TracChangeset for help on using the changeset viewer.