#ifndef QUADRO_H
#define QUADRO_H
#include <iostream>
#include <vector>
#include "cor.H"
#include "posicao.H"
#include "dimensao.H"
/** Representa um quadro onde se pode desenhar. O quadro está dividido em
rectângulos organizados em linhas e colunas. Cada rectângulo chama-se um
píxel. A linha do topo é a linha 0 (zero). A coluna da esquerda é a
coluna 0 (zero). Os píxeis podem ser pintados de branco ou de preto. A
razão entre a largura e altura dos píxeis chama-se aspecto. É possível
escrever um quadro num canal, usualmente ligado ao ecrã. Nesse caso cada
píxel é representado por um caracter, sendo ' ' usado para a cor preta e
'×' usado para a cor branca. */
class Quadro {
public:
// Usa-se preto e branco:
typedef PretoEBranco Cor;
/** Constrói um quadro com dimensão dada (24x80 por omissão) e com fundo
da cor fundo (preto por omissão). Os píxeis válidos têm posições
entre 0 e dimensão.linhas() - 1 (para a linha) e entre 0 e
dimensão.colunas() - 1 (para a coluna). A razão entre a largura e a
altura dos píxeis é dada por aspecto. */
Quadro(Dimensao const& dimensao = Dimensao(24, 80), Cor fundo = preto,
double aspecto = 1.0);
/// Devolve a dimensao do quadro.
Dimensao dimensao() const;
/** Devolve a relação largura/altura (i.e., o aspecto) dos píxeis do
quadro. */
double aspecto() const;
/// Devolve a cor do fundo.
Cor fundo() const;
/// Indica se uma dada posição está dentro do quadro.
bool dentro(Posicao const& posicao) const;
/** Devolve a cor do pixel na posição dada. Se a posição estiver fora do
quadro devolve a cor do fundo. */
Cor cor(Posicao const& posicao) const;
/** Escreve o quadro no canal saida (que se presume ligado a um ecrã em
modo texto), com conversão para os caracteres ' ' e '×' (preto e
branco respectivamente). */
void mostraEm(std::ostream& saida) const;
/// Pinta o píxel numa dada posição com uma dada cor.
void pinta(Posicao const& posicao, Cor const& cor);
/** Pinta o pixel numa dada posição com um cor contrastante com o
fundo do quadro. */
void pinta(Posicao const& posicao);
/// "Despinta" o pixel numa dada posição pintando-o com a cor do fundo.
void limpa(Posicao const& posicao);
/// Pinta todo o quadro com a cor do fundo.
void apaga();
private:
// Dimensão do quadro.
Dimensao dimensao_;
// Cor de fundo do quadro.
Cor fundo_;
// Relação largura/altura dos píxeis do quadro.
double aspecto_;
// Vector bi-dimensional de píxeis.
std::vector<std::vector<Cor> > pixeis;
};
#include "quadro_impl.H"
#endif // QUADRO_H