/* Hello, Emacs, this is -*-C-*-
 * $Id: debug.trm,v 1.18 2012/10/30 04:13:32 sfeam Exp $
 *
 */

/* GNUPLOT - debug.trm */

/*[
 * Copyright 1990 - 1993, 1998, 2004   Thomas Williams, Colin Kelley
 *
 * Permission to use, copy, and distribute this software and its
 * documentation for any purpose with or without fee is hereby granted,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 *
 * Permission to modify the software is granted, but not the right to
 * distribute the complete modified source code.  Modifications are to
 * be distributed as patches to the released version.  Permission to
 * distribute binaries produced by compiling modified sources is granted,
 * provided you
 *   1. distribute the corresponding source modifications from the
 *    released version in the form of a patch file along with the binaries,
 *   2. add special version identification to distinguish your version
 *    in addition to the base release version number,
 *   3. provide your name and address as the primary contact for the
 *    support of your modified version, and
 *   4. retain our contact information in regard to use of the base
 *    software.
 * Permission to distribute the released version of the source code along
 * with corresponding source modifications in the form of a patch file is
 * granted with same provisions 2 through 4 for binary distributions.
 *
 * This software is provided "as is" without express or implied warranty
 * to the extent permitted by applicable law.
]*/

/*
 * This file is included by ../term.c.
 *
 * This terminal driver supports:
 *  DEBUG
 *
 * AUTHORS
 *    luecken@udel.edu
 *
 * send your comments or suggestions to (luecken@udel.edu).
 *
 */

/*
 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
 * generalised to have *all* defined capabilities by HBB (June 1997)
 */


#include "driver.h"

#ifdef TERM_REGISTER
register_term(debug)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void DEBUG_init __PROTO((void));
TERM_PUBLIC void DEBUG_graphics __PROTO((void));
TERM_PUBLIC void DEBUG_text __PROTO((void));
TERM_PUBLIC void DEBUG_linetype __PROTO((int linetype));
TERM_PUBLIC void DEBUG_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void DEBUG_vector __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void DEBUG_put_text __PROTO((unsigned int x, unsigned int y, const char *str));
TERM_PUBLIC void DEBUG_reset __PROTO((void));
TERM_PUBLIC int DEBUG_justify_text __PROTO((enum JUSTIFY mode));
TERM_PUBLIC int DEBUG_text_angle __PROTO((int ang));
TERM_PUBLIC void DEBUG_point __PROTO((unsigned int x, unsigned int y, int pointstyle));
TERM_PUBLIC void DEBUG_arrow __PROTO((unsigned int sx, unsigned int sy, unsigned int ex, unsigned int ey, int head));
TERM_PUBLIC int DEBUG_set_font __PROTO((const char *font));
TERM_PUBLIC void DEBUG_pointsize __PROTO((double pointsize));
TERM_PUBLIC void DEBUG_suspend __PROTO((void));
TERM_PUBLIC void DEBUG_resume __PROTO((void));
TERM_PUBLIC void DEBUG_fillbox __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height));
TERM_PUBLIC void DEBUG_linewidth __PROTO((double linewidth));
TERM_PUBLIC void DEBUG_filled_polygon __PROTO((int, gpiPoint *));
TERM_PUBLIC void DEBUG_set_color __PROTO((t_colorspec *));
TERM_PUBLIC void DEBUG_layer __PROTO((t_termlayer syncpoint));
TERM_PUBLIC void DEBUG_path __PROTO((int p));
TERM_PUBLIC void DEBUG_image __PROTO((unsigned m, unsigned n, coordval *image, gpiPoint *corner, t_imagecolor color_mode));


#define DEBUG_XMAX 512
#define DEBUG_YMAX 390

#define DEBUG_XLAST (DEBUG_XMAX - 1)
#define DEBUG_YLAST (DEBUG_XMAX - 1)

/* Assume a character size of 1, or a 7 x 10 grid. */
#define DEBUG_VCHAR	10
#define DEBUG_HCHAR	7
#define DEBUG_VTIC	(DEBUG_YMAX/70)
#define DEBUG_HTIC	(DEBUG_XMAX/75)
#endif /* TERM_PROTO */

#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY

int DEBUG_linetype_last;
int DEBUG_xlast;
int DEBUG_ylast;

TERM_PUBLIC void
DEBUG_init()
{
    fputs("init\n", gpoutfile);
    DEBUG_linetype_last = LT_NODRAW;
}


