bool save_as_draw(hlcache_handle *h, const char *path) { pencil_code code; char *drawfile_buffer; size_t drawfile_size; os_error *error; ro_save_draw_diagram = pencil_create(); if (!ro_save_draw_diagram) { warn_user("NoMemory", 0); return false; } ro_save_draw_width = content_get_width(h); ro_save_draw_height = content_get_height(h); plot = ro_save_draw_plotters; if (!content_redraw(h, 0, -ro_save_draw_height, ro_save_draw_width, ro_save_draw_height, INT_MIN, INT_MIN, INT_MAX, INT_MAX, 1, 0xFFFFFF)) { pencil_free(ro_save_draw_diagram); return false; } /*pencil_dump(ro_save_draw_diagram);*/ code = pencil_save_drawfile(ro_save_draw_diagram, "NetSurf", &drawfile_buffer, &drawfile_size); if (code != pencil_OK) { warn_user("SaveError", 0); pencil_free(ro_save_draw_diagram); return false; } assert(drawfile_buffer); error = xosfile_save_stamped(path, osfile_TYPE_DRAW, (byte *) drawfile_buffer, (byte *) drawfile_buffer + drawfile_size); if (error) { LOG(("xosfile_save_stamped failed: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); pencil_free(ro_save_draw_diagram); return false; } pencil_free(ro_save_draw_diagram); return true; }
bool save_as_draw(hlcache_handle *h, const char *path) { pencil_code code; char *drawfile_buffer; struct rect clip; struct content_redraw_data data; size_t drawfile_size; os_error *error; struct redraw_context ctx = { .interactive = false, .background_images = true, .plot = &ro_save_draw_plotters }; ro_save_draw_diagram = pencil_create(); if (!ro_save_draw_diagram) { warn_user("NoMemory", 0); return false; } ro_save_draw_width = content_get_width(h); ro_save_draw_height = content_get_height(h); clip.x0 = clip.y0 = INT_MIN; clip.x1 = clip.y1 = INT_MAX; data.x = 0; data.y = -ro_save_draw_height; data.width = ro_save_draw_width; data.height = ro_save_draw_height; data.background_colour = 0xFFFFFF; data.scale = 1; data.repeat_x = false; data.repeat_y = false; if (!content_redraw(h, &data, &clip, &ctx)) { pencil_free(ro_save_draw_diagram); return false; } /*pencil_dump(ro_save_draw_diagram);*/ code = pencil_save_drawfile(ro_save_draw_diagram, "NetSurf", &drawfile_buffer, &drawfile_size); if (code != pencil_OK) { warn_user("SaveError", 0); pencil_free(ro_save_draw_diagram); return false; } assert(drawfile_buffer); error = xosfile_save_stamped(path, osfile_TYPE_DRAW, (byte *) drawfile_buffer, (byte *) drawfile_buffer + drawfile_size); if (error) { LOG("xosfile_save_stamped failed: 0x%x: %s", error->errnum, error->errmess); warn_user("SaveError", error->errmess); pencil_free(ro_save_draw_diagram); return false; } pencil_free(ro_save_draw_diagram); return true; } bool ro_save_draw_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style) { pencil_code code; const int path[] = { draw_MOVE_TO, x0 * 2, -y0 * 2 - 1, draw_LINE_TO, x1 * 2, -y0 * 2 - 1, draw_LINE_TO, x1 * 2, -y1 * 2 - 1, draw_LINE_TO, x0 * 2, -y1 * 2 - 1, draw_CLOSE_LINE, draw_END_PATH }; if (style->fill_type != PLOT_OP_TYPE_NONE) { code = pencil_path(ro_save_draw_diagram, path, sizeof path / sizeof path[0], style->fill_colour << 8, pencil_TRANSPARENT, 0, pencil_JOIN_MITRED, pencil_CAP_BUTT, pencil_CAP_BUTT, 0, 0, false, pencil_SOLID); if (code != pencil_OK) return ro_save_draw_error(code); } if (style->stroke_type != PLOT_OP_TYPE_NONE) { code = pencil_path(ro_save_draw_diagram, path, sizeof path / sizeof path[0], pencil_TRANSPARENT, style->stroke_colour << 8, style->stroke_width, pencil_JOIN_MITRED, pencil_CAP_BUTT, pencil_CAP_BUTT, 0, 0, false, pencil_SOLID); if (code != pencil_OK) return ro_save_draw_error(code); } return true; }