// Detect It Easy: detection rule file
// Author: LinXP
// doc-ref: https://www.angelcode.com/products/bmfont/doc/file_format.html

meta("font", "AngelCode Bitmap Font (.FNT)");

function detect() {
    if (Binary.getSize() >= 0x30) {
        if (Binary.compare("'BMF'")) {
            bDetected = true;
            switch (Binary.read_uint8(0x03)) {
                case 1:
                    sVersion = "v1";
                    sOptionT("Binary");
                    break;
                case 2:
                    sVersion = "v2";
                    sOptionT("Binary");
                    break;
                case 3:
                    sVersion = "v3";
                    sOptionT("Binary");
                    break;
                default:
                    bDetected = false;
            }
            if (bDetected && Binary.isVerbose()) {
                var nOffset = 0x04;

                while (nOffset < Binary.getSize()) {
                    var nBlockTypeIdentifier = Binary.read_uint8(nOffset);
                    nOffset += 1;
                    var nBlockSize = Binary.read_uint32(nOffset);
                    nOffset += 4;
                    switch (nBlockTypeIdentifier) {
                        case 1:
                            sOptionT('"' + Binary.getString(nOffset + 0xE) + '"');
                            sOptionT("Size:" + Binary.read_int16(nOffset)); // fontSize
                            break;
                        case 2:
                            sOptionT("pages:" + Binary.read_int16(nOffset + 4) + "x" + Binary.read_int16(nOffset + 6) + "x" + Binary.read_int16(nOffset + 8)); // scaleW, scaleH, pages
                            break;
                        case 3:
                            break;
                        case 4:
                            sOptionT("chars:" + nBlockSize / 20);
                            break;
                        case 5:
                            sOptionT("kerning_pairs:" + nBlockSize / 10);
                            break;
                    }
                    nOffset += nBlockSize;
                }
            }
        } else if (Binary.isPlainText() && Binary.find_utf8String(0, 200, "info face") >= 0 && Binary.find_utf8String(0, 200, "stretchH") >= 0) {
            bDetected = true;
            if (Binary.find_utf8String(0, 200, "<?xml") >= 0) { sOptionT("XML") } else
                (sOptionT("Text"))
        }
    }

    return result();
}