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); } }