TERM_PUBLIC void
DEBUG_graphics()
{
    DEBUG_xlast = DEBUG_ylast = 0;
    fputs("graphics\n", gpoutfile);
}


TERM_PUBLIC void
DEBUG_text()
{
    fputs("text\n", gpoutfile);
}


TERM_PUBLIC void
DEBUG_linetype(int linetype)
{
    /*
       if (linetype != DEBUG_linetype_last){
       fprintf(gpoutfile,"l%d",linetype);
       DEBUG_linetype_last = linetype;
       }
     */
    fprintf(gpoutfile, "line %d\n", linetype);
}


TERM_PUBLIC void
DEBUG_move(unsigned int x, unsigned int y)
{
    /*
       if (x != DEBUG_xlast || y != DEBUG_ylast){
       fprintf(gpoutfile,"mm");
       DEBUG_xlast = x;
       DEBUG_ylast = y;
       }
     */
    fprintf(gpoutfile, "move %d, %d\t(%d, %d)\n", x, y, x - DEBUG_xlast, y - DEBUG_ylast);
    DEBUG_xlast = x;
    DEBUG_ylast = y;
}


TERM_PUBLIC void
DEBUG_vector(unsigned int x, unsigned int y)
{
    /*
       if (x != DEBUG_xlast || y != DEBUG_ylast){
       fprintf(gpoutfile,"vv");
       DEBUG_xlast = x;
       DEBUG_ylast = y;
       }
     */
    fprintf(gpoutfile, "vect %d, %d\t(%d, %d)\n", x, y, x - DEBUG_xlast, y - DEBUG_ylast);
    DEBUG_xlast = x;
    DEBUG_ylast = y;
}


TERM_PUBLIC void
DEBUG_put_text(unsigned int x, unsigned int y, const char *str)
{
    /*
       DEBUG_move(x,y);
       fprintf(gpoutfile,"tx%s\r",str);
     */
    fputs("put_text calls:", gpoutfile);
    DEBUG_move(x, y);
    fprintf(gpoutfile, "put_text '%s'\n", str);
}



TERM_PUBLIC void
DEBUG_reset()
{
    fputs("reset", gpoutfile);
}

TERM_PUBLIC int
DEBUG_justify_text(enum JUSTIFY mode)
{
    fputs("justify ", gpoutfile);
    switch (mode) {
    case (CENTRE):
	fputs("centre", gpoutfile);
	break;
    case (RIGHT):
	fputs("right", gpoutfile);
	break;
    default:
    case (LEFT):
	fputs("left", gpoutfile);
	break;
    }
    fputs("\n", gpoutfile);
    return (TRUE);
}

TERM_PUBLIC int
DEBUG_text_angle(int ang)
{
    fprintf(gpoutfile, "text_angle %d:", ang);
    switch (ang) {
    case 0:
	fputs(": horizontal\n", gpoutfile);
	break;
    case 1:
	fputs(": upwards\n", gpoutfile);
	break;
    default:
	fputs(": \a*undefined*\n", gpoutfile);
	break;
    }
    return TRUE;
}

TERM_PUBLIC void
DEBUG_point(unsigned int x, unsigned int y, int pointstyle)
{
    fprintf(gpoutfile, "point at (%ud,%ud), pointstyle %d\n", x, y, pointstyle);
}

TERM_PUBLIC void
DEBUG_arrow(
    unsigned int sx, unsigned int sy,
    unsigned int ex, unsigned int ey,
    int head)
{
    fprintf(gpoutfile, "arrow from (%ud,%ud) to (%ud,%ud), %s head\n",
	    sx, sy, ex, ey, head ? "with" : "without");
}

TERM_PUBLIC int
DEBUG_set_font(const char *font)
{
    fprintf(gpoutfile, "set font to \"%s\"\n",
	    font ? (*font ? font : "\aempty string!") : "\aNULL string!");
    return TRUE;
}

TERM_PUBLIC void
DEBUG_pointsize(double pointsize)
{
    fprintf(gpoutfile, "set pointsize to %lf\n", pointsize);
}

TERM_PUBLIC void
DEBUG_suspend()
{
    fputs("suspended terminal driver\n", gpoutfile);
}

TERM_PUBLIC void
DEBUG_resume()
{
    fputs("resumed terminal driver\n", gpoutfile);
}

