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