static ObjectChange * text_create_change(Text *text, TextChangeType type, gunichar ch, int pos, int row, DiaObject *obj) { struct TextObjectChange *change; change = g_new0(struct TextObjectChange, 1); change->obj = obj; change->props = make_posision_and_size_prop_list (); /* remember previous position/size */ if (change->obj->ops->get_props) change->obj->ops->get_props(change->obj, change->props); change->obj_change.apply = (ObjectChangeApplyFunc) text_change_apply; change->obj_change.revert = (ObjectChangeRevertFunc) text_change_revert; change->obj_change.free = (ObjectChangeFreeFunc) text_change_free; change->text = text; change->type = type; change->ch = ch; change->pos = pos; change->row = row; if (type == TYPE_DELETE_ALL) change->str = text_get_string_copy(text); else change->str = NULL; return (ObjectChange *)change; }
static void function_change_apply_revert( ObjectChange* objchg, DiaObject* obj) { int tmp ; char* ttxt ; FunctionChange* change = (FunctionChange*) objchg ; Function* fcn = (Function*) obj ; if ( change->change_type == WISH_FUNC || change->change_type == ALL ) { tmp = fcn->is_wish ; fcn->is_wish = change->is_wish ; change->is_wish = tmp ; } if ( change->change_type == USER_FUNC || change->change_type == ALL ) { tmp = fcn->is_user ; fcn->is_user = change->is_user ; change->is_user = tmp ; } if ( change->change_type == TEXT_EDIT || change->change_type == ALL ) { ttxt = text_get_string_copy( fcn->text ) ; text_set_string( fcn->text, change->text ) ; g_free( change->text ) ; change->text = ttxt ; } }
static void objet_get_props(Objet * objet, GPtrArray *props) { text_get_attributes(objet->text,&objet->text_attrs); /* the aligement is _not_ part of the deal */ objet->text_attrs.alignment = ALIGN_CENTER; if (objet->attrib) g_free(objet->attrib); objet->attrib = text_get_string_copy(objet->attributes); object_get_props_from_offsets(&objet->element.object, objet_offsets,props); }
static ObjectChange * function_insert_word( Function* func, const char* word, gboolean newline ) { ObjectChange* change = function_create_change( func, TEXT_EDIT ) ; char* old_chars = text_get_string_copy( func->text ) ; char* new_chars = g_malloc( strlen( old_chars) + strlen( word ) + ( newline ? 2 : 1) ) ; sprintf( new_chars, newline ? "%s\n%s" : "%s%s", old_chars, word ) ; text_set_string( func->text, new_chars ) ; g_free( new_chars ) ; g_free( old_chars ) ; function_update_data( func ) ; text_set_cursor_at_end( func->text ) ; return change; }
static ObjectChange* function_create_change( Function* fcn, enum FuncChangeType change_type ) { FunctionChange* change = g_new0(FunctionChange,1) ; change->obj_change.apply = (ObjectChangeApplyFunc) function_change_apply_revert ; change->obj_change.revert = (ObjectChangeRevertFunc) function_change_apply_revert ; change->obj_change.free = (ObjectChangeFreeFunc) function_change_free ; change->change_type = change_type ; if ( change_type == WISH_FUNC || change_type == ALL ) change->is_wish = fcn->is_wish ; if ( change_type == USER_FUNC || change_type == ALL ) change->is_user = fcn->is_user ; if ( change_type == TEXT_EDIT || change_type == ALL ) change->text = text_get_string_copy( fcn->text ) ; return (ObjectChange*) change ; }
void data_add_text(AttributeNode attr, Text *text) { DataNode composite; char *str; composite = data_add_composite(attr, "text"); str = text_get_string_copy(text); data_add_string(composite_add_attribute(composite, "string"), str); g_free(str); data_add_font(composite_add_attribute(composite, "font"), text->font); data_add_real(composite_add_attribute(composite, "height"), text->height); data_add_point(composite_add_attribute(composite, "pos"), &text->position); data_add_color(composite_add_attribute(composite, "color"), &text->color); data_add_enum(composite_add_attribute(composite, "alignment"), text->alignment); }
gboolean text_to_path (const Text *text, GArray *points) { cairo_t *cr; cairo_surface_t *surface; PangoLayout *layout; PangoRectangle ink_rect; char *str; gboolean ret = FALSE; if (!PANGO_IS_CAIRO_FONT_MAP (pango_context_get_font_map (dia_font_get_context()))) return FALSE; layout = pango_layout_new(dia_font_get_context()); pango_layout_set_font_description (layout, dia_font_get_description (text->font)); pango_layout_set_indent (layout, 0); pango_layout_set_justify (layout, FALSE); pango_layout_set_alignment (layout, text->alignment == ALIGN_LEFT ? PANGO_ALIGN_LEFT : text->alignment == ALIGN_RIGHT ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_CENTER); str = text_get_string_copy (text); pango_layout_set_text (layout, str, -1); g_free (str); pango_layout_get_extents (layout, &ink_rect, NULL); /* any surface should do - this one is always available */ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ink_rect.width / PANGO_SCALE, ink_rect.height / PANGO_SCALE); cr = cairo_create (surface); cairo_surface_destroy (surface); pango_cairo_layout_path (cr, layout); /* convert the path */ if (cairo_status (cr) == CAIRO_STATUS_SUCCESS) { cairo_path_t *path; int i; path = cairo_copy_path (cr); for (i=0; i < path->num_data; i += path->data[i].header.length) { cairo_path_data_t *data = &path->data[i]; BezPoint bp; switch (data->header.type) { case CAIRO_PATH_MOVE_TO : bp.type = BEZ_MOVE_TO; bp.p1.x = data[1].point.x; bp.p1.y = data[1].point.y; break; case CAIRO_PATH_LINE_TO : bp.type = BEZ_LINE_TO; bp.p1.x = data[1].point.x; bp.p1.y = data[1].point.y; break; case CAIRO_PATH_CURVE_TO : bp.type = BEZ_CURVE_TO; bp.p1.x = data[1].point.x; bp.p1.y = data[1].point.y; bp.p2.x = data[2].point.x; bp.p2.y = data[2].point.y; bp.p3.x = data[3].point.x; bp.p3.y = data[3].point.y; break; case CAIRO_PATH_CLOSE_PATH : /* can't do anything */ default : continue; } g_array_append_val (points, bp); } ret = (path->status == CAIRO_STATUS_SUCCESS); cairo_path_destroy (path); } /* finally scale it ? */ /* clean up */ g_object_unref (layout); cairo_destroy (cr); return ret; }