/*! \brief embed an object into a schematic * \par Function Description * This functions embeds an object \a o_current into a * libgeda. Currently complex objects are just marked to * be embedded later. Picture objects are embedded immediatly. * * \param toplevel The TOPLEVEL object * \param o_current The OBJECT to embed */ void o_embed(TOPLEVEL *toplevel, OBJECT *o_current) { PAGE *page = o_get_page_compat (toplevel, o_current); int page_modified = 0; /* check o_current is a complex and is not already embedded */ if (o_current->type == OBJ_COMPLEX && !o_complex_is_embedded (o_current)) { /* set the embedded flag */ o_current->complex_embedded = TRUE; s_log_message (_("Component [%s] has been embedded\n"), o_current->complex_basename); page_modified = 1; } /* If it's a picture and it's not embedded */ if ( (o_current->type == OBJ_PICTURE) && !o_picture_is_embedded (toplevel, o_current) ) { o_picture_embed (toplevel, o_current); page_modified = 1; } if (page_modified && page != NULL) { /* page content has been modified */ page->CHANGED = 1; } }
/*! \brief unembed an object from a schematic * \par Function Description * This functions unembeds an object \a o_current from a * libgeda structure. Complex objects are just marked to * be not embedded. Picture objects are unembeded immediatly. * * \param toplevel The TOPLEVEL object * \param o_current The OBJECT to unembed */ void o_unembed(TOPLEVEL *toplevel, OBJECT *o_current) { const CLibSymbol *sym; PAGE *page = o_get_page_compat (toplevel, o_current); int page_modified = 0; /* check o_current is an embedded complex */ if (o_current->type == OBJ_COMPLEX && o_complex_is_embedded (o_current)) { /* search for the symbol in the library */ sym = s_clib_get_symbol_by_name (o_current->complex_basename); if (sym == NULL) { /* symbol not found in the symbol library: signal an error */ s_log_message (_("Could not find component [%s], while trying to " "unembed. Component is still embedded\n"), o_current->complex_basename); } else { /* clear the embedded flag */ o_current->complex_embedded = FALSE; s_log_message (_("Component [%s] has been successfully unembedded\n"), o_current->complex_basename); page_modified = 1; } } /* If it's a picture and it's embedded */ if ( (o_current->type == OBJ_PICTURE) && o_picture_is_embedded (toplevel, o_current)) { o_picture_unembed (toplevel, o_current); page_modified = 1; } if (page_modified && page != NULL) { page->CHANGED = 1; } }
/*! \brief Embed the image file associated with a picture * \par Function Description * Verify that a picture has valid data associated with it, and if so, * mark it to be embedded. * * \param [in] toplevel The TOPLEVEL object. * \param [in] object The picture OBJECT to embed */ void o_picture_embed (TOPLEVEL *toplevel, OBJECT *object) { const gchar *filename = o_picture_get_filename (object); gchar *basename; if (o_picture_is_embedded (object)) return; if (object->picture->file_content == NULL) { s_log_message (_("Picture [%1$s] has no image data."), filename); s_log_message (_("Falling back to file loading. Picture is still unembedded.")); object->picture->embedded = 0; return; } object->picture->embedded = 1; basename = g_path_get_basename (filename); s_log_message (_("Picture [%1$s] has been embedded."), basename); g_free (basename); }
/*! \brief Unembed a picture, reloading the image from disk * \par Function Description * Verify that the file associated with \a object exists on disk and * is usable, and if so, reload the picture and mark it as unembedded. * * \param [in] toplevel The TOPLEVEL object. * \param [in] object The picture OBJECT to unembed */ void o_picture_unembed (TOPLEVEL *toplevel, OBJECT *object) { GError *err = NULL; const gchar *filename = o_picture_get_filename (object); gchar *basename; if (!o_picture_is_embedded (object)) return; o_picture_set_from_file (toplevel, object, filename, &err); if (err != NULL) { s_log_message (_("Failed to load image from file [%1$s]: %2$s"), filename, err->message); s_log_message (_("Picture is still embedded.")); g_error_free (err); return; } object->picture->embedded = 0; basename = g_path_get_basename(filename); s_log_message (_("Picture [%1$s] has been unembedded."), basename); g_free(basename); }
/*! \brief Create a character string representation of a picture OBJECT. * \par Function Description * This function formats a string in the buffer <B>*buff</B> to describe * the picture object <B>*object</B>. * * \param [in] object Picture OBJECT to create string from. * \return A pointer to the picture OBJECT character string. * * \note * Caller must g_free returned character string. * */ gchar* geda_picture_object_to_buffer (const GedaObject *object) { int width, height, x1, y1; gchar *encoded_picture=NULL; gchar *out=NULL; guint encoded_picture_length; const gchar *filename = NULL; /* calculate the width and height of the box */ width = abs(object->picture->lower_x - object->picture->upper_x); height = abs(object->picture->upper_y - object->picture->lower_y); /* calculate the lower left corner of the box */ x1 = object->picture->upper_x; y1 = object->picture->upper_y - height; /* move the origin to 0, 0*/ #if DEBUG printf("picture: %d %d %d %d\n", x1, y1, width, height); #endif /* Encode the picture if it's embedded */ if (o_picture_is_embedded (object)) { encoded_picture = s_encoding_base64_encode( (char *)object->picture->file_content, object->picture->file_length, &encoded_picture_length, TRUE); if (encoded_picture == NULL) { s_log_message(_("ERROR: o_picture_save: unable to encode the picture.")); } } /* Cope with null filename */ filename = o_picture_get_filename (object); if (filename == NULL) filename = ""; if (o_picture_is_embedded (object) && encoded_picture != NULL) { out = g_strdup_printf("%c %d %d %d %d %d %c %c\n%s\n%s\n%s", object->type, x1, y1, width, height, object->picture->angle, /* Convert the (0,1) chars to ASCII */ (object->picture->mirrored)+0x30, '1', filename, encoded_picture, "."); } else { out = g_strdup_printf("%c %d %d %d %d %d %c %c\n%s", object->type, x1, y1, width, height, object->picture->angle, /* Convert the (0,1) chars to ASCII */ (object->picture->mirrored)+0x30, '0', filename); } g_free(encoded_picture); return(out); }