Obrigado a Julio Marchi pelo espaço cedido na MSX All
 

Shape (.SHP)

  O arquivo de shapes é uma coleção de desenhos empilhados, onde cada desenho contém seu próprio header mais os dados do desenho. O arquivo de shape não contém o header de arquivo do MSX.

  O formato de arquivo de shape é descrito a seguir:

 


  Header

  O header de cada shape contém as seguintes informações:

Offset
(hexa)
Tamanho
(bytes)
Descrição
0 1 ID do shape
1 1 Tipo do shape (1-4)
2 1 Largura do shape em pixels
3 1 Altura do shape em blocos de 8x8 pixels

  Exemplo de header: 01 01 30 06.

  Descrição do header:

 ID do shape: 1
 Tipo do shape: 1
 Largura do shape: &H30 ou 48 pixels
 Altura do shape: &H06 ou 6 blocos de 8x8 pixels = 48 pixels



  Dados do desenho

  Dependendo do tipo do shape, os dados do desenho serão compostos pelas seguintes tabelas:

Tipo Dados do desenho Tamanho
(bytes)
1 Tabela de padrões Largura x Altura
2 Tabelas de padrões e cores 2 x Largura x Altura
3 Tabelas de padrões da máscara e padrões 2 x Largura x Altura
4 Tabelas de padrões da máscara, padrões e cores 3 x Largura x Altura

  Para um mesmo desenho, as tabelas de padrões da máscara, padrões e cores possuem o mesmo tamanho.


  Tabela de Padrões

  A tabela de padrões (ou caracteres) é responsável por determinar o padrão de cores dos pixels de cada linha de 8x1 pixels. Ele define se um pixel possui a cor de frente ou a cor de fundo, segundo as cores de frente e fundo definidos para essa linha na tabela de cores.


  Tabela de Cores

  Define as cores de frente e fundo para uma linha de 8x1 pixels. Funciona em conjunto com a tabela de padrões.

  Maiores detalhes do funcionamento dessas tabelas pode ser encontrado aqui.


  Máscara

  A máscara é um recurso que permite que o shape seja colado sobre a tela, copiando-se apenas os pixels desejados. Os shapes dos tipos 1 e 2 copiam para a tela toda a área do shape, inclusive o fundo de tela. Assim, toda a área do retângulo do shape é substituída na tela quando ele é copiado.
  Quando é feita a opção pelo shape do tipo 3 ou 4 no Graphos III, um editor surge após a definição da área do shape, contendo a imagem do shape monocromática (Ink) com os pixels invertidos. Essa imagem é a máscara que será utilizada para definir a área útil do shape. Os pixels apagados da máscara (valor 0) indicam a região do shape que será copiada para a tela e os pixels acesos (valor 1), não.

  Exemplo:

  Shape     Máscara

 00100000   11011111
 01010000   10101111
 10001000   01110111
 10001000   01110111
 11111000   00000111
 10001000   01110111
 10001000   01110111
 00000000   11111111


  A máscara define o contorno do desenho da letra "A". Assim, com o uso da máscara, somente os pixels da letra "A" serão desenhados sobre a tela, em vez de todo o retângulo do shape.
  A figura a seguir ilustra a superposição desse shape com uma figura, com e sem o uso da máscara.

 


  Exemplo

  Voltando ao exemplo do header, como ele é do tipo 1, a área de dados seria composta somente da tabela de padrões da screen 2.
  O tamanho de cada tabela em bytes é obtido através da multiplicação de dois valores fornecidos pelo header: a altura e a largura. Assim, o tamanho ocupado pelos dados desse exemplo seria de 48x6 ou 288 bytes.
  Daí, concluímos que o desenho 1 ocupa 4+288 ou 292 bytes e que os offsets de 0 a 291 do arquivo de shape contém o desenho 1. O desenho 2 está localizado a partir do offset 292.

  0       291 292
 ┌───────────┬───────────┐
 │ Desenho 1 │ Desenho 2 │ ...
 └───────────┴───────────┘



  Arquivo shape

  No arquivo shape não é possível determinar a localização direta de um "desenho N". Dessa forma, é necessário primeiro passar pelos desenhos anteriores e ir "saltando" até chegar ao desenho desejado. Para isso, basta ler o header de cada desenho, calcular o endereço do próximo desenho e deslocar o ponteiro de arquivo para lá.

  Esse arquivo possui sempre o tamanho múltiplo de 128 bytes. Assim, é possível que o arquivo contenha lixo na área não usada. Entretanto, é fácil identificar o fim de arquivo: quando o próximo ID do shape possuir valor igual a 255 (&HFF).



Marcelo Teixeira Silveira
Engenheiro de Sistemas e Computação - UERJ
Mestre em Engenharia de Computação - UERJ

© MarMSX 1999-2018