1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-26 18:23:08 +02:00

sch2fig/: graphics backend can be selected from the command line

This commit is contained in:
Werner Almesberger 2016-07-31 21:52:35 -03:00
parent 01fed0d456
commit f3ed4edbd2
7 changed files with 45 additions and 16 deletions

View File

@ -232,6 +232,7 @@ static void cr_end(void *ctx)
const struct gfx_ops cairo_ops = { const struct gfx_ops cairo_ops = {
.name = "cairo",
// .line = cr_line, @@@ later // .line = cr_line, @@@ later
.poly = cr_poly, .poly = cr_poly,
.circ = cr_circ, .circ = cr_circ,

View File

@ -268,6 +268,7 @@ static void *fig_init(int argc, char *const *argv)
const struct gfx_ops fig_ops = { const struct gfx_ops fig_ops = {
.name = "fig",
.line = fig_line, .line = fig_line,
.rect = fig_rect, .rect = fig_rect,
.poly = fig_poly, .poly = fig_poly,

View File

@ -20,6 +20,7 @@
struct gfx_ops { struct gfx_ops {
const char *name;
void (*line)(void *ctx, int sx, int sy, int ex, int ey, void (*line)(void *ctx, int sx, int sy, int ex, int ey,
int color, unsigned layer); int color, unsigned layer);
void (*rect)(void *ctx, int sx, int sy, int ex, int ey, void (*rect)(void *ctx, int sx, int sy, int ex, int ey,

View File

@ -27,6 +27,12 @@
#include "main.h" #include "main.h"
static struct gfx_ops const *ops_list[] = {
&fig_ops,
&cairo_ops,
};
static bool do_lib_parse(void *user, const char *line) static bool do_lib_parse(void *user, const char *line)
{ {
return lib_parse(user, line); return lib_parse(user, line);
@ -36,9 +42,11 @@ static bool do_lib_parse(void *user, const char *line)
void usage(const char *name) void usage(const char *name)
{ {
fprintf(stderr, fprintf(stderr,
"usage: %s [-r] [file.lib ...] file.sch -- driver_options\n\n" "usage: %s [-r] [file.lib ...] file.sch -- driver_spec\n\n"
" FIG driver options:\n" " FIG driver spec:\n"
" [-t template.fig] [var=value ...]\n" " fig [-t template.fig] [var=value ...]\n"
" Cairo driver spec:\n"
" cairo\n"
, name); , name);
exit(1); exit(1);
} }
@ -52,6 +60,7 @@ int main(int argc, char *const *argv)
int arg, dashdash; int arg, dashdash;
int gfx_argc; int gfx_argc;
char **gfx_argv; char **gfx_argv;
const struct gfx_ops **ops = ops_list;
for (dashdash = 1; dashdash != argc; dashdash++) for (dashdash = 1; dashdash != argc; dashdash++)
if (!strcmp(argv[dashdash], "--")) if (!strcmp(argv[dashdash], "--"))
@ -76,19 +85,31 @@ int main(int argc, char *const *argv)
file_read(argv[arg], do_lib_parse, &ctx); file_read(argv[arg], do_lib_parse, &ctx);
} }
/* if (dashdash == argc) {
* Special case: if we have no --, we don't subtract it and argc gfx_argc = 1;
* becomes 1 (and no 0). gfx_argv = alloc_size(sizeof(const char *) * 2);
*/ gfx_argv[0] = (char *) (*ops)->name;
gfx_argc = argc == dashdash ? 1 : argc - dashdash; gfx_argv[1] = NULL;
} else {
gfx_argc = argc - dashdash - 1;
gfx_argv = alloc_size(sizeof(const char *) * (gfx_argc + 1)); gfx_argv = alloc_size(sizeof(const char *) * (gfx_argc + 1));
gfx_argv[0] = argv[0]; memcpy(gfx_argv, argv + dashdash + 1,
memcpy(gfx_argv + 1, argv + dashdash + 1, sizeof(const char *) * (gfx_argc + 1));
sizeof(const char *) * gfx_argc);
for (ops = ops_list; ops != ARRAY_END(ops_list); ops++)
if (!strcmp((*ops)->name, *gfx_argv))
goto found;
fprintf(stderr, "graphics backend \"%s\" not found\n",
*gfx_argv);
exit(1);
found:
;
}
sch_init(&sch_ctx, recurse); sch_init(&sch_ctx, recurse);
sch_parse(&sch_ctx, argv[dashdash - 1]); sch_parse(&sch_ctx, argv[dashdash - 1]);
gfx_init(&fig_ops, gfx_argc, gfx_argv); gfx_init(*ops, gfx_argc, gfx_argv);
if (recurse) { if (recurse) {
const struct sheet *sheet; const struct sheet *sheet;

View File

@ -56,7 +56,8 @@ while [ "$2" ]; do
shift shift
done done
./sch2fig $libs "$1" -- $template "TITLE=`basename \"$1\" .sch`" NUMBER=$num | ./sch2fig $libs "$1" \
-- fig $template "TITLE=`basename \"$1\" .sch`" NUMBER=$num |
fig2dev -L pdf >"$out" fig2dev -L pdf >"$out"
sheet=false sheet=false
@ -83,7 +84,7 @@ while read line; do
$quiet || echo "$file" 1>&2 $quiet || echo "$file" 1>&2
./sch2fig $libs `dirname "$1"`/$file \ ./sch2fig $libs `dirname "$1"`/$file \
-- $template "TITLE=$name" NUMBER=$num | -- fig $template "TITLE=$name" NUMBER=$num |
fig2dev -L pdf >_tmp.pdf fig2dev -L pdf >_tmp.pdf
pdfunite "$out" _tmp.pdf _tmp2.pdf pdfunite "$out" _tmp.pdf _tmp2.pdf
mv _tmp2.pdf "$out" mv _tmp2.pdf "$out"

View File

@ -30,7 +30,7 @@ while [ $sheet -le 38 ]; do
file=$dir/$prefix$sn.png file=$dir/$prefix$sn.png
$dir/../sch2fig $dir/neo900-ee/hw/neo900.lib \ $dir/../sch2fig $dir/neo900-ee/hw/neo900.lib \
$dir/kicad-libs/components/powered.lib "$in" \ $dir/kicad-libs/components/powered.lib "$in" \
-- -t $dir/frame.fig SHEET=$sn | -- fig -t $dir/frame.fig SHEET=$sn |
fig2dev -L png -m 2 >$file fig2dev -L png -m 2 >$file
sheet=`expr $sheet + 1` sheet=`expr $sheet + 1`
done done

View File

@ -38,6 +38,10 @@
stralloc_tmp; }) stralloc_tmp; })
#define ARRAY_ELEMENTS(a) (sizeof(a) / sizeof(a[0]))
#define ARRAY_END(a) ((a) + ARRAY_ELEMENTS(a))
#define swap(a, b) \ #define swap(a, b) \
({ typeof(a) _tmp = (a); a = (b); b = _tmp; }) ({ typeof(a) _tmp = (a); a = (b); b = _tmp; })