static VALUE method_factory_write_for_marshal(VALUE self, VALUE obj) { RGeo_FactoryData* self_data; GEOSContextHandle_t self_context; GEOSWKBWriter* wkb_writer; const GEOSGeometry* geom; VALUE result; char* str; size_t size; char has_3d; #ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION RGeo_Globals* globals; VALUE wkb_generator; #endif self_data = RGEO_FACTORY_DATA_PTR(self); self_context = self_data->geos_context; has_3d = self_data->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M; #ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION if (has_3d) { globals = self_data->globals; wkb_generator = globals->marshal_wkb_generator; if (NIL_P(wkb_generator)) { wkb_generator = rb_funcall( rb_const_get_at(globals->geos_module, rb_intern("Utils")), rb_intern("marshal_wkb_generator"), 0); globals->marshal_wkb_generator = wkb_generator; } return rb_funcall(wkb_generator, globals->id_generate, 1, obj); } #endif wkb_writer = self_data->marshal_wkb_writer; if (!wkb_writer) { wkb_writer = GEOSWKBWriter_create_r(self_context); if (has_3d) { GEOSWKBWriter_setOutputDimension_r(self_context, wkb_writer, 3); } self_data->marshal_wkb_writer = wkb_writer; } result = Qnil; if (wkb_writer) { geom = rgeo_get_geos_geometry_safe(obj); if (geom) { str = (char*)GEOSWKBWriter_write_r(self_context, wkb_writer, geom, &size); if (str) { result = rb_str_new(str, size); GEOSFree_r(self_context, str); } } } return result; }
static VALUE method_geometry_as_binary(VALUE self) { VALUE result = Qnil; RGeo_GeometryData* self_data = RGEO_GEOMETRY_DATA_PTR(self); const GEOSGeometry* self_geom = self_data->geom; if (self_geom) { RGeo_FactoryData* factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory); GEOSWKBWriter* wkb_writer = factory_data->wkb_writer; GEOSContextHandle_t geos_context = self_data->geos_context; if (!wkb_writer) { wkb_writer = GEOSWKBWriter_create_r(geos_context); factory_data->wkb_writer = wkb_writer; } size_t size; char* str = (char*)GEOSWKBWriter_write_r(geos_context, wkb_writer, self_geom, &size); if (str) { result = rb_str_new(str, size); GEOSFree_r(geos_context, str); } } return result; }
static VALUE method_geometry_as_binary(VALUE self) { VALUE result; RGeo_GeometryData* self_data; const GEOSGeometry* self_geom; RGeo_FactoryData* factory_data; VALUE wkb_generator; GEOSWKBWriter* wkb_writer; GEOSContextHandle_t geos_context; size_t size; char* str; result = Qnil; self_data = RGEO_GEOMETRY_DATA_PTR(self); self_geom = self_data->geom; if (self_geom) { factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory); wkb_generator = factory_data->wkrep_wkb_generator; if (!NIL_P(wkb_generator)) { result = rb_funcall(wkb_generator, factory_data->globals->id_generate, 1, self); } else { wkb_writer = factory_data->wkb_writer; geos_context = self_data->geos_context; if (!wkb_writer) { wkb_writer = GEOSWKBWriter_create_r(geos_context); factory_data->wkb_writer = wkb_writer; } str = (char*)GEOSWKBWriter_write_r(geos_context, wkb_writer, self_geom, &size); if (str) { result = rb_str_new(str, size); GEOSFree_r(geos_context, str); } } } return result; }