1*45dc33f7Sslatteng /* @(#)db2.c 1.2 04/18/83
2f0c8aef1Sslatteng *
3f0c8aef1Sslatteng * Copyright -C- 1982 Barry S. Roitblat
4f0c8aef1Sslatteng *
5f0c8aef1Sslatteng * This file contains routines for implementing the database
6f0c8aef1Sslatteng * manipulations for the gremlin picture editor.
7f0c8aef1Sslatteng */
8f0c8aef1Sslatteng
9f0c8aef1Sslatteng #include "gremlin.h"
10f0c8aef1Sslatteng #include "grem2.h"
11f0c8aef1Sslatteng
12f0c8aef1Sslatteng /* imports from undodb.c */
13f0c8aef1Sslatteng
14f0c8aef1Sslatteng extern UNRembAdd(), UNRembMod();
15f0c8aef1Sslatteng
16f0c8aef1Sslatteng /* imports from db1.c */
17f0c8aef1Sslatteng
18f0c8aef1Sslatteng extern ELT *DBCreateElt();
19f0c8aef1Sslatteng
20f0c8aef1Sslatteng /* imports from point.c */
21f0c8aef1Sslatteng
22f0c8aef1Sslatteng extern POINT *PTMakePoint(), *PTInit();
23f0c8aef1Sslatteng
24f0c8aef1Sslatteng /* imports from c */
25f0c8aef1Sslatteng
26f0c8aef1Sslatteng extern char *malloc();
27f0c8aef1Sslatteng extern char *strcpy();
28f0c8aef1Sslatteng
29f0c8aef1Sslatteng ELT *DBCopy(element,transform,db)
30f0c8aef1Sslatteng ELT *element, *(*db);
31f0c8aef1Sslatteng float transform[3][2];
32f0c8aef1Sslatteng /*
33f0c8aef1Sslatteng * This routine creates a copy of the the element transformed by
34f0c8aef1Sslatteng * the transformation matrix and adds the new copy to the database.
35f0c8aef1Sslatteng */
36f0c8aef1Sslatteng
37f0c8aef1Sslatteng {
38f0c8aef1Sslatteng POINT *pt, *newlist;
39f0c8aef1Sslatteng char *newtext;
40f0c8aef1Sslatteng
41f0c8aef1Sslatteng newlist = PTInit();
42f0c8aef1Sslatteng pt = element->ptlist;
43f0c8aef1Sslatteng while ( !Nullpoint(pt) )
44f0c8aef1Sslatteng { /* matrix multiply */
45f0c8aef1Sslatteng (void) PTMakePoint(( ( (pt->x) * transform[0][0])
46f0c8aef1Sslatteng + ( (pt->y) * transform[1][0])
47f0c8aef1Sslatteng + transform[2][0]),
48f0c8aef1Sslatteng ( ( (pt->x) * transform[0][1])
49f0c8aef1Sslatteng + ( (pt->y) * transform[1][1])
50f0c8aef1Sslatteng + transform[2][1]), &newlist);
51f0c8aef1Sslatteng pt = pt->nextpt;
52f0c8aef1Sslatteng } /* end while */;
53f0c8aef1Sslatteng newtext = malloc((unsigned) strlen(element->textpt) + 1);
54f0c8aef1Sslatteng (void) strcpy(newtext, element->textpt);
55f0c8aef1Sslatteng return( DBCreateElt(element->type, newlist, element->brushf,
56f0c8aef1Sslatteng element->size, newtext, db) );
57f0c8aef1Sslatteng } /* end copy */
58f0c8aef1Sslatteng
59*45dc33f7Sslatteng
DBXform(element,transform,db)60f0c8aef1Sslatteng DBXform(element, transform, db)
61f0c8aef1Sslatteng ELT *element;
62f0c8aef1Sslatteng float transform[3][2];
63f0c8aef1Sslatteng ELT *(*db);
64f0c8aef1Sslatteng /*
65f0c8aef1Sslatteng * This routine transforms the element by multiplying the
66f0c8aef1Sslatteng * coordinates of each of the points in the element by the
67f0c8aef1Sslatteng * transformation matrix.
68f0c8aef1Sslatteng */
69f0c8aef1Sslatteng
70f0c8aef1Sslatteng {
71f0c8aef1Sslatteng POINT *pt;
72f0c8aef1Sslatteng float px, py;
73f0c8aef1Sslatteng
74f0c8aef1Sslatteng UNRembMod(element, db);
75f0c8aef1Sslatteng pt = element->ptlist;
76f0c8aef1Sslatteng while ( !Nullpoint(pt) )
77f0c8aef1Sslatteng {
78f0c8aef1Sslatteng px = ( (pt->x) * transform[0][0] )
79f0c8aef1Sslatteng + ( (pt->y) * transform[1][0] )
80f0c8aef1Sslatteng + transform[2][0];
81f0c8aef1Sslatteng py = ( (pt->x) * transform[0][1] )
82f0c8aef1Sslatteng + ( (pt->y) * transform[1][1] )
83f0c8aef1Sslatteng + transform[2][1];
84f0c8aef1Sslatteng pt->x = px;
85f0c8aef1Sslatteng pt->y = py;
86f0c8aef1Sslatteng pt = pt->nextpt;
87f0c8aef1Sslatteng } /* end while */;
88f0c8aef1Sslatteng } /* end Xform */
89f0c8aef1Sslatteng
90*45dc33f7Sslatteng
91f0c8aef1Sslatteng DBChangeBrush(element, brush, db)
92f0c8aef1Sslatteng ELT *element, *(*db);
93f0c8aef1Sslatteng int brush;
94f0c8aef1Sslatteng /*
95f0c8aef1Sslatteng * This routine changes the brush attribute of the element
96f0c8aef1Sslatteng */
97f0c8aef1Sslatteng
98f0c8aef1Sslatteng {
99f0c8aef1Sslatteng UNRembMod(element, db);
100f0c8aef1Sslatteng element->brushf = brush;
101f0c8aef1Sslatteng } /* end ChangeBrush */
102f0c8aef1Sslatteng
103f0c8aef1Sslatteng DBChangeFont(element, font, size, db)
104f0c8aef1Sslatteng ELT *element, *(*db);
105f0c8aef1Sslatteng int font, size;
106f0c8aef1Sslatteng /*
107f0c8aef1Sslatteng * This routine changes the font and size attributes of the given
108f0c8aef1Sslatteng * element.
109f0c8aef1Sslatteng */
110f0c8aef1Sslatteng
111f0c8aef1Sslatteng {
112f0c8aef1Sslatteng UNRembMod(element, db);
113f0c8aef1Sslatteng element->brushf = font;
114f0c8aef1Sslatteng element->size = size;
115f0c8aef1Sslatteng } /* end ChangeFont */
116