/* -*-C-*-
 ********************************************************************************
 *
 * File:        pieces.h  (Formerly pieces.h)
 * Description:
 * Author:       Mark Seaman, SW Productivity
 * Created:      Fri Oct 16 14:37:00 1987
 * Modified:     Tue Apr 30 11:49:11 1991 (Mark Seaman) marks@hpgrlt
 * Language:     C
 * Package:      N/A
 * Status:       Reusable Software Component
 *
 * (c) Copyright 1987, Hewlett-Packard Company.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 *
 *********************************************************************************/
#ifndef PIECES_H
#define PIECES_H

/*----------------------------------------------------------------------
              I n c l u d e s
----------------------------------------------------------------------*/
#include "matrix.h"
#include "seam.h"
#include "states.h"

/*----------------------------------------------------------------------
              T y p e s
----------------------------------------------------------------------*/
typedef struct
{                                /*  BOUNDS  */
  TPOINT topleft;
  TPOINT botright;
} BOUNDS;

typedef BOUNDS *BOUNDS_LIST;     /*  BOUNDS_LIST  */

/*----------------------------------------------------------------------
              F u n c t i o n s
----------------------------------------------------------------------*/
void break_pieces(TBLOB *blobs, SEAMS seams, INT16 start, INT16 end); 

void join_pieces(TBLOB *piece_blobs, SEAMS seams, INT16 start, INT16 end); 

void hide_seam(SEAM *seam); 

void hide_edge_pair(EDGEPT *pt1, EDGEPT *pt2); 

void reveal_seam(SEAM *seam); 

void reveal_edge_pair(EDGEPT *pt1, EDGEPT *pt2); 

void bounds_of_piece(BOUNDS_LIST bounds,
                     INT16 start,
                     INT16 end,
                     TPOINT *extreme_tl,
                     TPOINT *extreme_br);

CHOICES classify_piece(TBLOB *pieces,
                       SEAMS seams,
                       INT16 start,
                       INT16 end,
                       INT32 fx,
                       STATE *this_state,
                       STATE *best_state,
                       INT32 pass,
                       INT32 blob_index);

CHOICES get_piece_rating(MATRIX ratings,
                         TBLOB *blobs,
                         SEAMS seams,
                         INT16 start,
                         INT16 end,
                         INT32 fx,
                         STATE *this_state,
                         STATE *best_state,
                         INT32 pass,
                         INT32 blob_index);

BOUNDS_LIST record_blob_bounds(TBLOB *blobs); 

MATRIX record_piece_ratings(TBLOB *blobs); 

/*
#if defined(__STDC__) || defined(__cplusplus)
# define	_ARGS(s) s
#else
# define	_ARGS(s) ()
#endif*/

/* pieces.c *
void break_pieces
  _ARGS((BLOB *blobs,
  SEAMS seams));

void join_pieces
  _ARGS((BLOB *piece_blobs,
  SEAMS seams,
  INT16 start,
  INT16 end));

void hide_seam
  _ARGS((SEAM *seam));

void reveal_seam
  _ARGS((SEAM *seam));

void bounds_of_piece
  _ARGS((BOUNDS_LIST bounds,
  INT16 start,
  INT16 end,
  TPOINT *extreme_tl,
  TPOINT *extreme_br));

CHOICES classify_piece
  _ARGS((BLOB *pieces,
  SEAMS seams,
  INT16 start,
  INT16 end,
  INT32 fx,
  STATE* this_state,
  STATE* best_state,
  INT32 pass,
  INT32 blob_index));

CHOICES get_piece_rating
  _ARGS((MATRIX ratings,
  BLOB *blobs,
  SEAMS seams,
  INT16 start,
  INT16 end,
  INT32 fx,
  STATE* this_state,
  STATE* best_state,
  INT32 pass,
  INT32 blob_index));

BOUNDS_LIST record_blob_bounds
  _ARGS((BLOB *blobs));

MATRIX record_piece_ratings
  _ARGS((BLOB *blobs));

#undef _ARGS
*/
#endif