TERM_PUBLIC void
DEBUG_fillbox(
    int style,
    unsigned int x1, unsigned int y1,
    unsigned int width, unsigned int height)
{
    fprintf(gpoutfile, "fillbox/clear at (%ud,%ud), area (%ud,%ud), style %d)\n",
	    x1, y1, width, height, style);
}

TERM_PUBLIC void
DEBUG_linewidth(double linewidth)
{
    fprintf(gpoutfile, "set linewidth %lf\n", linewidth);
}

TERM_PUBLIC void
DEBUG_filled_polygon(int points, gpiPoint *corners)
{
    fprintf(gpoutfile, "polygon with %d vertices\n",points);
}

TERM_PUBLIC void
DEBUG_set_color (t_colorspec *colorspec)
{
    extern void save_pm3dcolor();
    fprintf(gpoutfile,"set_color:  ");
    save_pm3dcolor(gpoutfile, colorspec);
    fprintf(gpoutfile, "\n");
}

TERM_PUBLIC void
DEBUG_layer (t_termlayer syncpoint)
{
    char *l = "";
    switch (syncpoint) {
    case TERM_LAYER_RESET:		l = "reset"; break;
    case TERM_LAYER_BACKTEXT:		l = "backtext"; break;
    case TERM_LAYER_FRONTTEXT:		l = "fronttext"; break;
    case TERM_LAYER_BEGIN_GRID:		l = "begin grid"; break;
    case TERM_LAYER_END_GRID:		l = "end grid"; break;
    case TERM_LAYER_END_TEXT:		l = "end text"; break;
    case TERM_LAYER_BEFORE_PLOT:	l = "before plot"; break;
    case TERM_LAYER_AFTER_PLOT:		l = "after plot"; break;
    case TERM_LAYER_BEGIN_KEYSAMPLE:	l = "begin keysample"; break;
    case TERM_LAYER_END_KEYSAMPLE:	l = "end keysample"; break;
    case TERM_LAYER_RESET_PLOTNO:	l = "reset plotno"; break;
    case TERM_LAYER_BEFORE_ZOOM:	l = "before zoom"; break;
    case TERM_LAYER_BEGIN_PM3D_MAP:	l = "begin pm3d map"; break;
    case TERM_LAYER_END_PM3D_MAP:	l = "end pm3d map"; break;
    default:				l = "unknown"; break;
    }

    fprintf(gpoutfile, "layer %s\n", l);
}

TERM_PUBLIC void
DEBUG_path (int p)
{
    fprintf(gpoutfile, "path %d\n", p);
}

TERM_PUBLIC void 
DEBUG_image (unsigned m, unsigned n, coordval *image, gpiPoint *corner, t_imagecolor color_mode)
{
    fprintf(gpoutfile, "image size = %d x %d\n", m, n);
}
#endif /* TERM_BODY */

#ifdef TERM_TABLE

TERM_TABLE_START(debug_driver)
    "debug", "debugging driver",
    DEBUG_XMAX, DEBUG_YMAX, DEBUG_VCHAR, DEBUG_HCHAR,
    DEBUG_VTIC, DEBUG_HTIC, options_null, DEBUG_init, DEBUG_reset,
    DEBUG_text, null_scale, DEBUG_graphics, DEBUG_move, DEBUG_vector,
    DEBUG_linetype, DEBUG_put_text, DEBUG_text_angle,
    DEBUG_justify_text, DEBUG_point, DEBUG_arrow, DEBUG_set_font,
    DEBUG_pointsize,
    TERM_CAN_MULTIPLOT,
    DEBUG_suspend, DEBUG_resume, DEBUG_fillbox, DEBUG_linewidth,
#ifdef USE_MOUSE
    0, 0, 0, 0, 0, /* no mouse support */
#endif
    0, 0, /* no palette */
    DEBUG_set_color,
    DEBUG_filled_polygon,
    DEBUG_image,
    0, 0, 0, /* no enhanced text */
    DEBUG_layer, DEBUG_path

TERM_TABLE_END(debug_driver)

#undef LAST_TERM
#define LAST_TERM debug_driver

#endif /* TERM_TABLE */
#endif /* TERM_PROTO_ONLY */

#ifdef TERM_HELP
START_HELP(debug)
"1 debug",
"?commands set terminal debug",
"?set terminal debug",
"?set term debug",
"?terminal debug",
"?term debug",
"?debug",
" This terminal is provided to allow for the debugging of `gnuplot`.  It is",
" likely to be of use only for users who are modifying the source code."
END_HELP(debug)
#endif
