static byte _1bppRenderChar(byte chr, int x, int font, WritingBuffer buf) { //Renders a character int tileHeight = 2; int tileWidth = 2; int tileX = x >> 3; int chrPos = chr * tileWidth * tileHeight * 8; int offsetX = x & 7; int startOffsetY = 3 & 7; if (font == 1) //Saturn font is higher, for some reason... { startOffsetY = 0; } byte vWidth = Fonts[font].fontWidth[chr * 2]; byte rWidth = Fonts[font].fontWidth[(chr * 2) + 1]; if (font == 1 && vWidth != rWidth) //The Saturn font is compressed horizontally by removing 1 trailing pixel { vWidth -= 1; } for (int dTileY = 0; dTileY < tileHeight; dTileY++) { int dTileX = 0; int renderedWidth = rWidth; while (renderedWidth > 0) { int offsetY = startOffsetY & 7; int tileIndexX = tileX + dTileX; int tileIndexY = dTileY; _1bppTile leftTile = buf.tiles[dTileY, tileIndexX]; _1bppTile rightTile = buf.tiles[dTileY, tileIndexX + 1]; for (int row = 0; row < 8; row++) { ushort canvasRow = (ushort)(leftTile.getRow(row + offsetY) | (rightTile.getRow(row + offsetY) << 8)); ushort glyphRow = (ushort)(Fonts[font].font[chrPos + row + (((dTileY * tileWidth) + dTileX) * 8)] << offsetX); canvasRow |= glyphRow; leftTile.setRow(row + offsetY, (byte)(canvasRow & 0xFF)); rightTile.setRow(row + offsetY, (byte)((canvasRow >> 8) & 0xFF)); if (row != 7 && row + offsetY == 7) { offsetY = -(row + 1); tileIndexY++; leftTile = buf.tiles[tileIndexY, tileIndexX]; rightTile = buf.tiles[tileIndexY, tileIndexX + 1]; } } renderedWidth -= 8; dTileX++; } } return(vWidth); }
public _1bppTile rotateX() { _1bppTile newTile = new _1bppTile(tile); for (int row = 0; row < 8; row++) { byte val = newTile.getRow(row); byte newVal = 0; for (int i = 0; i < 8; i++) { newVal |= (byte)(((val >> i) & 1) << (7 - i)); } newTile.setRow(row, newVal); } return(newTile); }