mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 13:16:21 +02:00
sch2fig/: abstract graphical output interface
This commit is contained in:
parent
b933c9976f
commit
4267efae0d
@ -11,7 +11,7 @@
|
||||
#
|
||||
|
||||
NAME = sch2fig
|
||||
OBJS = main.o sch.o lib.o fig.o dwg.o text.o misc.o
|
||||
OBJS = main.o sch.o lib.o fig.o gfx.o dwg.o text.o misc.o
|
||||
|
||||
CFLAGS = -g -O -Wall -Wextra -Wno-unused-parameter -Wshadow
|
||||
LIBS = -lm
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include "misc.h"
|
||||
#include "style.h"
|
||||
#include "text.h"
|
||||
#include "fig.h"
|
||||
#include "gfx.h"
|
||||
#include "dwg.h"
|
||||
|
||||
|
||||
@ -231,7 +231,7 @@ void dwg_glabel(int x, int y, const char *s, int dir, int dim,
|
||||
|
||||
vx[0] = vx[n - 1];
|
||||
vy[0] = vy[n - 1];
|
||||
fig_poly(n, vx, vy, COLOR_GLABEL, COLOR_NONE, LAYER_GLABEL);
|
||||
gfx_poly(n, vx, vy, COLOR_GLABEL, COLOR_NONE, LAYER_GLABEL);
|
||||
}
|
||||
|
||||
|
||||
@ -361,7 +361,7 @@ void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
|
||||
txt.rot = rot % 180;
|
||||
|
||||
text_fig(&txt, COLOR_HLABEL, LAYER_HLABEL);
|
||||
fig_poly(n + 1, vx, vy, COLOR_HLABEL, COLOR_NONE, LAYER_HLABEL);
|
||||
gfx_poly(n + 1, vx, vy, COLOR_HLABEL, COLOR_NONE, LAYER_HLABEL);
|
||||
}
|
||||
|
||||
|
||||
@ -370,7 +370,7 @@ void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
|
||||
|
||||
void dwg_junction(int x, int y)
|
||||
{
|
||||
fig_circ(x, y, JUNCTION_R, COLOR_NONE, COLOR_WIRE, LAYER_WIRES);
|
||||
gfx_circ(x, y, JUNCTION_R, COLOR_NONE, COLOR_WIRE, LAYER_WIRES);
|
||||
}
|
||||
|
||||
|
||||
@ -379,9 +379,9 @@ void dwg_noconn(int x, int y)
|
||||
int vx[2] = { x - NOCONN_LEN, x + NOCONN_LEN };
|
||||
int vy[2] = { y - NOCONN_LEN, y + NOCONN_LEN };
|
||||
|
||||
fig_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
|
||||
gfx_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
|
||||
swap(vy[0], vy[1]);
|
||||
fig_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
|
||||
gfx_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
|
||||
}
|
||||
|
||||
|
||||
@ -394,7 +394,7 @@ void dwg_wire(int sx, int sy, int ex, int ey)
|
||||
int vy[] = { sy, ey };
|
||||
|
||||
// WIDTH_WIRE
|
||||
fig_poly(2, vx, vy, COLOR_WIRE, COLOR_NONE, LAYER_WIRES);
|
||||
gfx_poly(2, vx, vy, COLOR_WIRE, COLOR_NONE, LAYER_WIRES);
|
||||
}
|
||||
|
||||
|
||||
@ -404,5 +404,5 @@ void dwg_bus(int sx, int sy, int ex, int ey)
|
||||
int vy[] = { sy, ey };
|
||||
|
||||
// WIDTH_BUS
|
||||
fig_poly(2, vx, vy, COLOR_BUS, COLOR_NONE, LAYER_BUSSES);
|
||||
gfx_poly(2, vx, vy, COLOR_BUS, COLOR_NONE, LAYER_BUSSES);
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ static inline float pt(int x)
|
||||
/* ----- Schematics items -------------------------------------------------- */
|
||||
|
||||
|
||||
void fig_line(int sx, int sy, int ex, int ey)
|
||||
void fig_line(void *ctx, int sx, int sy, int ex, int ey)
|
||||
{
|
||||
// TypeStyle FillCol AreaFil Cap FwdAr
|
||||
// SubTy Color Pen StyleV Rad BwdAr
|
||||
@ -65,7 +65,7 @@ void fig_line(int sx, int sy, int ex, int ey)
|
||||
/* ----- General items ----------------------------------------------------- */
|
||||
|
||||
|
||||
void fig_rect(int sx, int sy, int ex, int ey,
|
||||
void fig_rect(void *ctx, int sx, int sy, int ex, int ey,
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
// Type Thick Depth StyleV Rad
|
||||
@ -80,7 +80,7 @@ void fig_rect(int sx, int sy, int ex, int ey,
|
||||
}
|
||||
|
||||
|
||||
void fig_poly(int points, int x[points], int y[points],
|
||||
void fig_poly(void *ctx, int points, int x[points], int y[points],
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
int i;
|
||||
@ -100,7 +100,8 @@ void fig_poly(int points, int x[points], int y[points],
|
||||
}
|
||||
|
||||
|
||||
void fig_circ(int x, int y, int r, int color, int fill_color, unsigned layer)
|
||||
void fig_circ(void *ctx, int x, int y, int r,
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
// Type Thick Depth StyleV Cx Rx Sx Ex
|
||||
// SubTy Color Pen Dir Cy Ry Sy Ey
|
||||
@ -129,7 +130,7 @@ static int ay(int x, int y, int r, int angle)
|
||||
}
|
||||
|
||||
|
||||
void fig_arc(int x, int y, int r, int sa, int ea,
|
||||
void fig_arc(void *ctx, int x, int y, int r, int sa, int ea,
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
int ma = (sa + ea) / 2;
|
||||
@ -147,7 +148,7 @@ void fig_arc(int x, int y, int r, int sa, int ea,
|
||||
}
|
||||
|
||||
|
||||
void fig_text(int x, int y, const char *s, unsigned size,
|
||||
void fig_text(void *ctx, int x, int y, const char *s, unsigned size,
|
||||
enum text_align align, int rot, unsigned color, unsigned layer)
|
||||
{
|
||||
// Type Depth FontSiz Height
|
||||
@ -201,14 +202,14 @@ static bool apply_vars(char *buf, int n_vars, const char **vars)
|
||||
}
|
||||
|
||||
|
||||
void fig_init(const char *template, int n_vars, const char **vars)
|
||||
void *fig_init(const char *template, int n_vars, const char **vars)
|
||||
{
|
||||
FILE *file;
|
||||
char buf[1000];
|
||||
|
||||
if (!template) {
|
||||
fig_header();
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
file = fopen(template, "r");
|
||||
@ -221,4 +222,20 @@ void fig_init(const char *template, int n_vars, const char **vars)
|
||||
printf("%s", buf);
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ----- Operations -------------------------------------------------------- */
|
||||
|
||||
|
||||
const struct gfx_ops fig_ops = {
|
||||
.line = fig_line,
|
||||
.rect = fig_rect,
|
||||
.poly = fig_poly,
|
||||
.circ = fig_circ,
|
||||
.arc = fig_arc,
|
||||
.text = fig_text,
|
||||
.init = fig_init,
|
||||
};
|
||||
|
@ -14,27 +14,9 @@
|
||||
#ifndef FIG_H
|
||||
#define FIG_H
|
||||
|
||||
#include "text.h"
|
||||
#include "gfx.h"
|
||||
|
||||
|
||||
/* schematics */
|
||||
|
||||
void fig_line(int sx, int sy, int ex, int ey);
|
||||
|
||||
/* general */
|
||||
|
||||
void fig_rect(int sx, int sy, int ex, int ey,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void fig_poly(int points, int x[points], int y[points],
|
||||
int color, int fill_color, unsigned layer);
|
||||
void fig_circ(int x, int y, int r, int color, int fill_color, unsigned layer);
|
||||
void fig_arc(int x, int y, int r, int sa, int ea,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void fig_text(int x, int y, const char *s, unsigned size,
|
||||
enum text_align align, int rot, unsigned color, unsigned layer);
|
||||
|
||||
/* inititalization */
|
||||
|
||||
void fig_init(const char *template, int n_vars, const char **vars);
|
||||
extern const struct gfx_ops fig_ops;
|
||||
|
||||
#endif /* !FIG_H */
|
||||
|
76
sch2fig/gfx.c
Normal file
76
sch2fig/gfx.c
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* gfx.c - Generate graphical output for Eeschema items
|
||||
*
|
||||
* Written 2016 by Werner Almesberger
|
||||
* Copyright 2016 by Werner Almesberger
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
|
||||
#include "text.h"
|
||||
#include "gfx.h"
|
||||
|
||||
|
||||
static const struct gfx_ops *gfx_ops;
|
||||
static void *gfx_ctx;
|
||||
|
||||
|
||||
void gfx_line(int sx, int sy, int ex, int ey)
|
||||
{
|
||||
gfx_ops->line(gfx_ctx, sx, sy, ex, ey);
|
||||
}
|
||||
|
||||
|
||||
void gfx_rect(int sx, int sy, int ex, int ey,
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
if (gfx_ops->rect) {
|
||||
gfx_ops->rect(gfx_ctx, sx, sy, ex, ey,
|
||||
color, fill_color, layer);
|
||||
return;
|
||||
}
|
||||
|
||||
int vx[] = { sx, ex, ex, sx, sx };
|
||||
int vy[] = { sy, sy, ey, ey, sy };
|
||||
|
||||
gfx_poly(5, vx, vy, color, fill_color, layer);
|
||||
}
|
||||
|
||||
|
||||
void gfx_poly(int points, int x[points], int y[points],
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
gfx_ops->poly(gfx_ctx, points, x, y, color, fill_color, layer);
|
||||
}
|
||||
|
||||
|
||||
void gfx_circ(int x, int y, int r, int color, int fill_color, unsigned layer)
|
||||
{
|
||||
gfx_ops->circ(gfx_ctx, x, y, r, color, fill_color, layer);
|
||||
}
|
||||
|
||||
|
||||
void gfx_arc(int x, int y, int r, int sa, int ea,
|
||||
int color, int fill_color, unsigned layer)
|
||||
{
|
||||
gfx_ops->arc(gfx_ctx, x, y, r, sa, ea, color, fill_color, layer);
|
||||
}
|
||||
|
||||
|
||||
void gfx_text(int x, int y, const char *s, unsigned size,
|
||||
enum text_align align, int rot, unsigned color, unsigned layer)
|
||||
{
|
||||
gfx_ops->text(gfx_ctx, x, y, s, size, align, rot, color, layer);
|
||||
}
|
||||
|
||||
|
||||
void gfx_init(const struct gfx_ops *ops,
|
||||
const char *template, int n_vars, const char **vars)
|
||||
{
|
||||
gfx_ops = ops;
|
||||
gfx_ctx = ops->init(template, n_vars, vars);
|
||||
}
|
54
sch2fig/gfx.h
Normal file
54
sch2fig/gfx.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* gfx.h - Generate graphical output for Eeschema items
|
||||
*
|
||||
* Written 2016 by Werner Almesberger
|
||||
* Copyright 2016 by Werner Almesberger
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GFX_H
|
||||
#define GFX_H
|
||||
|
||||
#include "text.h"
|
||||
|
||||
|
||||
struct gfx_ops {
|
||||
void (*line)(void *ctx, int sx, int sy, int ex, int ey);
|
||||
void (*rect)(void *ctx, int sx, int sy, int ex, int ey,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void (*poly)(void *ctx, int points, int x[points], int y[points],
|
||||
int color, int fill_color, unsigned layer);
|
||||
void (*circ)(void *ctx, int x, int y, int r,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void (*arc)(void *ctx, int x, int y, int r, int sa, int ea,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void (*text)(void *ctx, int x, int y, const char *s, unsigned size,
|
||||
enum text_align align, int rot, unsigned color, unsigned layer);
|
||||
void *(*init)(const char *template, int n_vars, const char **vars);
|
||||
};
|
||||
|
||||
|
||||
/* wrappers */
|
||||
|
||||
void gfx_line(int sx, int sy, int ex, int ey);
|
||||
void gfx_rect(int sx, int sy, int ex, int ey,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void gfx_poly(int points, int x[points], int y[points],
|
||||
int color, int fill_color, unsigned layer);
|
||||
void gfx_circ(int x, int y, int r, int color, int fill_color, unsigned layer);
|
||||
void gfx_arc(int x, int y, int r, int sa, int ea,
|
||||
int color, int fill_color, unsigned layer);
|
||||
void gfx_text(int x, int y, const char *s, unsigned size,
|
||||
enum text_align align, int rot, unsigned color, unsigned layer);
|
||||
|
||||
/* inititalization */
|
||||
|
||||
void gfx_init(const struct gfx_ops *ops,
|
||||
const char *template, int n_vars, const char **vars);
|
||||
|
||||
#endif /* !GFX_H */
|
@ -20,7 +20,7 @@
|
||||
#include "util.h"
|
||||
#include "misc.h"
|
||||
#include "style.h"
|
||||
#include "fig.h"
|
||||
#include "gfx.h"
|
||||
#include "text.h"
|
||||
#include "sch.h"
|
||||
#include "lib.h"
|
||||
@ -114,17 +114,17 @@ static void draw_poly(const struct poly_obj *poly, int m[6])
|
||||
y[i] = my(poly->x[i], poly->y[i], m);
|
||||
}
|
||||
|
||||
fig_poly(n, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
gfx_poly(n, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
|
||||
switch (poly->fill) {
|
||||
case 'N':
|
||||
break;
|
||||
case 'F':
|
||||
fig_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG,
|
||||
gfx_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
case 'f':
|
||||
fig_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
gfx_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
default:
|
||||
@ -140,17 +140,17 @@ static void draw_rect(const struct rect_obj *rect, int m[6])
|
||||
int ex = mx(rect->ex, rect->ey, m);
|
||||
int ey = my(rect->ex, rect->ey, m);
|
||||
|
||||
fig_rect(sx, sy, ex, ey, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
gfx_rect(sx, sy, ex, ey, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
|
||||
switch (rect->fill) {
|
||||
case 'N':
|
||||
break;
|
||||
case 'F':
|
||||
fig_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG,
|
||||
gfx_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
case 'f':
|
||||
fig_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
gfx_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
default:
|
||||
@ -165,17 +165,17 @@ static void draw_circ(const struct circ_obj *circ, int m[6])
|
||||
int y = my(circ->x, circ->y, m);
|
||||
int r = circ->r;
|
||||
|
||||
fig_circ(x, y, r, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
gfx_circ(x, y, r, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
|
||||
switch (circ->fill) {
|
||||
case 'N':
|
||||
break;
|
||||
case 'F':
|
||||
fig_circ(x, y, r, COLOR_NONE, COLOR_COMP_DWG,
|
||||
gfx_circ(x, y, r, COLOR_NONE, COLOR_COMP_DWG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
case 'f':
|
||||
fig_circ(x, y, r, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
gfx_circ(x, y, r, COLOR_NONE, COLOR_COMP_DWG_BG,
|
||||
LAYER_COMP_DWG_BG);
|
||||
break;
|
||||
default:
|
||||
@ -205,7 +205,7 @@ static void draw_arc(const struct arc_obj *arc, int m[6])
|
||||
}
|
||||
}
|
||||
|
||||
fig_arc(x, y, arc->r, sa, ea,
|
||||
gfx_arc(x, y, arc->r, sa, ea,
|
||||
COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
|
||||
assert(arc->fill == 'N');
|
||||
@ -358,7 +358,7 @@ static void draw_pin(const struct comp *comp, const struct pin_obj *pin,
|
||||
y[0] = my(pin->x, pin->y, m);
|
||||
x[1] = mx(pin->x + dx * pin->length, pin->y + dy * pin->length, m);
|
||||
y[1] = my(pin->x + dx * pin->length, pin->y + dy * pin->length, m);
|
||||
fig_poly(2, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
gfx_poly(2, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||
|
||||
if (comp->show_pin_name)
|
||||
draw_pin_name(comp, pin, m, dx, dy, rot, hor);
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "fig.h"
|
||||
#include "gfx.h"
|
||||
#include "lib.h"
|
||||
#include "sch.h"
|
||||
|
||||
@ -92,7 +93,7 @@ int main(int argc, char **argv)
|
||||
if (argc - optind < 1)
|
||||
usage(*argv);
|
||||
|
||||
fig_init(template, n_vars, vars);
|
||||
gfx_init(&fig_ops, template, n_vars, vars);
|
||||
for (arg = optind; arg != argc; arg++) {
|
||||
if (arg == argc - 1) {
|
||||
struct sch_ctx ctx;
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "util.h"
|
||||
#include "misc.h"
|
||||
#include "style.h"
|
||||
#include "fig.h"
|
||||
#include "gfx.h"
|
||||
#include "dwg.h"
|
||||
#include "lib.h"
|
||||
#include "sch.h"
|
||||
@ -479,7 +479,7 @@ bool sch_parse(struct sch_ctx *ctx, const char *line)
|
||||
}
|
||||
if (sscanf(line, "Wire Notes Line%n", &n) == 0 && n) {
|
||||
ctx->state = sch_wire;
|
||||
ctx->wire = fig_line;
|
||||
ctx->wire = gfx_line;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -554,7 +554,7 @@ bool sch_parse(struct sch_ctx *ctx, const char *line)
|
||||
}
|
||||
if (sscanf(line, "S %d %d %u %u",
|
||||
&ctx->x, &ctx->y, &ctx->w, &ctx->h) == 4) {
|
||||
fig_rect(ctx->x, ctx->y,
|
||||
gfx_rect(ctx->x, ctx->y,
|
||||
ctx->x + ctx->w, ctx->y + ctx->h,
|
||||
COLOR_HSHEET_BOX, COLOR_NONE, LAYER_HSHEET_BOX);
|
||||
return 1;
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "util.h"
|
||||
#include "misc.h"
|
||||
#include "style.h"
|
||||
#include "fig.h"
|
||||
#include "gfx.h"
|
||||
#include "text.h"
|
||||
|
||||
|
||||
@ -107,7 +107,7 @@ void text_fig(const struct text *txt, int color, unsigned layer)
|
||||
if (!s)
|
||||
break;
|
||||
tmp = NULL;
|
||||
fig_text(x, y, s, txt->size, txt->hor, txt->rot, color, layer);
|
||||
gfx_text(x, y, s, txt->size, txt->hor, txt->rot, color, layer);
|
||||
x += rx(0, NEWLINE_SKIP * txt->size, txt->rot);
|
||||
y += ry(0, NEWLINE_SKIP * txt->size, txt->rot);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user