![]() |
Ansel 0.0
A darktable fork - bloat + design vision
|
#include "bauhaus/bauhaus.h"
#include "common/colorspaces_inline_conversions.h"
#include "common/debug.h"
#include "common/math.h"
#include "common/opencl.h"
#include "common/rgb_norms.h"
#include "control/control.h"
#include "develop/develop.h"
#include "develop/imageop.h"
#include "develop/imageop_math.h"
#include "develop/imageop_gui.h"
#include "develop/tiling.h"
#include "dtgtk/drawingarea.h"
#include "gui/draw.h"
#include "gui/gtk.h"
#include "gui/presets.h"
#include "iop/iop_api.h"
#include <assert.h>
#include <gtk/gtk.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
Data Structures | |
struct | dt_iop_basecurve_node_t |
struct | dt_iop_basecurve_params_t |
struct | dt_iop_basecurve_params5_t |
struct | dt_iop_basecurve_params3_t |
struct | dt_iop_basecurve_params2_t |
struct | dt_iop_basecurve_params1_t |
struct | dt_iop_basecurve_gui_data_t |
struct | basecurve_preset_t |
struct | dt_iop_basecurve_data_t |
struct | dt_iop_basecurve_global_data_t |
Macros | |
#define | DT_GUI_CURVE_EDITOR_INSET DT_PIXEL_APPLY_DPI(5) |
#define | DT_GUI_CURVE_INFL .3f |
#define | DT_IOP_TONECURVE_RES 256 |
#define | MAXNODES 20 |
#define | m MONOTONE_HERMITE |
#define | BASECURVE_DEFAULT_STEP (0.001f) |
Typedefs | |
typedef struct dt_iop_basecurve_node_t | dt_iop_basecurve_node_t |
typedef struct dt_iop_basecurve_params_t | dt_iop_basecurve_params_t |
typedef struct dt_iop_basecurve_params5_t | dt_iop_basecurve_params5_t |
typedef struct dt_iop_basecurve_params3_t | dt_iop_basecurve_params3_t |
typedef dt_iop_basecurve_params3_t | dt_iop_basecurve_params4_t |
typedef struct dt_iop_basecurve_params2_t | dt_iop_basecurve_params2_t |
typedef struct dt_iop_basecurve_params1_t | dt_iop_basecurve_params1_t |
typedef struct dt_iop_basecurve_gui_data_t | dt_iop_basecurve_gui_data_t |
typedef struct basecurve_preset_t | basecurve_preset_t |
typedef struct dt_iop_basecurve_data_t | dt_iop_basecurve_data_t |
typedef struct dt_iop_basecurve_global_data_t | dt_iop_basecurve_global_data_t |
Functions | |
int | legacy_params (dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version) |
const char * | name () |
const char ** | description (struct dt_iop_module_t *self) |
int | default_group () |
int | flags () |
int | default_colorspace (dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) |
static void | set_presets (dt_iop_module_so_t *self, const basecurve_preset_t *presets, int count, gboolean camera) |
void | init_presets (dt_iop_module_so_t *self) |
static float | exposure_increment (float stops, int e, float fusion, float bias) |
void | tiling_callback (struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out, struct dt_develop_tiling_t *tiling) |
static void | apply_legacy_curve (const float *const in, float *const out, const int width, const int height, const float mul, const float *const table, const float *const unbounded_coeffs) |
static void | apply_curve (const float *const in, float *const out, const int width, const int height, const int preserve_colors, const float mul, const float *const table, const float *const unbounded_coeffs, const dt_iop_order_iccprofile_info_t *const work_profile) |
static void | compute_features (float *const col, const int wd, const int ht) |
static void | gauss_blur (const float *const input, float *const output, const size_t wd, const size_t ht) |
static void | gauss_expand (const float *const input, float *const fine, const size_t wd, const size_t ht) |
static void | gauss_reduce (const float *const input, float *const coarse, float *const detail, const size_t wd, const size_t ht) |
void | process_fusion (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) |
void | process_lut (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) |
void | process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) |
void | commit_params (struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) |
void | init_pipe (struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) |
void | cleanup_pipe (struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) |
void | gui_update (struct dt_iop_module_t *self) |
static float | eval_grey (float x) |
void | init (dt_iop_module_t *module) |
void | init_global (dt_iop_module_so_t *module) |
void | cleanup_global (dt_iop_module_so_t *module) |
static gboolean | dt_iop_basecurve_enter_notify (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data) |
static gboolean | dt_iop_basecurve_leave_notify (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data) |
static float | to_log (const float x, const float base) |
static float | to_lin (const float x, const float base) |
static gboolean | dt_iop_basecurve_draw (GtkWidget *widget, cairo_t *crf, gpointer user_data) |
static int | _add_node (dt_iop_basecurve_node_t *basecurve, int *nodes, float x, float y) |
static void | dt_iop_basecurve_sanity_check (dt_iop_module_t *self, GtkWidget *widget) |
static gboolean | _move_point_internal (dt_iop_module_t *self, GtkWidget *widget, float dx, float dy, guint state) |
static gboolean | dt_iop_basecurve_motion_notify (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) |
static gboolean | dt_iop_basecurve_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data) |
static gboolean | area_resized (GtkWidget *widget, GdkEvent *event, gpointer user_data) |
static gboolean | _scrolled (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) |
static gboolean | dt_iop_basecurve_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) |
void | gui_changed (dt_iop_module_t *self, GtkWidget *w, void *previous) |
static void | logbase_callback (GtkWidget *slider, gpointer user_data) |
void | gui_init (struct dt_iop_module_t *self) |
void | gui_cleanup (struct dt_iop_module_t *self) |
Variables | |
static const char | neutral [] = N_("neutral") |
static const char | canon_eos [] = N_("canon eos like") |
static const char | canon_eos_alt [] = N_("canon eos like alternate") |
static const char | nikon [] = N_("nikon like") |
static const char | nikon_alt [] = N_("nikon like alternate") |
static const char | sony_alpha [] = N_("sony alpha like") |
static const char | pentax [] = N_("pentax like") |
static const char | ricoh [] = N_("ricoh like") |
static const char | olympus [] = N_("olympus like") |
static const char | olympus_alt [] = N_("olympus like alternate") |
static const char | panasonic [] = N_("panasonic like") |
static const char | leica [] = N_("leica like") |
static const char | kodak_easyshare [] = N_("kodak easyshare like") |
static const char | konica_minolta [] = N_("konica minolta like") |
static const char | samsung [] = N_("samsung like") |
static const char | fujifilm [] = N_("fujifilm like") |
static const char | nokia [] = N_("nokia like") |
static const basecurve_preset_t | basecurve_camera_presets [] |
static const int | basecurve_camera_presets_cnt = sizeof(basecurve_camera_presets) / sizeof(basecurve_preset_t) |
static const basecurve_preset_t | basecurve_presets [] |
static const int | basecurve_presets_cnt = sizeof(basecurve_presets) / sizeof(basecurve_preset_t) |
#define BASECURVE_DEFAULT_STEP (0.001f) |
#define DT_GUI_CURVE_EDITOR_INSET DT_PIXEL_APPLY_DPI(5) |
#define DT_GUI_CURVE_INFL .3f |
#define DT_IOP_TONECURVE_RES 256 |
#define m MONOTONE_HERMITE |
#define MAXNODES 20 |
typedef struct basecurve_preset_t basecurve_preset_t |
typedef struct dt_iop_basecurve_data_t dt_iop_basecurve_data_t |
typedef struct dt_iop_basecurve_global_data_t dt_iop_basecurve_global_data_t |
typedef struct dt_iop_basecurve_gui_data_t dt_iop_basecurve_gui_data_t |
typedef struct dt_iop_basecurve_node_t dt_iop_basecurve_node_t |
typedef struct dt_iop_basecurve_params1_t dt_iop_basecurve_params1_t |
typedef struct dt_iop_basecurve_params2_t dt_iop_basecurve_params2_t |
typedef struct dt_iop_basecurve_params3_t dt_iop_basecurve_params3_t |
typedef struct dt_iop_basecurve_params5_t dt_iop_basecurve_params5_t |
typedef struct dt_iop_basecurve_params_t dt_iop_basecurve_params_t |
|
inlinestatic |
References dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
Referenced by dt_iop_basecurve_button_press(), and dt_iop_basecurve_motion_notify().
|
static |
|
static |
References _move_point_internal(), BASECURVE_DEFAULT_STEP, dt_gui_get_scroll_delta(), dt_iop_module_t::gui_data, and TRUE.
Referenced by gui_init().
|
inlinestatic |
References dt_iop_eval_exp(), dt_rgb_norm(), height, and width.
Referenced by process_fusion(), and process_lut().
|
inlinestatic |
References dt_iop_eval_exp(), f(), height, and width.
Referenced by process_fusion(), and process_lut().
|
static |
References TRUE.
Referenced by gui_init().
void cleanup_global | ( | dt_iop_module_so_t * | module | ) |
References dt_iop_module_so_t::data, dt_opencl_free_kernel(), dt_iop_basecurve_global_data_t::kernel_basecurve_adjust_features, dt_iop_basecurve_global_data_t::kernel_basecurve_blend_gaussian, dt_iop_basecurve_global_data_t::kernel_basecurve_blend_laplacian, dt_iop_basecurve_global_data_t::kernel_basecurve_blur_h, dt_iop_basecurve_global_data_t::kernel_basecurve_blur_v, dt_iop_basecurve_global_data_t::kernel_basecurve_compute_features, dt_iop_basecurve_global_data_t::kernel_basecurve_detail, dt_iop_basecurve_global_data_t::kernel_basecurve_expand, dt_iop_basecurve_global_data_t::kernel_basecurve_finalize, dt_iop_basecurve_global_data_t::kernel_basecurve_legacy_lut, dt_iop_basecurve_global_data_t::kernel_basecurve_lut, dt_iop_basecurve_global_data_t::kernel_basecurve_normalize, dt_iop_basecurve_global_data_t::kernel_basecurve_reconstruct, dt_iop_basecurve_global_data_t::kernel_basecurve_reduce, and dt_iop_basecurve_global_data_t::kernel_basecurve_zero.
void cleanup_pipe | ( | struct dt_iop_module_t * | self, |
dt_dev_pixelpipe_t * | pipe, | ||
dt_dev_pixelpipe_iop_t * | piece | ||
) |
void commit_params | ( | struct dt_iop_module_t * | self, |
dt_iop_params_t * | p1, | ||
dt_dev_pixelpipe_t * | pipe, | ||
dt_dev_pixelpipe_iop_t * | piece | ||
) |
References dt_iop_basecurve_data_t::basecurve_nodes, dt_iop_basecurve_data_t::basecurve_type, dt_iop_basecurve_data_t::curve, dt_dev_pixelpipe_iop_t::data, dt_draw_curve_add_point(), dt_draw_curve_calc_values(), dt_draw_curve_destroy(), dt_draw_curve_new(), dt_draw_curve_set_point(), dt_iop_estimate_exp(), dt_iop_basecurve_data_t::exposure_bias, dt_iop_basecurve_data_t::exposure_fusion, dt_iop_basecurve_data_t::exposure_stops, dt_iop_basecurve_data_t::preserve_colors, dt_iop_basecurve_data_t::table, dt_iop_basecurve_data_t::unbounded_coeffs, and void().
|
inlinestatic |
References dt_fast_expf(), MAX, and MIN.
Referenced by process_fusion().
int default_colorspace | ( | dt_iop_module_t * | self, |
dt_dev_pixelpipe_t * | pipe, | ||
dt_dev_pixelpipe_iop_t * | piece | ||
) |
References IOP_CS_RGB.
int default_group | ( | ) |
References IOP_GROUP_TONES.
const char ** description | ( | struct dt_iop_module_t * | self | ) |
References dt_iop_set_description().
|
static |
References _add_node(), dt_iop_basecurve_params_t::basecurve, dt_iop_basecurve_params_t::basecurve_nodes, dt_iop_basecurve_params_t::basecurve_type, darktable, dt_iop_module_t::default_params, darktable_t::develop, dist(), dt_dev_add_history_item, dt_draw_curve_calc_value(), DT_GUI_CURVE_EDITOR_INSET, dt_modifier_is(), FALSE, dt_iop_module_t::gui_data, dt_iop_module_t::params, to_lin(), to_log(), TRUE, dt_iop_module_t::widget, width, dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
Referenced by gui_init().
|
static |
References darktable_t::bauhaus, darktable, dt_cairo_image_surface_create(), dt_draw_curve_add_point(), dt_draw_curve_calc_values(), dt_draw_curve_destroy(), dt_draw_curve_new(), dt_draw_curve_set_point(), dt_draw_grid(), dt_draw_loglog_grid(), DT_GUI_CURVE_EDITOR_INSET, dt_iop_estimate_exp(), dt_iop_eval_exp(), DT_IOP_TONECURVE_RES, DT_PIXEL_APPLY_DPI, dt_iop_module_t::gui_data, height, M_PI, dt_bauhaus_t::pango_font_desc, dt_iop_module_t::params, to_log(), TRUE, width, dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
Referenced by gui_init().
|
static |
References TRUE.
Referenced by gui_init().
|
static |
References _move_point_internal(), BASECURVE_DEFAULT_STEP, FALSE, dt_iop_module_t::gui_data, and TRUE.
Referenced by gui_init().
|
static |
References TRUE.
Referenced by gui_init().
|
static |
References _add_node(), _move_point_internal(), darktable, darktable_t::develop, dist(), dt_dev_add_history_item, DT_GUI_CURVE_EDITOR_INSET, dt_iop_module_t::gui_data, height, dt_iop_module_t::params, to_lin(), to_log(), TRUE, width, dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
Referenced by gui_init().
|
static |
References dt_iop_module_t::gui_data, dt_iop_module_t::params, dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
Referenced by _move_point_internal().
|
static |
Referenced by logbase_callback().
|
static |
Referenced by process_fusion().
int flags | ( | ) |
References IOP_FLAGS_ALLOW_TILING, IOP_FLAGS_DEPRECATED, and IOP_FLAGS_SUPPORTS_BLENDING.
|
inlinestatic |
References dt_alloc_align_float(), dt_free_align, MAX, and MIN.
Referenced by gauss_expand(), and gauss_reduce().
|
inlinestatic |
References gauss_blur().
Referenced by gauss_reduce(), and process_fusion().
|
inlinestatic |
: we'll need to pad up the image to get a good boundary condition!
: downsampling will not result in an energy conserving pattern (every 4 pixels one sample)
: neither will a mirror boundary condition (mirrors in subsampled values at random density)
: copy laplacian code from local laplacian filters, it's faster.
References dt_alloc_align_float(), dt_free_align, gauss_blur(), and gauss_expand().
Referenced by process_fusion().
void gui_changed | ( | dt_iop_module_t * | self, |
GtkWidget * | w, | ||
void * | previous | ||
) |
References FALSE, dt_iop_module_t::gui_data, dt_iop_module_t::params, and TRUE.
void gui_cleanup | ( | struct dt_iop_module_t * | self | ) |
void gui_init | ( | struct dt_iop_module_t * | self | ) |
References _scrolled(), area_resized(), darktable_t::bauhaus, darktable, dt_iop_module_t::default_params, dt_bauhaus_combobox_add(), dt_bauhaus_combobox_from_params(), dt_bauhaus_slider_from_params(), dt_bauhaus_slider_new_with_range(), dt_bauhaus_slider_set_default(), dt_bauhaus_slider_set_digits(), DT_BAUHAUS_SPACE, dt_bauhaus_widget_set_label(), dt_draw_curve_add_point(), dt_draw_curve_new(), DT_GUI_MODULE, dt_iop_basecurve_button_press(), dt_iop_basecurve_draw(), dt_iop_basecurve_enter_notify(), dt_iop_basecurve_key_press(), dt_iop_basecurve_leave_notify(), dt_iop_basecurve_motion_notify(), dtgtk_drawing_area_new_with_aspect_ratio(), FALSE, darktable_t::gui, IOP_GUI_ALLOC, logbase_callback(), dt_gui_gtk_t::scroll_mask, dt_iop_module_t::timeout_handle, TRUE, and dt_iop_module_t::widget.
void gui_update | ( | struct dt_iop_module_t * | self | ) |
void init | ( | dt_iop_module_t * | module | ) |
void init_global | ( | dt_iop_module_so_t * | module | ) |
References dt_opencl_create_kernel(), dt_iop_basecurve_global_data_t::kernel_basecurve_adjust_features, dt_iop_basecurve_global_data_t::kernel_basecurve_blend_gaussian, dt_iop_basecurve_global_data_t::kernel_basecurve_blend_laplacian, dt_iop_basecurve_global_data_t::kernel_basecurve_blur_h, dt_iop_basecurve_global_data_t::kernel_basecurve_blur_v, dt_iop_basecurve_global_data_t::kernel_basecurve_compute_features, dt_iop_basecurve_global_data_t::kernel_basecurve_detail, dt_iop_basecurve_global_data_t::kernel_basecurve_expand, dt_iop_basecurve_global_data_t::kernel_basecurve_finalize, dt_iop_basecurve_global_data_t::kernel_basecurve_legacy_lut, dt_iop_basecurve_global_data_t::kernel_basecurve_lut, dt_iop_basecurve_global_data_t::kernel_basecurve_normalize, dt_iop_basecurve_global_data_t::kernel_basecurve_reconstruct, dt_iop_basecurve_global_data_t::kernel_basecurve_reduce, and dt_iop_basecurve_global_data_t::kernel_basecurve_zero.
void init_pipe | ( | struct dt_iop_module_t * | self, |
dt_dev_pixelpipe_t * | pipe, | ||
dt_dev_pixelpipe_iop_t * | piece | ||
) |
void init_presets | ( | dt_iop_module_so_t * | self | ) |
int legacy_params | ( | dt_iop_module_t * | self, |
const void *const | old_params, | ||
const int | old_version, | ||
void * | new_params, | ||
const int | new_version | ||
) |
References dt_iop_basecurve_params_t::basecurve, dt_iop_basecurve_params_t::basecurve_nodes, dt_iop_basecurve_params_t::basecurve_type, CUBIC_SPLINE, DT_RGB_NORM_NONE, dt_iop_basecurve_params_t::exposure_bias, dt_iop_basecurve_params_t::exposure_fusion, dt_iop_basecurve_params3_t::exposure_fusion, dt_iop_basecurve_params_t::exposure_stops, dt_iop_basecurve_params3_t::exposure_stops, MONOTONE_HERMITE, dt_iop_basecurve_params_t::preserve_colors, dt_iop_basecurve_params1_t::tonecurve_x, dt_iop_basecurve_params1_t::tonecurve_y, dt_iop_basecurve_node_t::x, and dt_iop_basecurve_node_t::y.
|
static |
References dt_bauhaus_slider_get(), eval_grey(), and dt_iop_module_t::gui_data.
Referenced by gui_init().
const char * name | ( | ) |
Referenced by set_presets().
void process | ( | struct dt_iop_module_t * | self, |
dt_dev_pixelpipe_iop_t * | piece, | ||
const void *const | ivoid, | ||
void *const | ovoid, | ||
const dt_iop_roi_t *const | roi_in, | ||
const dt_iop_roi_t *const | roi_out | ||
) |
void process_fusion | ( | struct dt_iop_module_t * | self, |
dt_dev_pixelpipe_iop_t * | piece, | ||
const void *const | ivoid, | ||
void *const | ovoid, | ||
const dt_iop_roi_t *const | roi_in, | ||
const dt_iop_roi_t *const | roi_out | ||
) |
References apply_curve(), apply_legacy_curve(), compute_features(), dt_dev_pixelpipe_iop_t::data, dt_alloc_align_float(), dt_free_align, dt_ioppr_get_iop_work_profile_info(), DT_RGB_NORM_NONE, error(), dt_iop_basecurve_data_t::exposure_bias, dt_iop_basecurve_data_t::exposure_fusion, exposure_increment(), dt_iop_basecurve_data_t::exposure_stops, gauss_expand(), gauss_reduce(), dt_iop_roi_t::height, dt_dev_pixelpipe_iop_t::iscale, MIN, dt_iop_basecurve_data_t::preserve_colors, dt_iop_roi_t::scale, dt_iop_basecurve_data_t::table, dt_iop_basecurve_data_t::unbounded_coeffs, and dt_iop_roi_t::width.
Referenced by process().
void process_lut | ( | struct dt_iop_module_t * | self, |
dt_dev_pixelpipe_iop_t * | piece, | ||
const void *const | ivoid, | ||
void *const | ovoid, | ||
const dt_iop_roi_t *const | roi_in, | ||
const dt_iop_roi_t *const | roi_out | ||
) |
References apply_curve(), apply_legacy_curve(), dt_dev_pixelpipe_iop_t::data, dt_ioppr_get_iop_work_profile_info(), DT_RGB_NORM_NONE, dt_iop_roi_t::height, dt_iop_basecurve_data_t::preserve_colors, dt_iop_basecurve_data_t::table, dt_iop_basecurve_data_t::unbounded_coeffs, and dt_iop_roi_t::width.
Referenced by process().
|
static |
References basecurve_preset_t::autoapply, DEVELOP_BLEND_CS_RGB_DISPLAY, dt_gui_presets_add_generic(), dt_gui_presets_update_autoapply(), dt_gui_presets_update_filter(), dt_gui_presets_update_iso(), dt_gui_presets_update_ldr(), dt_gui_presets_update_mml(), dt_iop_basecurve_params_t::exposure_bias, dt_iop_basecurve_params_t::exposure_fusion, dt_iop_basecurve_params_t::exposure_stops, FALSE, basecurve_preset_t::filter, FOR_RAW, basecurve_preset_t::iso_max, basecurve_preset_t::iso_min, basecurve_preset_t::maker, basecurve_preset_t::model, name(), dt_iop_module_so_t::op, and basecurve_preset_t::params.
Referenced by init_presets().
void tiling_callback | ( | struct dt_iop_module_t * | self, |
struct dt_dev_pixelpipe_iop_t * | piece, | ||
const dt_iop_roi_t * | roi_in, | ||
const dt_iop_roi_t * | roi_out, | ||
struct dt_develop_tiling_t * | tiling | ||
) |
|
static |
Referenced by dt_iop_basecurve_button_press(), and dt_iop_basecurve_motion_notify().
|
static |
Referenced by dt_iop_basecurve_button_press(), dt_iop_basecurve_draw(), and dt_iop_basecurve_motion_notify().
|
static |
Referenced by init_presets().
|
static |
Referenced by init_presets().
|
static |
Referenced by init_presets().
|
static |
Referenced by init_presets().
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Referenced by color_finetuning_slider().
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |