Implementação do Itálico
PARTE 1:
Bom, pessoal, eu estou meio sem tempo para escrever, mas vou tentar começar agora. Vou colocar a ideia principal do itálico e depois como fazer as fontes para esse tipo de implementação. Posteriormente, posto mais detalhes sobre o código.
Itálico:
Analisando a rotina que lê os caracteres da legenda (aquela que mostrei anteriormente, que tinha uma verificação para saber se a fonte CP 1254 havia sido selecionada), vi que ela repassa o valor correspondente ao código de cada caracter para o rotina responsável pela impressão da legenda (aquela enorme, que tem os alinhamentos) no registrador R0. O ARM é um processador de 32 bits, então seus registradores armazenam valores com 32 bits. Bom, então eu coloquei uma fonte maior no lugar da fonte 10 (uma daquelas que o MTKFontCreator tem, com vários CPs misturados) e testei adicionar um valor de 256 ao registrador R0 na saída da rotina que lê os caracteres (ADD R0, #01, seguido de ADD R0, #FF). E funcionou! A legenda passou a ser impressa a partir do caracter de posição 256. Por exemplo, se o caracter lido fosse o 100, ele seria repassado como 100+256=356, e o carater que apareceria seria o 356. Essa foi a idéia básica da minha implementação do itálico. Fazer um fonte híbrida de normais + itálicos e somar um offset ao caracter lido da legenda quando estivesse em "modo itálico". Aí, tive que enfrentar alguns problemas, como achar o trecho que inibia as tags SRT, pois a legenda já chegava processada sem as tags itálicas. Um outro problema seria como repassar uma escolha de opção feita no 8032, para o ARM decidir se aplicava ou não o offset. Vou esclarecer esses e outros pontos num próximo post, quando tiver mais tempo. Espero que seja ainda esta semana.
Fontes:
Sobre as fontes, elas não são mais de 512 caracteres. Mas de 479. Como há 6 fontes para legendas no firmware, para cada uma que eu adicionasse o itálico teria que "apagar" outra, para garantir que coubessem no mesmo espaço (caso contrário, dá erros na impressão da legenda, aparecem artefatos na tela, travadas etc). Assim, seriam no máximo 3 fontes. Mas eu retirei os 33 primeiros caracteres da parte itálica de cada fonte, pois são os caracteres de controle e o espaço (que, obviamente, não mudam quando vão para itálico). Então ficaram 256 normais + 223 itálicos. Isso economizou um pouco de espaço e permitiu adicionar 4 fontes com itálico, ainda que tenha "empurrado" a fonte 14 para o lugar da 15 como efeito colateral.
O MTKRemaker não apaga as fontes corretamente nesse firmware. Ele só apaga a 4, trazendo a 5 para seu lugar, a 6 para 5 e assim por diante. Então, criei um preset de 1 caracter, o 0, para criar uma fonte mínima e colocá-la no lugar das que eu iria apagar. Assim, as fontes itálicas ficaram na posição 8, 9, 10 e 11 e a miníma ficou nas posições 12 e 13.
Em anexo, envio as fontes itálicas que consegui criar para que itálico seja exibido corretamente no MTKFontCreator (sem cortes), além do INI daquele software que possui os presets de 1 caracter, de 479 caracteres (cp 1252) e o que não uso mais, de 512 caracteres (cp 1252). Também envio a fonte de 1 caracter já pronta no formato MTF. Depois de instalar as novas fontes no SO, é possível criar a uma fonte híbrida no MTKFontCreator procedendo como disse num post anterior. Selecione o preset de 479 (ou 512, se preferir), selecione a fonte correspondente, desligue o itálico e exporte o arquivo como texto. Depois, repita os passos com a mesma fonte, mas com o itálico ligado. Num editor de texto qualquer, abra o arquivo texto da fonte em itálico, copie os caracteres superiores (acima de 256) e cole-os no lugar dos mesmos caracteres no arquivo texto de fonte normal. É só salvar e importar o novo arquivo texto no MTKFontCreator.