/*! \brief End the input of a circle. * \par Function Description * This function ends the input of the second corner of a picture. * The picture is defined by (<B>w_current->first_wx</B>,<B>w_current->first_wy</B> * and (<B>w_current->second_wx</B>,<B>w_current->second_wy</B>. * * The temporary picture frame is erased ; a new picture object is allocated, * initialized and linked to the object list ; The object is finally * drawn on the current sheet. * * \param [in] w_current The GschemToplevel object. * \param [in] w_x (unused) * \param [in] w_y (unused) */ void o_picture_end(GschemToplevel *w_current, int w_x, int w_y) { TOPLEVEL *toplevel = gschem_toplevel_get_toplevel (w_current); OBJECT *new_obj; int picture_width, picture_height; int picture_left, picture_top; g_assert( w_current->inside_action != 0 ); /* erase the temporary picture */ /* o_picture_draw_rubber(w_current); */ w_current->rubber_visible = 0; picture_width = GET_PICTURE_WIDTH (w_current); picture_height = GET_PICTURE_HEIGHT(w_current); picture_left = GET_PICTURE_LEFT (w_current); picture_top = GET_PICTURE_TOP (w_current); /* pictures with null width and height are not allowed */ if ((picture_width == 0) && (picture_height == 0)) { /* cancel the object creation */ return; } /* create the object */ new_obj = o_picture_new(toplevel, NULL, 0, w_current->pixbuf_filename, OBJ_PICTURE, picture_left, picture_top, picture_left + picture_width, picture_top - picture_height, 0, FALSE, FALSE); s_page_append (toplevel, toplevel->page_current, new_obj); /* Run %add-objects-hook */ g_run_hook_object (w_current, "%add-objects-hook", new_obj); gschem_toplevel_page_content_changed (w_current, toplevel->page_current); o_undo_savestate_old(w_current, UNDO_ALL); }
/*! \brief Create picture OBJECT from character string. * \par Function Description * This function will get the description of a picture from the * character string <B>*first_line</B>. * * \param [in] toplevel The TOPLEVEL object. * \param [in] first_line Character string with picture description. * \param [in] tb Text buffer to load embedded data from. * \param [in] release_ver libgeda release version number. * \param [in] fileformat_ver libgeda file format version number. * \return A pointer to the new picture object. */ OBJECT *o_picture_read (TOPLEVEL *toplevel, const char *first_line, TextBuffer *tb, unsigned int release_ver, unsigned int fileformat_ver) { OBJECT *new_obj; int x1, y1; int width, height, angle; gchar mirrored, embedded; int num_conv; gchar type; gchar *line = NULL; gchar *filename; GdkPixbuf *pixbuf = NULL; gchar *file_content = NULL; guint file_length = 0; GError *err = NULL; num_conv = sscanf(first_line, "%c %d %d %d %d %d %c %c\n", &type, &x1, &y1, &width, &height, &angle, &mirrored, &embedded); if (num_conv != 8) { s_log_message (_("Error reading picture definition line: %s.\n"), first_line); } /* Convert from ascii character to number */ if (g_ascii_isdigit(mirrored)) { mirrored -= 0x30; } if (g_ascii_isdigit(embedded)) { embedded -= 0x30; } if (width == 0 || height == 0) { s_log_message(_("Found a zero width/height picture [ %c %d %d %d %d ]\n"), type, x1, y1, width, height); } if ( (mirrored > 1) || (mirrored < 0)) { s_log_message(_("Found a picture with a wrong 'mirrored' parameter: %c.\n"), mirrored); s_log_message(_("Setting mirrored to 0\n")); mirrored = 0; } if ( (embedded > 1) || (embedded < 0)) { s_log_message(_("Found a picture with a wrong 'embedded' parameter: %c.\n"), embedded); s_log_message(_("Setting embedded to 0\n")); embedded = 0; } switch(angle) { case(0): case(90): case(180): case(270): break; default: s_log_message(_("Found an unsupported picture angle [ %d ]\n"), angle); s_log_message(_("Setting angle to 0\n")); angle=0; break; } filename = g_strdup(s_textbuffer_next_line(tb)); filename = remove_last_nl(filename); if (embedded == 1) { GString *encoded_picture=g_string_new(""); char finished = 0; /* Read the encoded picture */ do { line = s_textbuffer_next_line(tb); if (line == NULL) break; if (g_strcasecmp(line, ".\n") != 0) { encoded_picture = g_string_append (encoded_picture, line); } else { finished = 1; } } while (finished == 0); /* Decode the picture */ file_content = s_encoding_base64_decode(encoded_picture->str, encoded_picture->len, &file_length); if (encoded_picture != NULL) { g_string_free (encoded_picture, TRUE); } if (file_content == NULL) { s_log_message (_("Failed to load image from embedded data [%s]: %s\n"), filename, _("Base64 decoding failed.")); s_log_message (_("Falling back to file loading. Picture unembedded.\n")); embedded = 0; } } /* If we have embedded data, try loading from the decoded buffer */ if (file_content != NULL) { pixbuf = o_picture_pixbuf_from_buffer (file_content, file_length, &err); if (err != NULL) { s_log_message (_("Failed to load image from embedded data [%s]: %s\n"), filename, err->message); s_log_message (_("Falling back to file loading. Picture unembedded.\n")); g_error_free (err); err = NULL; embedded = 0; } } /* If we haven't loaded the pixbuf above, try loading from file */ if (pixbuf == NULL) { pixbuf = gdk_pixbuf_new_from_file (filename, &err); if (err != NULL) { s_log_message (_("Failed to load image from file [%s]: %s\n"), filename, err->message); g_error_free (err); err = NULL; } } /* If the pixbuf couldn't be loaded, then try to load a warning picture */ if (pixbuf == NULL) { char *temp_filename; s_log_message (_("Loading warning picture.\n")); temp_filename = g_build_filename (toplevel->bitmap_directory, "gschem-warning.png", NULL); pixbuf = gdk_pixbuf_new_from_file (temp_filename, NULL); if (pixbuf == NULL) { s_log_message( _("Error loading picture from file: %s.\n"), temp_filename); } g_free (temp_filename); } /* create the picture */ /* The picture is described by its upper left and lower right corner */ new_obj = o_picture_new(toplevel, pixbuf, file_content, file_length, filename, (double)width / (double)height, type, x1, y1+height, x1+width, y1, angle, mirrored, embedded); /* Don't free file_content, it is now owned by the picture object */ return new_obj; }
/*! \brief Create picture OBJECT from character string. * \par Function Description * Parses \a first_line and subsequent lines from \a tb, and returns * a newly-created picture #OBJECT. * * \param [in] toplevel The TOPLEVEL object. * \param [in] first_line Character string with picture description. * \param [in] tb Text buffer to load embedded data from. * \param [in] release_ver libgeda release version number. * \param [in] fileformat_ver libgeda file format version number. * \return A pointer to the new picture object, or NULL on error. */ OBJECT *o_picture_read (TOPLEVEL *toplevel, const char *first_line, TextBuffer *tb, unsigned int release_ver, unsigned int fileformat_ver, GError **err) { OBJECT *new_obj; int x1, y1; int width, height, angle; int mirrored, embedded; int num_conv; gchar type; const gchar *line = NULL; gchar *filename; gchar *file_content = NULL; guint file_length = 0; num_conv = sscanf(first_line, "%c %d %d %d %d %d %d %d\n", &type, &x1, &y1, &width, &height, &angle, &mirrored, &embedded); if (num_conv != 8) { g_set_error(err, EDA_ERROR, EDA_ERROR_PARSE, _("Failed to parse picture definition")); return NULL; } if (width == 0 || height == 0) { s_log_message(_("Found a zero width/height picture " "[ %1$c %2$d %3$d %4$d %5$d ]"), type, x1, y1, width, height); } if ( (mirrored > 1) || (mirrored < 0)) { s_log_message(_("Found a picture with a wrong 'mirrored' parameter: %1$d."), mirrored); s_log_message(_("Setting mirrored to 0.")); mirrored = 0; } if ( (embedded > 1) || (embedded < 0)) { s_log_message(_("Found a picture with a wrong 'embedded' parameter: %1$d."), embedded); s_log_message(_("Setting embedded to 0.")); embedded = 0; } switch(angle) { case(0): case(90): case(180): case(270): break; default: s_log_message(_("Found an unsupported picture angle [ %1$d ]"), angle); s_log_message(_("Setting angle to 0.")); angle=0; break; } filename = g_strdup(s_textbuffer_next_line(tb)); filename = geda_string_remove_ending_newline (filename); /* Handle empty filenames */ if (strlen (filename) == 0) { s_log_message (_("Found an image with no filename.")); g_free (filename); filename = NULL; } if (embedded == 1) { GString *encoded_picture=g_string_new(""); char finished = 0; /* Read the encoded picture */ do { line = s_textbuffer_next_line(tb); if (line == NULL) break; if (strcmp (line, ".\n") != 0) { encoded_picture = g_string_append (encoded_picture, line); } else { finished = 1; } } while (finished == 0); /* Decode the picture */ if (encoded_picture != NULL) { file_content = s_encoding_base64_decode(encoded_picture->str, encoded_picture->len, &file_length); g_string_free (encoded_picture, TRUE); } if (file_content == NULL) { s_log_message (_("Failed to load image from embedded data [%1$s]: %2$s"), filename, _("Base64 decoding failed.")); s_log_message (_("Falling back to file loading. Picture unembedded.")); embedded = 0; } } /* create the picture */ /* The picture is described by its upper left and lower right corner */ new_obj = o_picture_new (toplevel, file_content, file_length, filename, type, x1, y1+height, x1+width, y1, angle, mirrored, embedded); g_free (file_content); g_free (filename); return new_obj; }