Datum compactreaction(PG_FUNCTION_ARGS){ Datum react_datum = PG_GETARG_DATUM(0); Datum options_xyz = PG_GETARG_BOOL(1); void* result = 0; PG_BINGO_BEGIN { BingoPgCommon::BingoSessionHandler bingo_handler(fcinfo->flinfo->fn_oid); bingo_handler.setFunctionName("compactreaction"); BingoPgText r_text(react_datum); int buf_size; const char* r_buf = r_text.getText(buf_size); int res_buf; const char* bingo_result = ringoICR(r_buf, buf_size, options_xyz, &res_buf); if(bingo_result == 0) { CORE_HANDLE_WARNING(0, 1, "bingo.compactreaction", bingoGetError()); PG_RETURN_NULL(); } BingoPgText result_data; result_data.initFromBuffer(bingo_result, res_buf); result = result_data.release(); } PG_BINGO_END if(result == 0) PG_RETURN_NULL(); PG_RETURN_BYTEA_P(result); }
static void render_object(ImpRenderCtx *ctx, void *drw_data, iks *node) { char *tag, *t; ImpColor fg; tag = iks_name(node); if (strcmp(tag, "draw:g") == 0) { iks *x; for (x = iks_first_tag(node); x; x = iks_next_tag(x)) { render_object(ctx, drw_data, x); } } else if (strcmp(tag, "draw:frame") == 0) { iks *x; for (x = iks_first_tag(node); x; x = iks_next_tag(x)) { render_object(ctx, drw_data, x); } } else if (strcmp(tag, "draw:line") == 0) { r_get_color(ctx, node, "svg:stroke-color", &fg); ctx->drw->set_fg_color(drw_data, &fg); ctx->drw->draw_line(drw_data, r_get_x(ctx, node, "svg:x1"), r_get_y(ctx, node, "svg:y1"), r_get_x(ctx, node, "svg:x2"), r_get_y(ctx, node, "svg:y2") ); } else if (strcmp(tag, "draw:rect") == 0) { int x, y, w, h, r = 0; char *t; x = r_get_x(ctx, node, "svg:x"); y = r_get_y(ctx, node, "svg:y"); w = r_get_x(ctx, node, "svg:width"); h = r_get_y(ctx, node, "svg:height"); t = r_get_style(ctx, node, "draw:corner-radius"); if (t) r = atof(t) * ctx->fact_x; if (r_get_style(ctx, node, "draw:fill")) { r_get_color(ctx, node, "draw:fill-color", &fg); ctx->drw->set_fg_color(drw_data, &fg); _imp_draw_rect(ctx, drw_data, 1, x, y, w, h, r); } r_get_color(ctx, node, "svg:stroke-color", &fg); ctx->drw->set_fg_color(drw_data, &fg); _imp_draw_rect(ctx, drw_data, 0, x, y, w, h, r); r_text(ctx, drw_data, node); } else if (strcmp(tag, "draw:ellipse") == 0 || strcmp(tag, "draw:circle") == 0) { int sa, ea, fill = 0; r_get_color(ctx, node, "svg:stroke-color", &fg); sa = r_get_angle(node, "draw:start-angle", 0); ea = r_get_angle(node, "draw:end-angle", 360); if (ea > sa) ea = ea - sa; else ea = 360 + ea - sa; t = r_get_style(ctx, node, "draw:fill"); if (t) fill = 1; ctx->drw->set_fg_color(drw_data, &fg); ctx->drw->draw_arc(drw_data, fill, r_get_x(ctx, node, "svg:x"), r_get_y(ctx, node, "svg:y"), r_get_x(ctx, node, "svg:width"), r_get_y(ctx, node, "svg:height"), sa, ea ); } else if (strcmp(tag, "draw:polygon") == 0) { // FIXME: r_polygon(ctx, drw_data, node); } else if (strcmp(tag, "draw:text-box") == 0) { // FIXME: r_text(ctx, drw_data, node); } else if (strcmp(tag, "draw:image") == 0) { char *name; name = iks_find_attrib(node, "xlink:href"); if (!name) return; if (name[0] == '#') ++name; _imp_draw_image(ctx, drw_data, name, r_get_x(ctx, node, "svg:x"), r_get_y(ctx, node, "svg:y"), r_get_x(ctx, node, "svg:width"), r_get_y(ctx, node, "svg:height") ); } else { printf("Unknown element: %s\n", tag); } }