changeset 303:f894b30676e9

Add MBAF object suport. This is still work in progress yet. However, it won't affect other features. Therefore, it is checked in before it become mature.
author wycc
date Sun, 15 Feb 2009 08:34:57 +0800
parents 8b45e7b374b8
children c8f31eef947b
files include/mb_obj.h include/mb_types.h src/Makefile.am src/mbaf/mbobject.c src/shape_text.c
diffstat 5 files changed, 235 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mb_obj.h	Sun Feb 15 08:34:57 2009 +0800
@@ -0,0 +1,73 @@
+#ifndef __MBOBJ_H
+#define __MBOBJ_H
+#include "mb_shapes.h"
+#include "mb_shapes.h"
+/*! \brief Change the location of the object.
+ *
+ * The location of the object will be relocated to the new position. This function works for group(coord_t)
+ * and text shape (shape_text_t). For others, this command will be ignored since we don't know the original
+ * point of a path.
+ */
+void mb_obj_set_pos(mb_obj_t *obj, co_aix x, co_aix y);
+
+/*! \brief Get the position of the object.
+ *
+ *  Return the position of the object. This works for group and text only. For others, (0,0) will be returned.
+ */
+void mb_obj_get_pos(mb_obj_t *obj, co_aix *x, co_aix *y);
+
+/*! \brief set the width of the object.
+ *
+ */
+void mb_obj_set_scalex(mb_obj_t *obj, int scale);
+
+/*! \brief return the scale of width.
+ */
+int mb_obj_get_scalex(mb_obj_t *obj);
+
+/*! \brief set the scale of height.
+ */
+void mb_obj_set_scaley(mb_obj_t *obj, int scale);
+/*! \brief return the scale of height
+ *
+ */
+int mb_obj_get_scaley(mb_obj_t *obj);
+
+
+/*! \brief Change the rotation degree.
+ *
+ */
+void mb_obj_set_rotation(mb_obj_t *obj, int degree);
+
+/*! \brief Return the rotation degree of an object.
+ *
+ */
+
+int mb_obj_get_rotation(mb_obj_t *obj);
+
+/*! \brief set the textformat of the texts inside a group.
+ *
+ *  If the obj is a group, we will search the first text element inside it. If it is a shape_t, it will be applied to it directly.
+ *
+ */
+void mb_obj_set_textstyle(mb_obj_t *obj, mb_textstyle_t *format, int begin, int end);
+
+/*! \brief return the text format style between 'begin' and 'end'.
+ *
+ */
+void mb_obj_get_textstyle(mb_obj_t *, mb_textstyle_t *format,int begin,int end);
+
+/*! \brief Change the characters of a text field.
+ *  Change the content of a text field. If the obj is a group, we will search for the first text field inside it as the target.
+ */
+void mb_obj_set_text(mb_obj_t *obj, const char *text);
+
+
+/*! \brief Get the content of a text field.
+ *
+ *   The 'text' is the data buffer and the 'size' is the size of the buffer.
+ */
+void mb_obj_get_text(mb_obj_t *obj, char *text, int size);
+
+#endif
+
--- a/include/mb_types.h	Sun Feb 15 08:33:47 2009 +0800
+++ b/include/mb_types.h	Sun Feb 15 08:34:57 2009 +0800
@@ -29,6 +29,11 @@
  *
  * mb_obj_t should be initialized with mb_obj_init() and destroied with
  * mb_obj_destroy().
