/*--------------------------------------------------------------------
 * FICHERO:  TifEsIBN.c
 * OBJETIVO: Definir la funcin Tif_EscribeImagenBN()
 * AUTOR:    Pedro Reina
 * FECHA:    S.8.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Tiff.h"

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

#define TIF_TAMANORECOMENDADO 8192  /* El mximo tamao por banda
                                       recomendando por Aldus */

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Tif_EscribeImagenBN()
 * OBJETIVO: Escribir los datos que realmente expresan una imagen
 *           en blanco y negro
 * ENTRADAS: Un objeto tiff, la anchura y altura de la imagen,
 *           el nmero de bandas en que se va a dividir la
 *           imagen, la direccin donde se encuentran los datos,
 *           el mtodo de compresin y la interpretacin
 *           fotomtrica
 * SALIDAS:  Lgica, que indica que todo ha ido bien
 * EJEMPLO:  Tif_EscribeImagenBN ( Imagen, 4096, 2, Aux )
 * NOTAS:    1. El modo de compresin slo puede ser
 *              TIF_SIN_COMPRESION
 *           2. La interpretacin fotomtrica puede ser
 *              TIF_NEGRO_CERO o TIF_BLANCO_CERO
 *           3. Si el nmero de bandas es 0, esta funcin
 *              calcula el nmero ms adecuado
 * ALGORITMO:
 *      Si no nos han pasado el nmero de bandas, calcularlo
 *      Grabar el directorio
 *      Grabar todas las bandas
 *------------------------------------------------------------------*/
logico Tif_EscribeImagenBN (Tiff, Ancho, Alto, TotalBanda, Dato,
                            Compresion, Interpretacion)
tiff     Tiff;
entero   Ancho, Alto;
contador TotalBanda;
memoria  Dato;
contpos  Compresion, Interpretacion;
  {
  logico   Respuesta = NO, TodoBien = SI;
  entero   AnchoEnOxel, AltoBanda, Tamano, TamanoBanda;
  contador Banda;

  AnchoEnOxel = (Ancho+7)/8;
  Tamano = Alto * AnchoEnOxel;

  if ( !TotalBanda )
    {
    if ( Tamano <= TIF_TAMANORECOMENDADO )
      { TotalBanda = 1; }
    else
      { TotalBanda = DivEx (Tamano, TIF_TAMANORECOMENDADO); }
    }

  if ( Tif_EscribeDirectorioBN (Tiff, Ancho, Alto, TotalBanda,
                                Compresion, Interpretacion) )
    {
    if ( TotalBanda == 1 )
      { Respuesta = Tif_EscribeBandaBN (Tiff, Tamano, 0, Dato); }
    else
      {
      AltoBanda = DivEx (Alto, TotalBanda);
      TamanoBanda = AnchoEnOxel * AltoBanda;
      for ( Banda = 0 ; Banda < TotalBanda-1 && TodoBien ; Banda++ )
        { 
        TodoBien = Tif_EscribeBandaBN (Tiff, TamanoBanda, Banda, Dato);
        Dato += TamanoBanda;
        }
      if ( TodoBien )
        {
        /* La ltima banda se trata de modo especial
           ya que puede ser ms pequea              */
        TamanoBanda = Tamano - (TotalBanda-1)*TamanoBanda;
        TodoBien = Tif_EscribeBandaBN (Tiff, TamanoBanda, TotalBanda-1, Dato);
        }
      Respuesta = TodoBien;
      }  
    }

  return ( Respuesta );
  }
