Пример #1
0
Font::Font(const String& filename) : Image(filename, 16, 16)
{
	_glyphs = Array<Glyph>();
	Glyph myGlyph = Glyph();

	// Cargamos el buffer con la imagen
	int iWidth;
	int iHeight;
	unsigned char* buffer = stbi_load(filename.ToCString(), &iWidth, &iHeight, NULL, nElemPixel);

	// Calculamos las dimensiones de cada frame
	bool dimX = false;
	for (int i = 1; i < iWidth / nElemPixel && !dimX; i++)
	{
		uint8 r = buffer[i * nElemPixel];
		uint8 g = buffer[i * nElemPixel + 1];
		uint8 b = buffer[i * nElemPixel + 2];
		if (IsColor(r, g, b, 255, 255, 0))
		{
			_dimFrameX = i;
			dimX = true;
		}
	}
	bool dimY = false;
	for (int i = 1; i < iHeight / nElemPixel && !dimY; i++)
	{
		uint8 r = buffer[i * iWidth * nElemPixel];
		uint8 g = buffer[i * iWidth * nElemPixel + 1];
		uint8 b = buffer[i * iWidth * nElemPixel + 2];
		if (IsColor(r, g, b, 255, 255, 0))
		{
			_dimFrameY = i;
			dimY = true;
		}
	}

	// Tratamos los pixeles dentro de cada frame
	if ( buffer ) {
		if (dimX && dimY)
		{
			for (int j = 0; j < nFrameY; j++)
			{
				for (int i = 0; i < nFrameX; i++)
				{
					// Accedemos al frame[i,j]
					for (int k = 0; k < _dimFrameX; k++)
					{
						for (int l = 0; l < _dimFrameY; l++)
						{
							// Accedemos al pixel[k,l] del frame[i,j]
							uint8 r = buffer[IndexFrom(i, j, k, l, iWidth, 0)];
							uint8 g = buffer[IndexFrom(i, j, k, l, iWidth, 1)];
							uint8 b = buffer[IndexFrom(i, j, k, l, iWidth, 2)];
							if (IsColor(r, g, b, 255, 255, 0))
							{
								myGlyph.SetIni(i * _dimFrameX + k, j * _dimFrameY + l);
								buffer[IndexFrom(i, j, k, l, iWidth, 3)] = 0;
							}
							else if (IsColor(r, g, b, 255, 0, 0))
							{
								myGlyph.SetFin(i * _dimFrameX + k, j * _dimFrameY + l);
								buffer[IndexFrom(i, j, k, l, iWidth, 3)] = 0;
							}
							else if (IsColor(r, g, b, 0, 0, 0))
							{
								buffer[IndexFrom(i, j, k, l, iWidth, 3)] = 0;
							}
						}
					}
					if (myGlyph.GetIniX() != 0 || myGlyph.GetIniY() != 0 || myGlyph.GetFinX() != 0 || myGlyph.GetFinY() != 0)
						_glyphs.Add(myGlyph);
				}
			}
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, iWidth, iHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
		}
		free(buffer);
	}
}