dreamcast ™ wrote:Check for my response
here. I put some code to generate a GBIX / PVR file from RGB888 data and instructed on how to replace that data in an existing BG replacement VMS.
Código:
/ * Simples RGB888 -> PVR RGB565 (RETÂNGULO) | <BR> 2019 * /
enum ImgDimension {
DIM_16X16 = 0x10,
DIM_32X32 = 0x20,
DIM_64X64 = 0x40,
DIM_128X128 = 0x80
};
void RGB888ToRGB565 (enum ImgDimension eImgDimension, uint8_t * pRGB888, uint8_t ** pRGB565, int * nRGB565Size) {
uint8_t GBIX_HEADER [] = {'G', 'B', 'Eu', 'X', 0x08, 0x00, 0x00, 0x00, 0x9A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t PVRT_HEADER [] = {'P', 'V', 'R', 'T', 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, eImgDimension, 0x00, eImgDimension, 0x00};
uint32_t nHdrSz = (tamanho de (GBIX_HEADER) + tamanho de (PVRT_HEADER));
uint32_t nImgSz = (2 * (eImgDimension * eImgDimension));
uint32_t nTmpSz = (nHdrSz + nImgSz);
uint8_t * pTmp = malloc (nTmpSz);
uint8_t * p = pTmp;
int i;
// define o tamanho dos dados da imagem
PVRT_HEADER [4] = (nImgSz & 0xFF);
PVRT_HEADER [5] = ((nImgSz >> 0x08) & 0xFF);
PVRT_HEADER [6] = ((nImgSz >> 0x10) & 0xFF);
PVRT_HEADER [7] = ((nImgSz >> 0x18) & 0xFF);
// copia o cabeçalho do GBIX
memmove (p, GBIX_HEADER, sizeof (GBIX_HEADER));
p + = sizeof (GBIX_HEADER);
// copia o cabeçalho do PVRT
memmove (p, PVRT_HEADER, sizeof (PVRT_HEADER));
p + = sizeof (PVRT_HEADER);
// faz a conversão
for (i = 0; i <(eImgDimension * eImgDimension); i ++) {
uint16_t nR = (((* pRGB888 ++ >> 3) & 0x1F) << 11);
uint16_t nG = (((* pRGB888 ++ >> 2) & 0x3F) << 5);
uint16_t nB = ((* pRGB888 ++ >> 3) e 0x1F);
uint16_t nRGB565 = (nR | nG | nB);
* p ++ = (nRGB565 e 0xFF);
* p ++ = ((nRGB565 >> 8) e 0xFF);
}
* nRGB565Size = nTmpSz;
* pRGB565 = pTmp;
}
I only see ... letter and number in this text, I don't know which tool to use.