GeglSampler * gegl_buffer_sampler_new (GeglBuffer *buffer, const Babl *format, GeglSamplerType sampler_type) { GeglSampler *sampler; GType desired_type; if (format == NULL) format = babl_format ("RaGaBaA float"); desired_type = gegl_sampler_gtype_from_enum (sampler_type); sampler = g_object_new (desired_type, "buffer", buffer, "format", format, NULL); gegl_sampler_prepare (sampler); return sampler; }
GeglSampler * gegl_buffer_sampler_new_at_level (GeglBuffer *buffer, const Babl *format, GeglSamplerType sampler_type, gint level) { GeglSampler *sampler; GType desired_type; if (format == NULL) format = gegl_babl_rgbA_linear_float (); desired_type = gegl_sampler_gtype_from_enum (sampler_type); sampler = g_object_new (desired_type, "buffer", buffer, "format", format, "level", level, NULL); gegl_sampler_prepare (sampler); return sampler; }
void gegl_buffer_sample_at_level (GeglBuffer *buffer, gdouble x, gdouble y, GeglMatrix2 *scale, gpointer dest, const Babl *format, gint level, GeglSamplerType sampler_type, GeglAbyssPolicy repeat_mode) { /* if (sampler_type == GEGL_SAMPLER_NEAREST && format == buffer->soft_format) { GeglRectangle rect = {floorf (x), floorf(y), 1, 1}; gegl_buffer_get (buffer, &rect, 1, NULL, dest, GEGL_AUTO_ROWSTRIDE, repeat_mode); return; }*/ if (!format) format = buffer->soft_format; if (gegl_cl_is_accelerated ()) { GeglRectangle rect = {floorf (x), floorf(y), 1, 1}; gegl_buffer_cl_cache_flush (buffer, &rect); } /* unset the cached sampler if it dosn't match the needs */ if (buffer->sampler == NULL || (buffer->sampler != NULL && (buffer->sampler_type != sampler_type || buffer->sampler_format != format))) { gboolean threaded = gegl_config_threads () > 1; GType desired_type = gegl_sampler_gtype_from_enum (sampler_type); if (threaded) g_mutex_lock (&gegl_buffer_sampler_mutex); if (buffer->sampler) { g_object_unref (buffer->sampler); buffer->sampler = NULL; buffer->sampler_type = 0; } buffer->sampler_type = sampler_type; buffer->sampler = g_object_new (desired_type, "buffer", buffer, "format", format, "level", level, NULL); buffer->sampler_format = format; gegl_sampler_prepare (buffer->sampler); if (threaded) g_mutex_unlock (&gegl_buffer_sampler_mutex); } buffer->sampler->get(buffer->sampler, x, y, scale, dest, repeat_mode); }