//! GritShared destructor void grs_free(GritShared *grs) { if(grs == NULL) return; grs_clear(grs); free(grs); }
BOOL CxpGbaDlg::UpdateGritRec(BOOL b2gr) { DWORD dw; char str[MAXPATHLEN]; // TODO: al/gfx trans ; img modes ; tileset if(b2gr) // data -> gr { UpdateData(TRUE); SetDstPath(mDstPath); // clear previous gr data grit_clear(mgr); grs_clear(mgr->shared); mgr->bExport= true; // Yes, yes, very wasteful mgr->srcDib= dib_clone(mpDib); mgr->bHeader= mbHeader==TRUE; mgr->bAppend= mbAppend==TRUE; mgr->fileType= mFileType; // TODO check whether this is all OK!! if(mbSymChk) mgr->symName= strdup(mSymName); else mgr->symName= strdup(mDstTitle); // make sure it's a valid C varname str_fix_ident(mgr->symName, mgr->symName, strlen(mgr->symName)); sprintf(str, "%s/%s.%s", mDstDir, mDstTitle, c_fileTypes[mFileType]); mgr->dstPath= strdup(str); // --- palette --- if(mbPal) { mgr->palProcMode= GRIT_EXPORT; mgr->palStart= mPalStart; mgr->palEnd= mPalStart+mPalCount; if(mgr->palEnd > 256) mgr->palEnd= 256; if(mPalTrans != 0) { mgr->palHasAlpha= true; mgr->palAlphaId= mPalTrans; } } // --- image --- // NOTE: we should probably always process the image, // just not necessarily export if(1) { if(mbGfx) mgr->gfxProcMode= GRIT_EXPORT; switch(mGfxMode) { case GFX_MODE_TILE: mgr->gfxMode= GRIT_GFX_TILE; break; case GFX_MODE_BMP: mgr->gfxMode= GRIT_GFX_BMP; break; case GFX_MODE_BMP_A: mgr->gfxMode= GRIT_GFX_BMP_A; break; case GFX_MODE_BMP_T: mgr->gfxMode= GRIT_GFX_BMP; // Empty color && non-zero pal-trans -> use pal-trans // Empty color otherwise: use FF00FF // non-empty: use non-empty dw= strlen(mGfxTransStr); if( dw != 0 || !mgr->palHasAlpha ) { if(dw==0) mGfxTransStr= "FF00FF"; mgr->gfxAlphaColor= str2rgb(mGfxTransStr); mgr->gfxHasAlpha= true; } break; } mgr->gfxOffset= 0; mgr->gfxBpp= 1<<mGfxBpp; mgr->gfxCompression= mGfxCprs; } // --- map --- if(mbMap) { mgr->mapProcMode= GRIT_EXPORT; mgr->mapCompression= mMapCprs; if(mbMapRdx) { mgr->mapRedux |= GRIT_RDX_TILE; if(mbMapRdxFlip) mgr->mapRedux |= GRIT_RDX_FLIP; if(mbMapRdxPal) mgr->mapRedux |= GRIT_RDX_PBANK; } if(mbMetaPal) mgr->mapRedux |= GRIT_META_PAL; mgr->mapLayout= moMapFormat; if(mgr->mapLayout == GRIT_MAP_AFFINE) mgr->msFormat= c_mapselGbaAffine; else mgr->msFormat= c_mapselGbaText; mgr->msFormat.base= mMapOffset; // Add external tileset stuff if(mbTileset) { if(mTilesetPath.IsEmpty()) mTilesetPath= mDstDir + mDstTitle + "tiles.bmp"; mgr->shared->tilePath= strdup(mTilesetPath); mgr->gfxIsShared= true; } } if(mbObjCustom) { mgr->metaWidth= mObjHorz; mgr->metaHeight= mObjVert; } else { dw= moObjShape*4 + moObjSize; mgr->metaWidth= cObjSizes[dw][0]; mgr->metaHeight= cObjSizes[dw][1]; } // area dw= moAreaSize+IDC_AREA_CSM; if(dw == IDC_AREA_CSM) { mgr->areaLeft = mAreaLeft; mgr->areaTop = mAreaTop; mgr->areaRight = mAreaLeft+mAreaWidth; mgr->areaBottom= mAreaTop+mAreaHeight; } else { mgr->areaLeft = 0; mgr->areaTop = 0; mgr->areaRight = dib_get_width(mpDib); mgr->areaBottom= dib_get_height(mpDib); } mgr->gfxDataType= moVarChunk; mgr->mapDataType= moVarChunk; mgr->palDataType= moVarChunk; // RIFF overrides if(IsRiffed()) { mgr->bRiff= true; if(mgr->gfxCompression==GRIT_CPRS_OFF) mgr->gfxCompression= GRIT_CPRS_HEADER; if(mgr->mapCompression==GRIT_CPRS_OFF) mgr->mapCompression= GRIT_CPRS_HEADER; if(mgr->palCompression==GRIT_CPRS_OFF) mgr->palCompression= GRIT_CPRS_HEADER; } } else // gr -> data { // --- file --- mbHeader = mgr->bHeader; mbAppend = mgr->bAppend; // --- palette --- mPalStart= mgr->palStart; mPalCount= mgr->palEnd-mgr->palStart; mPalTrans= mgr->palAlphaId; // --- image --- if(mgr->gfxHasAlpha) { RGBQUAD *rgb= &mgr->gfxAlphaColor; mGfxMode= GFX_MODE_BMP_T; mGfxTransStr.Format("%02X%02X%02X", rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue); } else if(mgr->gfxMode == GRIT_GFX_BMP_A) mGfxMode= GFX_MODE_BMP_T; else if(mgr->gfxMode == GRIT_GFX_BMP) mGfxMode= GFX_MODE_BMP; else mGfxMode= GFX_MODE_TILE; //mgr->gfx_ofs; //mgr->gfxBpp; // map if(mbMap) { moMapFormat= mgr->mapLayout; if(mgr->mapRedux & GRIT_RDX_TILE) { mbMapRdx= TRUE; mbMapRdxFlip= mbMapRdxPal= FALSE; if(mgr->mapRedux & GRIT_RDX_FLIP) mbMapRdxFlip= TRUE; if(mgr->mapRedux & GRIT_RDX_PBANK) mbMapRdxPal= TRUE; } mMapOffset= mgr->msFormat.base; } // meta if(mbObjCustom) { mObjHorz= mgr->metaWidth; mObjVert= mgr->metaHeight; } // area mAreaLeft= mgr->areaLeft; mAreaTop= mgr->areaTop; mAreaWidth= mgr->areaRight-mgr->areaLeft; mAreaHeight= mgr->areaBottom-mgr->areaTop; UpdateData(FALSE); } return TRUE; }