コード例 #1
0
ファイル: grit_shared.cpp プロジェクト: devkitPro/grit
//! GritShared destructor
void grs_free(GritShared *grs)
{
	if(grs == NULL)
		return;

	grs_clear(grs);
	free(grs);
}
コード例 #2
0
ファイル: gritdlg.cpp プロジェクト: alvasnaedis/grit
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;
}