#define CHAR_LATIN1 1
#define CHAR_BIG5 2
-/* style flags */
-#define FILLED (1 << 0)
-#define RADIAL (1 << 1)
-#define ROUNDED (1 << 2)
-#define DIAGONALS (1 << 3)
-#define AUXLABELS (1 << 4)
-#define INVISIBLE (1 << 5)
-#define DOGEAR (1 << 6)
-#define TAB (1 << 7)
-#define FOLDER (1 << 8)
-#define BOX3D (1 << 9)
-#define COMPONENT (1 << 10)
-#define STRIPED (1 << 11)
-#define DOTTED (1 << 12)
-#define DASHED (1 << 13)
-#define WEDGED (1 << 14)
-#define PROMOTER (1 << 15)
-#define CDS (1 << 16)
-#define TERMINATOR (1 << 17)
-#define UTR (1 << 18)
-#define PRIMERSITE (1 << 19)
-#define RESTRICTIONSITE (1 << 20)
-#define FIVEPOVERHANG (1 << 21)
-#define THREEPOVERHANG (1 << 22)
-#define NOVERHANG (1 << 23)
-#define ASSEMBLY (1 << 24)
-#define SIGNATURE (1 << 25)
-#define INSULATOR (1 << 26)
-#define RIBOSITE (1 << 27)
-#define RNASTAB (1 << 28)
-#define PROTEASESITE (1 << 29)
-#define PROTEINSTAB (1 << 30)
+/* style flags (0-23)*/
+#define FILLED (1 << 0)
+#define RADIAL (1 << 1)
+#define ROUNDED (1 << 2)
+#define DIAGONALS (1 << 3)
+#define AUXLABELS (1 << 4)
+#define INVISIBLE (1 << 5)
+#define STRIPED (1 << 6)
+#define DOTTED (1 << 7)
+#define DASHED (1 << 8)
+#define WEDGED (1 << 9)
+
+#define SHAPE_MASK (127 << 24)
+
+/* shape (1-127) */
+#define DOGEAR (1 << 24)
+#define TAB (2 << 24)
+#define FOLDER (3 << 24)
+#define BOX3D (4 << 24)
+#define COMPONENT (5 << 24)
+#define PROMOTER (6 << 24)
+#define CDS (7 << 24)
+#define TERMINATOR (8 << 24)
+#define UTR (9 << 24)
+#define PRIMERSITE (10 << 24)
+#define RESTRICTIONSITE (11 << 24)
+#define FIVEPOVERHANG (12 << 24)
+#define THREEPOVERHANG (13 << 24)
+#define NOVERHANG (14 << 24)
+#define ASSEMBLY (15 << 24)
+#define SIGNATURE (16 << 24)
+#define INSULATOR (17 << 24)
+#define RIBOSITE (18 << 24)
+#define RNASTAB (19 << 24)
+#define PROTEASESITE (20 << 24)
+#define PROTEINSTAB (21 << 24)
+#define RPROMOTER (22 << 24)
+#define RARROW (23 << 24)
+#define LARROW (24 << 24)
+#define LPROMOTER (25 << 24)
/* fill types */
-#define FILL 1
-#define GRADIENT 2
-#define RGRADIENT 3
-#define NO_POLY 4 /* bit flag: if set, do fill only */
+#define FILL 1
+#define GRADIENT 2
+#define RGRADIENT 3
+#define NO_POLY 4 /* bit flag: if set, do fill only */
/* label types */
#define LT_NONE (0 << 1)
static polygon_t p_noverhang = { FALSE, 1, 4, 0., 0., 0., NOVERHANG};
static polygon_t p_assembly = { FALSE, 1, 4, 0., 0., 0., ASSEMBLY};
static polygon_t p_signature = { FALSE, 1, 4, 0., 0., 0., SIGNATURE};
+static polygon_t p_rpromoter = { FALSE, 1, 4, 0., 0., 0., RPROMOTER};
+static polygon_t p_rarrow = { FALSE, 1, 4, 0., 0., 0., RARROW};
+static polygon_t p_larrow = { FALSE, 1, 4, 0., 0., 0., LARROW};
+static polygon_t p_lpromoter = { FALSE, 1, 4, 0., 0., 0., LPROMOTER};
#define IS_BOX(n) (ND_shape(n)->polygon == &p_box)
/* True if style requires processing through round_corners. */
-#define SPECIAL_CORNERS(style) \
- ((style) & (ROUNDED | DIAGONALS | DOGEAR | TAB | FOLDER | BOX3D | COMPONENT | PROMOTER | CDS | TERMINATOR | UTR | PRIMERSITE | RESTRICTIONSITE | FIVEPOVERHANG | THREEPOVERHANG | NOVERHANG | ASSEMBLY | SIGNATURE | INSULATOR | RIBOSITE | RNASTAB | PROTEASESITE | PROTEINSTAB))
+#define SPECIAL_CORNERS(style) ((style) & (ROUNDED | DIAGONALS | SHAPE_MASK))
/*
{"noverhang", &poly_fns, &p_noverhang},
{"assembly", &poly_fns, &p_assembly},
{"signature", &poly_fns, &p_signature},
+ {"rpromoter", &poly_fns, &p_rpromoter},
+ {"larrow", &poly_fns, &p_larrow},
+ {"rarrow", &poly_fns, &p_rarrow},
+ {"lpromoter", &poly_fns, &p_lpromoter},
/* *** shapes other than polygons *** */
{"record", &record_fns, NULL},
{"Mrecord", &record_fns, NULL},
{
pointf *B, C[4], *D, p0, p1;
double rbconst, d, dx, dy, t;
- int i, seg, mode;
+ int i, seg, mode, shape;
pointf* pts;
+ shape = style & SHAPE_MASK;
if (style & DIAGONALS)
mode = DIAGONALS;
- else if (style & (DOGEAR | TAB | FOLDER | BOX3D | COMPONENT | PROMOTER | CDS | TERMINATOR | UTR | PRIMERSITE | RESTRICTIONSITE | FIVEPOVERHANG | THREEPOVERHANG | NOVERHANG | ASSEMBLY | SIGNATURE | INSULATOR | RIBOSITE | RNASTAB | PROTEASESITE | PROTEINSTAB))
- mode = style & (DOGEAR | TAB | FOLDER | BOX3D | COMPONENT | PROMOTER | CDS | TERMINATOR | UTR | PRIMERSITE | RESTRICTIONSITE | FIVEPOVERHANG | THREEPOVERHANG | NOVERHANG | ASSEMBLY | SIGNATURE | INSULATOR | RIBOSITE | RNASTAB | PROTEASESITE | PROTEINSTAB);
+ else if (style & SHAPE_MASK)
+ mode = shape;
else
mode = ROUNDED;
B = N_NEW(4 * sides + 4, pointf);
dy = p1.y - p0.y;
d = sqrt(dx * dx + dy * dy);
t = rbconst / d;
- if (style & (BOX3D | COMPONENT))
+ if (shape == BOX3D || shape == COMPONENT)
t /= 3;
- else if (style & DOGEAR)
+ else if (shape == DOGEAR)
t /= 2;
if (mode != ROUNDED)
B[i++] = p0;
/*
* half arrow shape, scales in the x-direction
* D[1]
- * |\
- * | \
+ * |\
+ * | \
* | \
* ------------ \
- * | \
+ * | \
* ------------------\ D[0]
*
* --------------------------------
free(D);
break;
+
+ case RPROMOTER:
+ /*
+ * Adjust the perimeter for the protrusions.
+ *
+ *
+ * D[1] = AF[1] |\
+ * +----------------+ \
+ * | D[0] \
+ * | \
+ * | /
+ * | /
+ * | +-------+ /
+ * | | |/
+ * +--------+
+ */
+ /* Add the tab edges. */
+ D = N_NEW(sides + 5, pointf); /*5 new points*/
+ D[0].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[0].y = B[1].y - (B[3].y - B[4].y)/2;
+ D[1].x = B[3].x;
+ D[1].y = B[3].y - (B[3].y - B[4].y)/2;
+ D[2].x = AF[2].x;
+ D[2].y = AF[2].y;
+ D[3].x = B[2].x + (B[2].x - B[3].x)/2;
+ D[3].y = AF[2].y;
+ D[4].x = B[2].x + (B[2].x - B[3].x)/2;
+ D[4].y = AF[2].y + (B[3].y - B[4].y)/2;
+ D[5].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[5].y = AF[2].y + (B[3].y - B[4].y)/2;
+ D[6].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[6].y = AF[3].y;
+ D[7].y = AF[0].y - (AF[0].y - AF[3].y)/2; /*triangle point */
+ D[7].x = AF[0].x; /*triangle point */
+ D[8].y = AF[0].y;
+ D[8].x = B[1].x - (B[2].x - B[3].x)/2;
+
+ gvrender_polygon(job, D, sides + 5, filled);
+ free(D);
+ break;
+
+ case RARROW:
+ /*
+ * Adjust the perimeter for the protrusions.
+ *
+ *
+ * D[1] = AF[1] |\
+ * +----------------+ \
+ * | D[0] \
+ * | \
+ * | /
+ * | /
+ * +----------------+ /
+ * |/
+ *
+ */
+ /* Add the tab edges. */
+ D = N_NEW(sides + 3, pointf); /*3 new points*/
+ D[0].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[0].y = B[1].y - (B[3].y - B[4].y)/2;
+ D[1].x = B[3].x;
+ D[1].y = B[3].y - (B[3].y - B[4].y)/2;
+ D[2].x = AF[2].x;
+ D[2].y = AF[2].y + (B[3].y - B[4].y)/2;
+ D[3].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[3].y = AF[2].y + (B[3].y - B[4].y)/2;
+ D[4].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[4].y = AF[3].y;
+ D[5].y = AF[0].y - (AF[0].y - AF[3].y)/2;/*triangle point*/
+ D[5].x = AF[0].x; /*triangle point */
+ D[6].y = AF[0].y;
+ D[6].x = B[1].x - (B[2].x - B[3].x)/2;
+
+ gvrender_polygon(job, D, sides + 3, filled);
+ free(D);
+ break;
+
+ case LARROW:
+ /*
+ * Adjust the perimeter for the protrusions.
+ *
+ *
+ * /|
+ * / +----------------+
+ * / |
+ * \ |
+ * \ +----------------+
+ * \|
+ *
+ */
+ /* Add the tab edges. */
+ D = N_NEW(sides + 3, pointf); /*3 new points*/
+ D[0].x = AF[0].x;
+ D[0].y = AF[0].y - (B[3].y-B[4].y)/2;
+ D[1].x = B[2].x + (B[2].x - B[3].x)/2;
+ D[1].y = AF[0].y - (B[3].y-B[4].y)/2;/*D[0].y*/
+ D[2].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[2].y = B[2].y;
+ D[3].x = AF[1].x; /*triangle point*/
+ D[3].y = AF[1].y - (AF[1].y - AF[2].y)/2; /*triangle point*/
+ D[4].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[4].y = AF[2].y;
+ D[5].y = AF[2].y + (B[3].y-B[4].y)/2;
+ D[5].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[6].y = AF[3].y + (B[3].y - B[4].y)/2;
+ D[6].x = AF[0].x;/*D[0]*/
+
+ gvrender_polygon(job, D, sides + 3, filled);
+ free(D);
+ break;
+
+ case LPROMOTER:
+ /*
+ * Adjust the perimeter for the protrusions.
+ *
+ *
+ * /|
+ * / +----------------+
+ * / D[0]
+ * / |
+ * \ |
+ * \ |
+ * \ +--------+ +
+ * \| | |
+ * +-------+
+ */
+ /* Add the tab edges. */
+ D = N_NEW(sides + 5, pointf); /*3 new points*/
+ D[0].x = AF[0].x;
+ D[0].y = AF[0].y - (B[3].y-B[4].y)/2;
+ D[1].x = B[2].x + (B[2].x - B[3].x)/2;
+ D[1].y = AF[0].y - (B[3].y-B[4].y)/2;/*D[0].y*/
+ D[2].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[2].y = B[2].y;
+ D[3].x = AF[1].x; /*triangle point*/
+ D[3].y = AF[1].y - (AF[1].y - AF[2].y)/2; /*triangle point*/
+ D[4].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[4].y = AF[2].y;
+ D[5].y = AF[2].y + (B[3].y-B[4].y)/2;
+ D[5].x = B[2].x + (B[2].x - B[3].x)/2;/*D[1].x*/
+ D[6].y = AF[3].y + (B[3].y - B[4].y)/2;
+ D[6].x = B[1].x - (B[2].x - B[3].x)/2;
+ D[7].x = B[1].x - (B[2].x - B[3].x)/2;/*D[6].x*/
+ D[7].y = AF[3].y;
+ D[8].x = AF[3].x;
+ D[8].y = AF[3].y;
+
+ gvrender_polygon(job, D, sides + 5, filled);
+ free(D);
+ break;
}
free(B);
}