⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfxdata.cpp

📁 VIGASOCO (VIdeo GAmes SOurce COde) Windows port (v0.01)
💻 CPP
字号:
// GfxData.cpp
//
/////////////////////////////////////////////////////////////////////////////

#include <cassert>
#include "GfxData.h"

GfxElement * GfxDecoder::decode(const struct GfxEncoding *enc, const UINT8 *pRawGfx)
{
	assert(enc->bpp <= 8);

	int entrySize = enc->sizeX*enc->sizeY;

	// allocate memory for the decoded graphics (1 pixel = 1 byte)
	UINT8 **decodedGfx = new UINT8*[4];
	for (int i = 0; i < 4; i++){
		decodedGfx[i] = new UINT8[enc->numEntries*entrySize];
		memset(decodedGfx[i], 0, enc->numEntries*entrySize);
	}

	// for each tile
	for (int num = 0; num < enc->numEntries; num++){
		// for each bitplane
		for (int plane = 0; plane < enc->bpp; plane++){

			// get bit to test (order 01234567 instead of the usual 76543210)
			int currBit = 1 << (enc->bpp - 1 - plane);

			// get offset to the starting of the current bitplane (in bits)
			int offs = enc->planeOffsets[plane] + num*enc->entryBitSize;

			for (int y = 0; y < enc->sizeY; y++){
				// get start of this line (in bits)
				int lineOffset = offs + enc->yOffs[y];

				for (int x = 0; x < enc->sizeX; x++){
					// check bit in the final position
					if (isBitSet(pRawGfx, lineOffset + enc->xOffs[x])){
						decodedGfx[NO_FLIP][entrySize*num + (y*enc->sizeX + x)] |= currBit;
						decodedGfx[FLIP_X] [entrySize*num + (y*enc->sizeX + (enc->sizeX - x - 1))] |= currBit;
						decodedGfx[FLIP_Y] [entrySize*num + ((enc->sizeY - y - 1)*enc->sizeX + x)] |= currBit;
						decodedGfx[FLIP_XY][entrySize*num + ((enc->sizeY - y - 1)*enc->sizeX + (enc->sizeX - x - 1))] |= currBit;
					}
				}
			}
		}
	}

	// return GfxElement struc
	GfxElement *g = new GfxElement();
	g->sizeX = enc->sizeX;
	g->sizeY = enc->sizeY;
	g->numEntries = enc->numEntries;
	g->entrySize = entrySize;
	g->bpp = enc->bpp;
	g->data = decodedGfx;

	return g;
}

/////////////////////////////////////////////////////////////////////////////
// cloning
/////////////////////////////////////////////////////////////////////////////

GfxEncoding *GfxEncoding::clone(GfxEncoding *g)
{
	GfxEncoding *gfx = new GfxEncoding();
	gfx->sizeX = g->sizeX;
	gfx->sizeY = g->sizeY;
	gfx->numEntries = g->numEntries;
	gfx->bpp = g->bpp;
	memcpy(gfx->planeOffsets, g->planeOffsets, sizeof(UINT32)*8);
	memcpy(gfx->xOffs, g->xOffs, sizeof(int)*32);
	memcpy(gfx->yOffs, g->yOffs, sizeof(int)*32);
	gfx->entryBitSize = g->entryBitSize;

	return gfx;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -