26
26
#include <dynarray.h>
28
29
#include <string.h>
31
33
#include "backgammon.h"
32
34
#include "drawboard.h"
34
typedef enum _font { FONT_NONE, FONT_RM, FONT_SF, FONT_TT } font;
35
static char *aszFont[ FONT_TT + 1 ] = { NULL, "rm", "sf", "tt" };
35
#include "positionid.h"
36
#include <glib/gi18n.h>
48
/* Helvetica (Sans serif) */
53
/* Courier (type writer) */
60
static char *aszFont[ NUM_FONTS ] = {
62
"rm", "rmb", "rmi", "rmbi",
63
"sf", "sfb", "sfo", "sfbo",
64
"tt", "ttb", "tto", "ttbo",
67
static char *aszFontName[ NUM_FONTS ] = {
76
"Helvetica-Bold-Oblique",
80
"Courier-Bold-Oblique"
37
83
/* Output settings. FIXME there should be commands to modify these! */
38
84
static int cxPage = 595, cyPage = 842; /* A4 -- min (451,648) */
332
383
idPages = AllocateObject() );
335
StartObject( pf, aidFont[ FONT_RM ] = AllocateObject() );
340
"/BaseFont /Times-Roman\n"
341
"/Encoding /WinAnsiEncoding\n"
345
StartObject( pf, aidFont[ FONT_SF ] = AllocateObject() );
350
"/BaseFont /Helvetica\n"
351
"/Encoding /WinAnsiEncoding\n"
355
StartObject( pf, aidFont[ FONT_TT ] = AllocateObject() );
360
"/BaseFont /Courier\n"
361
"/Encoding /WinAnsiEncoding\n"
388
for ( i = 1; i < NUM_FONTS; ++i ) {
390
StartObject ( pf, aidFont[ i ] = AllocateObject() );
398
"/Encoding /WinAnsiEncoding\n"
399
">>\n", aszFont[ i ], aszFontName[ i ] );
365
404
StartObject( pf, idResources = AllocateObject() );
366
405
fprintf( pf, "<<\n"
367
406
"/ProcSet [/PDF /Text]\n"
368
"/Font << /rm %d 0 R /sf %d 0 R /tt %d 0 R >>\n"
369
">>\n", aidFont[ FONT_RM ], aidFont[ FONT_SF ],
370
aidFont[ FONT_TT ] );
409
for ( i = 1; i < NUM_FONTS; ++i )
410
fprintf ( pf, "/%s %d 0 R ", aszFont[ i ], aidFont[ i ] );
412
fprintf ( pf, ">>\n" ">>\n" );
371
414
/* FIXME list xobject resources */
374
417
fputs( "%!PS-Adobe-3.0\n", pf );
376
fprintf( pf, "%%%%BoundingBox: %d %d %d %d\n",
377
( cxPage - 451 ) / 2, ( cyPage - 648 ) / 2,
378
( cxPage + 451 ) / 2, ( cyPage + 648 ) / 2 );
420
fprintf( pf, "%%%%BoundingBox: %d %d %d %d\n",
421
( cxPage - 451 ) / 2 + 225 - 200 * nMag / 100,
422
( cyPage + 648 ) / 2 - 260 * nMag / 100,
423
( cxPage - 451 ) / 2 + 225 + 200 * nMag / 100,
424
( cyPage + 648 ) / 2 );
426
fprintf( pf, "%%%%BoundingBox: %d %d %d %d\n",
427
( cxPage - 451 ) / 2, ( cyPage - 648 ) / 2,
428
( cxPage + 451 ) / 2, ( cyPage + 648 ) / 2 );
381
431
sz = ctime( &t );
384
434
fprintf( pf, "%%%%CreationDate: (%s)\n", sz );
386
436
fputs( "%%Title: (", pf );
387
PostScriptEscape( pf, ap[ 0 ].szName );
388
fputs( " vs. ", pf );
389
PostScriptEscape( pf, ap[ 1 ].szName );
437
PostScriptEscape( pf, szTitle );
390
438
fputs( ")\n", pf );
442
fputs ( aszPrologue[ 0 ], pf );
446
for ( i = 1; i < NUM_FONTS; ++i )
447
fprintf ( pf, "/%s { /%s findfont exch scalefont setfont } "
448
"bind def\n", aszFont[ i ], aszFontName[ i ] );
392
fprintf( pf, szPrologue, fClockwise ? -20 : 20,
450
fprintf( pf, aszPrologue[ 1 ], fClockwise ? -20 : 20,
393
451
fClockwise ? 320 : 80, fClockwise ? 365 : 35 );
401
459
static void DrawPostScriptPoint( FILE *pf, int i, int fPlayer, int c ) {
406
464
x = 320 - 20 * i;
516
PostScriptPositionID ( FILE *pf, matchstate *pms ) {
518
int anBoard[ 2 ][ 25 ];
520
memcpy ( anBoard, pms->anBoard, sizeof ( anBoard ) );
523
SwapSides ( anBoard );
525
RequestFont ( pf, FONT_RM, 10 );
526
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (" : "%d %d moveto (",
527
285 - 200 * nMag / 100, y );
528
fputs ( _("Position ID:"), pf );
530
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
532
RequestFont ( pf, FONT_TT, 10 );
533
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (" : "%d %d moveto (",
534
285 - 200 * nMag / 100 + 55, y );
535
fputs ( PositionID ( anBoard ), pf );
536
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
538
RequestFont ( pf, FONT_RM, 10 );
539
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (" : "%d %d moveto (",
540
285 - 200 * nMag / 100 + 160, y );
541
fputs ( _("Match ID:"), pf );
542
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
544
RequestFont ( pf, FONT_TT, 10 );
545
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (" : "%d %d moveto (",
546
285 - 200 * nMag / 100 + 205, y );
547
fputs ( MatchIDFromMatchState ( pms ), pf );
548
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
553
PostScriptPipCounts ( FILE *pf, int anBoard[ 2 ][ 25 ], int fMove ) {
558
memcpy ( an, anBoard, sizeof ( an ) );
563
PipCount ( an, anPips );
566
RequestFont ( pf, FONT_RM, 10 );
567
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (" : "%d %d moveto (",
568
285 - 200 * nMag / 100, y );
569
fprintf ( pf, _("Pip counts: %s %d, %s %d"),
570
ap[ 0 ].szName, anPips[ 0 ], ap[ 1 ].szName, anPips[ 1 ] );
571
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
457
575
static void PrintPostScriptBoard( FILE *pf, matchstate *pms, int fPlayer ) {
459
577
int yCube, theta, cos, sin, anOff[ 2 ] = { 15, 15 }, i;
578
gchar buf[ G_ASCII_DTOSTR_BUF_SIZE ];
461
580
if( pms->fCubeOwner < 0 ) {
478
597
Advance( pf, 260 * nMag / 100 );
479
598
ReleaseFont( pf );
482
601
/* FIXME most of the following could be encapsulated into a PDF
483
602
XObject to optimise the output file */
484
fprintf( pf, "q 1 0 0 1 %d %d cm %.2f 0 0 %.2f 0 0 cm 0.5 g\n",
485
225 - 200 * nMag / 100, y, nMag / 100.0, nMag / 100.0 );
603
fprintf( pf, "q 1 0 0 1 %d %d cm %s 0 0 %s 0 0 cm 0.5 g\n",
604
225 - 200 * nMag / 100, y,
605
g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", nMag / 100.0),
606
g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", nMag / 100.0));
486
607
fputs( "60 10 280 240 re S\n", pf );
487
608
for( i = 0; i < 6; i++ ) {
488
609
fprintf( pf, "%d %d m %d %d l %d %d l %c\n",
518
639
pms->nCube == 1 ? 64 : pms->nCube );
520
641
fprintf( pf, "gsave\n"
521
"%d %d translate %.2f %.2f scale\n"
522
"0 0 moveto %s board\n"
523
"%d %d %d cube\n", 225 - 200 * nMag / 100, y,
524
nMag / 100.0, nMag / 100.0, fPlayer ? "true" : "false",
525
pms->nCube == 1 ? 64 : pms->nCube, yCube, theta );
642
"%d %d translate %s %s scale\n"
643
"0 0 moveto %s board\n"
644
"%d %d %d cube\n", 225 - 200 * nMag / 100, y,
645
g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", nMag / 100.0),
646
g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", nMag / 100.0),
647
fPlayer ? "true" : "false",
648
pms->nCube == 1 ? 64 : pms->nCube, yCube, theta );
527
650
for( i = 0; i < 25; i++ ) {
528
651
anOff[ 0 ] -= pms->anBoard[ 0 ][ i ];
661
799
pch = pchBreak + 1;
665
static void PrintPostScriptCubeAnalysis( FILE *pf, matchstate *pms,
666
int fPlayer, float arDouble[ 4 ],
806
PrintPostScriptLine ( FILE *pf, unsigned char *pch ) {
808
PrintPostScriptLineWithSkip ( pf, pch, 0, FONT_RM, 10 );
813
PrintPostScriptLineFont ( FILE *pf, unsigned char *pch,
814
font fn, int nSize ) {
816
PrintPostScriptLineWithSkip ( pf, pch, 0, fn, nSize );
823
PrintPostScriptComment ( FILE *pf, unsigned char *pch ) {
825
PrintPostScriptLineWithSkip ( pf, pch, 6, FONT_RM, 10 );
832
PrintPostScriptCubeAnalysis( FILE *pf, const matchstate *pms,
834
const float aarOutput[2][ NUM_ROLLOUT_OUTPUTS ],
835
const float aarStdDev[2][ NUM_ROLLOUT_OUTPUTS ],
836
const evalsetup* pes ) {
669
char sz[ 1024 ], *pch, *pchNext;
838
char *sz, *pch, *pchNext;
671
840
if( pes->et == EVAL_NONE )
674
843
SetCubeInfo( &ci, pms->nCube, pms->fCubeOwner, fPlayer, pms->nMatchTo,
675
pms->anScore, pms->fCrawford, fJacoby, nBeavers );
677
if( !GetDPEq( NULL, NULL, &ci ) )
678
/* No cube action possible */
681
GetCubeActionSz( arDouble, sz, &ci, fOutputMWC, FALSE );
844
pms->anScore, pms->fCrawford, pms->fJacoby, nBeavers,
847
sz = OutputCubeAnalysis( aarOutput, aarStdDev, pes, &ci );
684
850
for( pch = sz; pch && *pch; pch = pchNext ) {
712
878
fPlayer ? "fill" : "stroke" );
883
PostScriptMatchInfo ( FILE *pf, matchinfo *pmi ) {
892
PrintPostScriptLineFont ( pf, _("Match Information" ), FONT_RM_BOLD, 14 );
897
RequestFont ( pf, FONT_RM, 10 );
898
for ( i = 0; i < 2; ++i ) {
899
sprintf ( sz, _("%s's rating: %s"),
901
pmi->pchRating[ i ] ? pmi->pchRating[ i ] : _("n/a") );
902
PrintPostScriptLine ( pf, sz );
909
tmx.tm_year = pmi->nYear - 1900;
910
tmx.tm_mon = pmi->nMonth - 1;
911
tmx.tm_mday = pmi->nDay;
912
strftime ( szx, sizeof ( szx ), _("%B %d, %Y"), &tmx );
913
sprintf ( sz, _("Date: %s"), szx );
914
PrintPostScriptLine ( pf, sz );
917
PrintPostScriptLine ( pf, _("Date: n/a") );
919
/* event, round, place and annotator */
921
sprintf( sz, _("Event: %s"),
922
pmi->pchEvent ? pmi->pchEvent : _("n/a") );
923
PrintPostScriptLine ( pf, sz );
925
sprintf( sz, _("Round: %s"),
926
pmi->pchRound ? pmi->pchRound : _("n/a") );
927
PrintPostScriptLine ( pf, sz );
929
sprintf( sz, _("Place: %s"),
930
pmi->pchPlace ? pmi->pchPlace : _("n/a") );
931
PrintPostScriptLine ( pf, sz );
933
sprintf( sz, _("Annotator: %s"),
934
pmi->pchAnnotator ? pmi->pchAnnotator : _("n/a") );
935
PrintPostScriptLine ( pf, sz );
937
sprintf( sz, _("Comments: %s"),
938
pmi->pchComment ? pmi->pchComment : _("n/a") );
939
PrintPostScriptLine ( pf, sz );
946
PostScriptBoardHeader ( FILE *pf, matchstate *pms, const int iMove ) {
951
RequestFont ( pf, FONT_RM_BOLD, 10 );
952
fprintf( pf, fPDF ? "1 0 0 1 0 %d Tm (" : "0 %d moveto (", y );
953
fprintf ( pf,_("Move number %d:"), iMove + 1 );
954
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
956
RequestFont ( pf, FONT_RM, 10 );
957
fprintf( pf, fPDF ? "1 0 0 1 100 %d Tm (" : "100 %d moveto (", y );
959
if ( pms->fResigned )
964
_("%s resigns %d points"),
965
ap[ pms->fTurn ].szName,
966
pms->fResigned * pms->nCube
969
else if ( pms->anDice[ 0 ] && pms->anDice[ 1 ] )
971
/* chequer play decision */
974
_("%s to play %d%d"),
975
ap[ pms->fTurn ].szName,
976
pms->anDice[ 0 ], pms->anDice[ 1 ]
979
else if ( pms->fDoubled )
984
_("%s doubles to %d"),
985
ap[ pms->fMove ].szName,
994
_("%s on roll, cube decision?"),
995
ap[ pms->fTurn ].szName
998
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
715
1003
static void ExportGamePostScript( FILE *pf, list *plGame ) {
719
1007
matchstate msExport;
720
1008
int fTook = FALSE, i, cx;
721
1009
char sz[ 1024 ], *pch;
1012
updateStatisticsGame ( plGame );
723
1014
for( pl = plGame->plNext; pl != plGame; pl = pl->plNext ) {
1016
FixMatchState ( &msExport, pmr );
725
1017
switch( pmr->mt ) {
726
1018
case MOVE_GAMEINFO:
727
/* FIXME game introduction */
1020
ApplyMoveRecord ( &msExport, plGame, pmr );
1024
RequestFont( pf, FONT_RM, 14 );
1026
sprintf( sz, _("%d point match (game %d)"), pmr->g.nMatch,
1029
sprintf( sz, _("Money session (game %d)"), pmr->g.i + 1 );
1031
fprintf( pf, fPDF ? "1 0 0 1 0 %d Tm (%s) Tj\n" :
1032
"0 %d moveto (%s) show\n", y, sz );
1035
PlayerSymbol( pf, 8, 0 );
1036
RequestFont( pf, FONT_RM, 12 );
1037
fprintf( pf, fPDF ? "1 0 0 1 16 %d Tm (" : "16 %d moveto (",
1039
PostScriptEscape( pf, ap[ 0 ].szName );
1040
fprintf( pf, _(" (%d points)"), pmr->g.anScore[ 0 ] );
1041
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
1043
PlayerSymbol( pf, 225, 1 );
1044
RequestFont( pf, FONT_RM, 12 );
1045
fprintf( pf, fPDF ? "1 0 0 1 233 %d Tm (" : "233 %d moveto (",
1047
PostScriptEscape( pf, ap[ 1 ].szName );
1048
fprintf( pf, _(" (%d points)"), pmr->g.anScore[ 1 ] );
1049
fputs( fPDF ? ") Tj\n" : ") show\n", pf );
1051
/* match information */
1053
if ( exsExport.fIncludeMatchInfo )
1054
PostScriptMatchInfo ( pf, &mi );
730
1058
case MOVE_NORMAL:
1060
msExport.fTurn = msExport.fMove = pmr->fPlayer;
1061
msExport.anDice[ 0 ] = pmr->anDice[ 0 ];
1062
msExport.anDice[ 1 ] = pmr->anDice[ 1 ];
732
1065
/* no need to print board following a double/take */
735
Ensure( pf, 260 * nMag / 100 + 10 );
736
PrintPostScriptBoard( pf, &msExport, pmr->n.fPlayer );
1068
Ensure( pf, 260 * nMag / 100 + 30 );
1069
PostScriptBoardHeader ( pf, &msExport, iMove );
1070
PrintPostScriptBoard( pf, &msExport, pmr->fPlayer );
739
PrintPostScriptCubeAnalysis( pf, &msExport, pmr->n.fPlayer,
740
pmr->n.arDouble, &pmr->n.esDouble );
1073
PrintPostScriptCubeAnalysis( pf, &msExport, pmr->fPlayer,
1074
GCCCONSTAHACK pmr->CubeDecPtr->aarOutput,
1075
GCCCONSTAHACK pmr->CubeDecPtr->aarStdDev,
1076
&pmr->CubeDecPtr->esDouble );
742
1078
Advance( pf, 10 );
743
1079
FormatMove( sz, msExport.anBoard, pmr->n.anMove );
744
1080
RequestFont( pf, FONT_RM, 10 );
745
1081
cx = 15 /* 2 digits + colon + space */ +
746
StringWidth( aszLuckTypeAbbr[ pmr->n.lt ] ) +
747
StringWidth( aszSkillTypeAbbr[ pmr->n.st ] ) +
1082
StringWidth( aszLuckTypeAbbr[ pmr->lt ] ) +
1083
StringWidth( aszSkillTypeAbbr[ pmr->n.stMove ] ) +
748
1084
StringWidth( sz );
749
1085
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (%d%d%s: %s%s) Tj\n" :
750
1086
"%d %d moveto (%d%d%s: %s%s) show\n",
751
1087
225 - cx / 2 + 6, y,
752
pmr->n.anRoll[ 0 ], pmr->n.anRoll[ 1 ],
753
aszLuckTypeAbbr[ pmr->n.lt ], sz,
754
aszSkillTypeAbbr[ pmr->n.st ] );
755
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->n.fPlayer );
1088
pmr->anDice[ 0 ], pmr->anDice[ 1 ],
1089
aszLuckTypeAbbr[ pmr->lt ], sz,
1090
aszSkillTypeAbbr[ pmr->n.stMove ] );
1091
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->fPlayer );
1092
/* FIXME: output cube skill as well */
757
if( pmr->n.ml.cMoves ) {
1094
if( pmr->ml.cMoves ) {
759
for( i = 0; i < pmr->n.ml.cMoves && i <= pmr->n.iMove; i++ ) {
1096
for( i = 0; i < pmr->ml.cMoves && i <= pmr->n.iMove; i++ ) {
760
1097
if( i >= 5 /* FIXME allow user to choose limit */ &&
761
1098
i != pmr->n.iMove )
788
PrintPostScriptComment( pf, pmr->a.sz );
1125
PrintPostScriptComment( pf, pmr->sz );
794
1133
case MOVE_DOUBLE:
795
1134
Ensure( pf, 260 * nMag / 100 );
796
PrintPostScriptBoard( pf, &msExport, pmr->d.fPlayer );
1135
PrintPostScriptBoard( pf, &msExport, pmr->fPlayer );
798
PrintPostScriptCubeAnalysis( pf, &msExport, pmr->d.fPlayer,
799
pmr->d.arDouble, &pmr->d.esDouble );
1137
PrintPostScriptCubeAnalysis( pf, &msExport, pmr->fPlayer,
1138
GCCCONSTAHACK pmr->CubeDecPtr->aarOutput,
1139
GCCCONSTAHACK pmr->CubeDecPtr->aarStdDev,
1140
&pmr->CubeDecPtr->esDouble );
801
1142
Advance( pf, 10 );
802
1143
RequestFont( pf, FONT_RM, 10 );
803
1144
/* (Double) stringwidth = 29.439 */
804
cx = StringWidth( aszSkillTypeAbbr[ pmr->d.st ] ) + 29;
805
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (Double%s) Tj\n" :
806
"%d %d moveto (Double%s) show\n", 225 - cx / 2 + 6, y,
807
aszSkillTypeAbbr[ pmr->d.st ] );
1145
cx = StringWidth( aszSkillTypeAbbr[ pmr->stCube ] ) + 29;
1146
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (%s%s) Tj\n" :
1147
"%d %d moveto (%s%s) show\n", 225 - cx / 2 + 6, y,
1149
aszSkillTypeAbbr[ pmr->stCube ] );
809
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->n.fPlayer );
1151
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->fPlayer );
811
PrintPostScriptComment( pf, pmr->a.sz );
1153
PrintPostScriptComment( pf, pmr->sz );
820
1164
Advance( pf, 10 );
821
1165
RequestFont( pf, FONT_RM, 10 );
822
1166
/* (Take) stringwidth = 19.9892 */
823
cx = StringWidth( aszSkillTypeAbbr[ pmr->d.st ] ) + 20;
824
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (Take%s) Tj\n" :
825
"%d %d moveto (Take%s) show\n", 225 - cx / 2 + 6, y,
826
aszSkillTypeAbbr[ pmr->d.st ] );
1167
cx = StringWidth( aszSkillTypeAbbr[ pmr->stCube ] ) + 20;
1168
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (%s%s) Tj\n" :
1169
"%d %d moveto (%s%s) show\n", 225 - cx / 2 + 6, y,
1171
aszSkillTypeAbbr[ pmr->stCube ] );
828
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->n.fPlayer );
1173
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->fPlayer );
830
PrintPostScriptComment( pf, pmr->a.sz );
1175
PrintPostScriptComment( pf, pmr->sz );
837
1184
Advance( pf, 10 );
838
1185
RequestFont( pf, FONT_RM, 10 );
839
1186
/* (Drop) stringwidth = 20.5494 */
840
cx = StringWidth( aszSkillTypeAbbr[ pmr->d.st ] ) + 20;
841
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (Drop%s) Tj\n" :
842
"%d %d moveto (Drop%s) show\n", 225 - cx / 2 + 6, y,
843
aszSkillTypeAbbr[ pmr->d.st ] );
845
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->n.fPlayer );
847
PrintPostScriptComment( pf, pmr->a.sz );
1187
cx = StringWidth( aszSkillTypeAbbr[ pmr->stCube ] ) + 20;
1188
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (%s%s) Tj\n" :
1189
"%d %d moveto (%s%s) show\n", 225 - cx / 2 + 6, y,
1191
aszSkillTypeAbbr[ pmr->stCube ] );
1193
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->fPlayer );
1195
PrintPostScriptComment( pf, pmr->sz );
853
1203
case MOVE_RESIGN:
854
1204
Advance( pf, 10 );
855
1205
RequestFont( pf, FONT_RM, 10 );
856
1206
/* (Resigns ) stringwidth = 34.1685 */
857
cx = StringWidth( aszGameResult[ pmr->r.nResigned - 1 ] ) + 34;
858
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (Resigns %s) Tj\n" :
859
"%d %d moveto (Resigns %s) show\n", 225 - cx / 2 + 6, y,
860
aszGameResult[ pmr->r.nResigned - 1 ] );
1207
cx = StringWidth( gettext ( aszGameResult[ pmr->r.nResigned - 1 ] ) ) + 34;
1208
fprintf( pf, fPDF ? "1 0 0 1 %d %d Tm (%s %s) Tj\n" :
1209
"%d %d moveto (%s %s) show\n", 225 - cx / 2 + 6, y,
1211
gettext ( aszGameResult[ pmr->r.nResigned - 1 ] ) );
862
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->n.fPlayer );
1213
PlayerSymbol( pf, 225 - cx / 2 - 2, pmr->fPlayer );
864
1215
/* FIXME print resignation analysis, if available */
866
PrintPostScriptComment( pf, pmr->a.sz );
1217
PrintPostScriptComment( pf, pmr->sz );
872
1225
case MOVE_SETDICE:
876
1233
case MOVE_SETBOARD:
877
1234
case MOVE_SETCUBEVAL:
878
1235
case MOVE_SETCUBEPOS:
936
1293
static void ExportGameGeneral( int f, char *sz ) {
1296
char szTitle[ 128 ];
940
1298
sz = NextToken( &sz );
943
outputl( "No game in progress (type `new game' to start one)." );
1301
outputl( _("No game in progress (type `new game' to start one).") );
947
1305
if( !sz || !*sz ) {
948
outputl( "You must specify a file to export to (see `help export"
949
"game postscript')." ); /* FIXME not necessarily PS */
1306
outputf( _("You must specify a file to export to (see `help export "
1307
"game %s').\n"), f ? "pdf" : "postscript" );
1311
if ( ! confirmOverwrite ( sz, fConfirmSave ) )
953
1314
if( !strcmp( sz, "-" ) ) {
955
outputl( "PDF files may not be written to standard output ("
956
"see `help export game pdf')." );
1316
outputl( _("PDF files may not be written to standard output ("
1317
"see `help export game pdf').") );
961
1322
} else if( !( pf = fopen( sz, f ? "wb" : "w" ) ) ) {
967
PostScriptPrologue( pf );
1328
sprintf( szTitle, "%s vs. %s", ap[ 0 ].szName, ap[ 1 ].szName );
1329
PostScriptPrologue( pf, FALSE, szTitle );
969
1331
ExportGamePostScript( pf, plGame );
999
1365
if( !sz || !*sz ) {
1000
outputf( "You must specify a file to export to (see `help export "
1001
"match %s\n').", f ? "pdf" : "postscript" );
1366
outputf( _("You must specify a file to export to (see `help export "
1367
"match %s').\n"), f ? "pdf" : "postscript" );
1371
if ( ! confirmOverwrite ( sz, fConfirmSave ) )
1005
1374
if( !strcmp( sz, "-" ) ) {
1007
outputl( "PDF files may not be written to standard output ("
1008
"see `help export match pdf')." );
1376
outputl( _("PDF files may not be written to standard output ("
1377
"see `help export match pdf').") );
1013
1382
} else if( !( pf = fopen( sz, f ? "wb" : "w" ) ) ) {
1019
PostScriptPrologue( pf );
1388
sprintf( szTitle, "%s vs. %s", ap[ 0 ].szName, ap[ 1 ].szName );
1389
PostScriptPrologue( pf, FALSE, szTitle );
1021
1391
/* FIXME write match introduction? */
1039
1412
ExportMatchGeneral( FALSE, sz );
1415
extern void CommandExportPositionEPS( char *sz ) {
1420
sz = NextToken( &sz );
1422
if( ms.gs == GAME_NONE ) {
1423
outputl( _("No game in progress (type `new game' to start one).") );
1428
outputl( _("You must specify a file to export to (see `help export "
1429
"position eps').") );
1433
if ( ! confirmOverwrite ( sz, fConfirmSave ) )
1436
if( !strcmp( sz, "-" ) )
1438
else if( !( pf = fopen( sz, "w" ) ) ) {
1444
sprintf( szTitle, _("Position %s"), PositionID( ms.anBoard ) );
1445
PostScriptPrologue( pf, TRUE, szTitle );
1447
PrintPostScriptBoard( pf, &ms, ms.fTurn );
1449
PostScriptEpilogue( pf );
1454
setDefaultFileName ( sz, PATH_EPS );