#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