+ *
+ * We have defined a set of convienent API which will wrap the coord_t or shape_t API accoridng to its type.
+ * Please refer to http://www.assembla.com/wiki/show/dFrSMOtDer3BZUab7jnrAJ/MBAF_Object for the details. This
+ * API is designed for regular programmers which can be used to change some common properties of objects without
+ * checking its type.
  */
 struct _mb_obj {
     int obj_type;		/*!< \brief Type of a MadButterfly object. */
@@ -218,7 +223,7 @@
  */
 #define coord_move(co,x,y) do {(co)->matrix[2] = (x); (co)->matrix[5] = (y);} while(0)
 #define coord_set_scalex(co,sx) do {(co)->matrix[0] = sx;} while(0)
-#define coord_set_scaley(co,sy) do {(co)->matrux[3] = sy;} while(0)
+#define coord_set_scaley(co,sy) do {(co)->matrix[3] = sy;} while(0)
 #define coord_scalex(co) ((co)->matrix[0])
 #define coord_scaley(co) ((co)->matrix[3])
 #define coord_x(co) ((co)->matrix[2])
--- a/src/Makefile.am	Sun Feb 15 08:33:47 2009 +0800
+++ b/src/Makefile.am	Sun Feb 15 08:34:57 2009 +0800
@@ -3,7 +3,7 @@
 lib_LTLIBRARIES = libmbfly.la
 
 noinst_PROGRAMS = X_main
-MBAF_SOURCES=mbaf/mbapp.c mbaf/mbbutton.c
+MBAF_SOURCES=mbaf/mbapp.c mbaf/mbbutton.c mbaf/mbobject.c
 libmbfly_la_SOURCES = animate.c chgcolor.c coord.c event.c geo.c	\
 	observer.c paint.c redraw_man.c rotate.c shape_path.c		\
 	shape_rect.c shape_text.c shift.c subtree_free.c timer.c 	\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mbaf/mbobject.c	Sun Feb 15 08:34:57 2009 +0800
@@ -0,0 +1,132 @@
+#include "mb_types.h"
+#include "mb_obj.h"
+
+
+void mb_obj_set_pos(mb_obj_t *obj, co_aix x, co_aix y)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	    coord_x(((coord_t *) obj)) = x;
+	    coord_y(((coord_t *) obj)) = y;
+    } else if (MBO_TYPE(obj) == MBO_TEXT) {
+	    sh_text_set_pos((shape_t *) obj, x, y);
+    } else {
+	    return;
+    }
+    
+}
+
+void mb_obj_get_pos(mb_obj_t *obj, co_aix *x, co_aix *y)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	    *x = coord_x((coord_t *) obj);
+	    *y = coord_y((coord_t *) obj);
+    } else if (MBO_TYPE(obj) == MBO_TEXT) {
+	    sh_text_get_pos((shape_t *) obj, x, y);
+    } else {
+	    return;
+    }
+    
+}
+
+void mb_obj_set_text(mb_obj_t *obj, const char *text)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+        geo_t *geo;
+        shape_t *shape;
+	coord_t *g = (coord_t *) obj;
+
+        FOR_COORD_MEMBERS(g, geo) {
+            shape = geo_get_shape(geo);
+            if(shape->obj.obj_type == MBO_TEXT) {
+		sh_text_set_text(shape, text);
+		return;
+            }
+        }
+    } else if (MBO_TYPE(obj) == MBO_TEXT) {
+	    sh_text_set_text((shape_t *) obj,text);
+    } else {
+	    return;
+    }
+    
+}
+
+
+void mb_obj_get_text(mb_obj_t *obj, char *text,int size)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+        geo_t *geo;
+        shape_t *shape;
+	coord_t *g = (coord_t *) obj;
+
+        FOR_COORD_MEMBERS(g, geo) {
+            shape = geo_get_shape(geo);
+            if(shape->obj.obj_type == MBO_TEXT) {
+		sh_text_get_text(shape, text,size);
+		return;
+            }
+        }
+    } else if (MBO_TYPE(obj) == MBO_TEXT) {
+	    sh_text_get_text((shape_t *) obj,text,size);
+    } else {
+	    *text = 0;
+	    return;
+    }
+}
+
+void mb_obj_set_scalex(mb_obj_t *obj,int scale)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	coord_set_scalex((coord_t *) obj, scale);
+    } else {
+    }
+}
+
+int mb_obj_get_scalex(mb_obj_t *obj)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	return coord_scalex((coord_t *) obj);
+    } else {
+	return 100;
+    }
+}
+
+void mb_obj_set_scaley(mb_obj_t *obj,int scale)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	coord_set_scaley((coord_t *) obj, scale);
+    } else {
+    }
+}
+int mb_obj_get_scaley(mb_obj_t *obj)
+{
+    if (MBO_TYPE(obj) == MBO_COORD) {
+	return coord_scaley((coord_t *) obj);
+    } else {
+	return 100;
+    }
+}
+
+void mb_obj_set_rotation(mb_obj_t *obj, int degree)
+{
+    printf("%s is not implemented yet\n",__FUNCTION__);
+}
+
+int mb_obj_get_rotation(mb_obj_t *obj)
+{
+    printf("%s is not implemented yet\n",__FUNCTION__);
+}
+
+
+
+void mb_obj_set_color(mb_obj_t *obj, int color)
+{
+    printf("%s is not implemented yet\n",__FUNCTION__);
+}
+
+
+int mb_obj_get_color(mb_obj_t *obj)
+{
+    printf("%s is not implemented yet\n",__FUNCTION__);
+    return 0;
+}
+
--- a/src/shape_text.c	Sun Feb 15 08:33:47 2009 +0800
+++ b/src/shape_text.c	Sun Feb 15 08:34:57 2009 +0800
@@ -72,7 +72,28 @@
     return (shape_t *)text;
 }
 
-extern void sh_text_set_text(shape_t *shape, const char *txt) {
+void sh_text_set_pos(shape_t *shape, co_aix x, co_aix y)
+{
+    sh_text_t *text = (sh_text_t *)shape;
+    text->x = x;
+    text->y = y;
+}
+
+
+void sh_text_get_pos(shape_t *shape, co_aix *x, co_aix *y)
+{
+    sh_text_t *text = (sh_text_t *)shape;
+    *x = text->x;
+    *y = text->y;
+}
+
+void sh_text_get_text(shape_t *shape, char *text,int size)
+{
+    sh_text_t *t = (sh_text_t *)shape;
+    strncpy(text,t->data, size);
+}
+
+void sh_text_set_text(shape_t *shape, const char *txt) {
     sh_text_t *text = (sh_text_t *)shape;
     char *buf;
 
@@ -230,7 +251,7 @@
     }
     text->layout = pango_cairo_create_layout(cr);
     desc = pango_font_description_from_string("Sans Bold");
-    cairo_set_source_rgb (cr, 0, 0, 0);
+    //cairo_set_source_rgb (cr, 0, 0, 0);
     pango_layout_set_font_description (text->layout, desc);
     pango_layout_set_text(text->layout,text->data,strlen(text->data));
     pango_layout_set_attributes(text->layout, text->attrs);