/** * gwy_combo_box_metric_unit_new: * @callback: A callback called when a menu item is activated (or %NULL for * @cbdata: User data passed to the callback. * @from: The exponent of 10 the menu should start at (a multiple of 3, will * be rounded downward if isn't). * @to: The exponent of 10 the menu should end at (a multiple of 3, will be * rounded upward if isn't). * @unit: The unit to be prefixed. * @active: The power of 10 to show as currently selected (a multiple of 3). * * Creates an enum combo box with SI power of 10 multiplies. * * The integer value is the power of 10. * * Returns: The newly created combo box as #GtkWidget. **/ GtkWidget* gwy_combo_box_metric_unit_new(GCallback callback, gpointer cbdata, gint from, gint to, GwySIUnit *unit, gint active) { GtkWidget *combo; GwyEnum *entries; gint n; g_return_val_if_fail(GWY_IS_SI_UNIT(unit), NULL); if (!enum_quark) enum_quark = g_quark_from_static_string ("gwy-metric-unit-combo-box-enum"); entries = gwy_combo_box_metric_unit_make_enum(from, to, unit, &n); combo = gwy_enum_combo_box_new(entries, n, callback, cbdata, active, FALSE); g_object_set_qdata(G_OBJECT(combo), enum_quark, entries); g_signal_connect(combo, "destroy", G_CALLBACK(gwy_enum_combo_box_set_model), NULL); return combo; }
/** * gwy_si_unit_get_format_with_digits: * @siunit: A SI unit. * @style: Unit format style. * @maximum: The maximum value to be represented. * @sdigits: The number of significant digits the value should have. * @format: A value format to set-up, may be %NULL, a new value format is * allocated then. * * Finds a good format for representing a values with given number of * significant digits. * * The values should be then printed as value/@format->magnitude * [@format->units] with @format->precision decimal places. * * Returns: The value format. If @format was %NULL, a newly allocated format * is returned, otherwise (modified) @format itself is returned. **/ GwySIValueFormat* gwy_si_unit_get_format_with_digits(GwySIUnit *siunit, GwySIUnitFormatStyle style, gdouble maximum, gint sdigits, GwySIValueFormat *format) { const GwySIStyleSpec *spec; gwy_debug(""); g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), NULL); spec = gwy_si_unit_find_style_spec(style); if (!format) format = (GwySIValueFormat*)g_new0(GwySIValueFormat, 1); maximum = fabs(maximum); if (!maximum) { format->magnitude = 1; format->precision = sdigits; } else format->magnitude = gwy_math_humanize_numbers(maximum/pow10(sdigits), maximum, &format->precision); siunit->power10 = ROUND(log10(format->magnitude)); format->units_gstring = gwy_si_unit_format(siunit, spec, format->units_gstring); format->units = format->units_gstring->str; return format; }
/** * gwy_si_unit_power: * @siunit: An SI unit. * @power: Power to raise @siunit to. * @result: An SI unit to set to power of @siunit. It is safe to pass * @siunit itself. It can be %NULL too, a new SI unit is created * then and returned. * * Computes a power of an SI unit. * * Returns: When @result is %NULL, a newly created SI unit that has to be * dereferenced when no longer used later. Otherwise @result itself * is simply returned, its reference count is NOT increased. **/ GwySIUnit* gwy_si_unit_power(GwySIUnit *siunit, gint power, GwySIUnit *result) { g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), NULL); g_return_val_if_fail(!result || GWY_IS_SI_UNIT(result), NULL); if (!result) result = gwy_si_unit_new(NULL); gwy_si_unit_power_real(siunit, power, result); g_signal_emit(result, si_unit_signals[VALUE_CHANGED], 0); return result; }
/** * gwy_si_unit_set_from_string: * @siunit: An SI unit. * @unit_string: Unit string to set @siunit from (it can be %NULL for an empty * unit). * * Sets string that represents unit. * * It must be base unit with no prefixes (e. g. "m", "N", "A", etc.). **/ void gwy_si_unit_set_from_string(GwySIUnit *siunit, const gchar *unit_string) { g_return_if_fail(GWY_IS_SI_UNIT(siunit)); gwy_si_unit_set_from_string_parse(siunit, unit_string, NULL); }
/** * gwy_si_unit_get_format: * @siunit: An SI unit. * @style: Unit format style. * @value: Value the format should be suitable for. * @format: A value format to set-up, may be %NULL, a new value format is * allocated then. * * Finds a good format for representing a value. * * The values should be then printed as value/@format->magnitude * [@format->units] with @format->precision decimal places. * * Returns: The value format. If @format was %NULL, a newly allocated format * is returned, otherwise (modified) @format itself is returned. **/ GwySIValueFormat* gwy_si_unit_get_format(GwySIUnit *siunit, GwySIUnitFormatStyle style, gdouble value, GwySIValueFormat *format) { const GwySIStyleSpec *spec; gwy_debug(""); g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), NULL); spec = gwy_si_unit_find_style_spec(style); if (!format) format = (GwySIValueFormat*)g_new0(GwySIValueFormat, 1); value = fabs(value); if (!value) { format->magnitude = 1; format->precision = 2; } else format->magnitude = gwy_math_humanize_numbers(value/36, value, &format->precision); siunit->power10 = ROUND(log10(format->magnitude)); format->units_gstring = gwy_si_unit_format(siunit, spec, format->units_gstring); format->units = format->units_gstring->str; return format; }
static void gwy_si_unit_clone_real(GObject *source, GObject *copy) { GwySIUnit *si_unit, *clone; g_return_if_fail(GWY_IS_SI_UNIT(source)); g_return_if_fail(GWY_IS_SI_UNIT(copy)); si_unit = GWY_SI_UNIT(source); clone = GWY_SI_UNIT(copy); if (gwy_si_unit_equal(si_unit, clone)) return; g_array_set_size(clone->units, 0); g_array_append_vals(clone->units, si_unit->units->data, si_unit->units->len); clone->power10 = si_unit->power10; g_signal_emit(copy, si_unit_signals[VALUE_CHANGED], 0); }
/** * gwy_si_unit_set_from_string_parse: * @siunit: An SI unit. * @unit_string: Unit string to set @siunit from (it can be %NULL for an empty * unit). * @power10: Where power of 10 should be stored (or %NULL). * * Changes an SI unit according to string representation. * * This is a more powerful version of gwy_si_unit_set_from_string(), please * see gwy_si_unit_new_parse() for some discussion. **/ void gwy_si_unit_set_from_string_parse(GwySIUnit *siunit, const gchar *unit_string, gint *power10) { g_return_if_fail(GWY_IS_SI_UNIT(siunit)); gwy_si_unit_parse(siunit, unit_string); if (power10) *power10 = siunit->power10; g_signal_emit(siunit, si_unit_signals[VALUE_CHANGED], 0); }
/** * gwy_surface_set_si_unit_z: * @surface: A surface. * @si_unit: SI unit to be set. * * Sets the SI unit corresponding to the "height" (Z) dimension of a surface. * * It does not assume a reference on @si_unit, instead it adds its own * reference. * * Since: 2.45 **/ void gwy_surface_set_si_unit_z(GwySurface *surface, GwySIUnit *si_unit) { g_return_if_fail(GWY_IS_SURFACE(surface)); g_return_if_fail(GWY_IS_SI_UNIT(si_unit)); if (surface->priv->si_unit_z == si_unit) return; GWY_OBJECT_UNREF(surface->priv->si_unit_z); g_object_ref(si_unit); surface->priv->si_unit_z = si_unit; }
/** * gwy_spectra_set_si_unit_xy: * @spectra: A Spectra object. * @si_unit: SI unit to be set. * * Sets the SI unit corresponding to the location co-ordinates of the spectra * object. * * It does not assume a reference on @si_unit, instead it adds its own * reference. * * Since: 2.7 **/ void gwy_spectra_set_si_unit_xy(GwySpectra *spectra, GwySIUnit *si_unit) { g_return_if_fail(GWY_IS_SPECTRA(spectra)); g_return_if_fail(GWY_IS_SI_UNIT(si_unit)); if (spectra->si_unit_xy == si_unit) return; gwy_object_unref(spectra->si_unit_xy); g_object_ref(si_unit); spectra->si_unit_xy = si_unit; }
static GObject* gwy_si_unit_duplicate_real(GObject *object) { GwySIUnit *si_unit, *duplicate; g_return_val_if_fail(GWY_IS_SI_UNIT(object), NULL); si_unit = GWY_SI_UNIT(object); duplicate = gwy_si_unit_new_parse("", NULL); duplicate->power10 = si_unit->power10; g_array_append_vals(duplicate->units, si_unit->units->data, si_unit->units->len); return (GObject*)duplicate; }
static gsize gwy_si_unit_get_size(GObject *obj) { GwySIUnit *si_unit; gsize size; g_return_val_if_fail(GWY_IS_SI_UNIT(obj), 0); si_unit = GWY_SI_UNIT(obj); size = gwy_serialize_get_struct_size(GWY_SI_UNIT_TYPE_NAME, 0, NULL); /* Just estimate */ size += 20*si_unit->units->len; return size; }
/** * gwy_si_unit_get_string: * @siunit: An SI unit. * @style: Unit format style. * * Obtains string representing a SI unit. * * Returns: A newly allocated string that represents the base unit (with no * prefixes). **/ gchar* gwy_si_unit_get_string(GwySIUnit *siunit, GwySIUnitFormatStyle style) { GString *string; gchar *s; g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), NULL); siunit->power10 = 0; string = gwy_si_unit_format(siunit, gwy_si_unit_find_style_spec(style), NULL); s = string->str; g_string_free(string, FALSE); return s; }
void gwy_color_axis_set_si_unit(GwyColorAxis *axis, GwySIUnit *unit) { GwySIUnit *old; g_return_if_fail(GWY_IS_COLOR_AXIS(axis)); g_return_if_fail(GWY_IS_SI_UNIT(unit)); if (axis->siunit == unit) return; old = axis->siunit; g_object_ref(unit); axis->siunit = unit; gwy_object_unref(old); }
/** * gwy_si_unit_get_format_for_power10: * @siunit: An SI unit. * @style: Unit format style. * @power10: Power of 10, in the same sense as gwy_si_unit_new_parse() * returns it. * @format: A value format to set-up, may be %NULL, a new value format is * allocated then. * * Finds format for representing a specific power-of-10 multiple of a unit. * * The values should be then printed as value/@format->magnitude * [@format->units] with @format->precision decimal places. * * This function does not change the precision field of @format. * * Returns: The value format. If @format was %NULL, a newly allocated format * is returned, otherwise (modified) @format itself is returned. **/ GwySIValueFormat* gwy_si_unit_get_format_for_power10(GwySIUnit *siunit, GwySIUnitFormatStyle style, gint power10, GwySIValueFormat *format) { const GwySIStyleSpec *spec; g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), NULL); spec = gwy_si_unit_find_style_spec(style); if (!format) format = (GwySIValueFormat*)g_new0(GwySIValueFormat, 1); siunit->power10 = power10; format->magnitude = pow10(power10); format->units_gstring = gwy_si_unit_format(siunit, spec, format->units_gstring); format->units = format->units_gstring->str; return format; }
static GByteArray* gwy_si_unit_serialize(GObject *obj, GByteArray *buffer) { GwySIUnit *si_unit; GByteArray *retval; g_return_val_if_fail(GWY_IS_SI_UNIT(obj), NULL); si_unit = GWY_SI_UNIT(obj); { gchar *unitstr = gwy_si_unit_get_string(si_unit, GWY_SI_UNIT_FORMAT_PLAIN); GwySerializeSpec spec[] = { { 's', "unitstr", &unitstr, NULL, }, }; gwy_debug("unitstr = <%s>", unitstr); retval = gwy_serialize_pack_object_struct(buffer, GWY_SI_UNIT_TYPE_NAME, G_N_ELEMENTS(spec), spec); g_free(unitstr); return retval; } }
/** * gwy_si_unit_power_multiply: * @siunit1: An SI unit. * @power1: Power to raise @siunit1 to. * @siunit2: An SI unit. * @power2: Power to raise @siunit2 to. * @result: An SI unit to set to @siunit1^@power1*@siunit2^@power2. * It is safe to pass @siunit1 or @siunit2. It can be %NULL too, * a new SI unit is created then and returned. * * Computes the product of two SI units raised to arbitrary powers. * * This is the most complex SI unit arithmetic function. It can be easily * chanied when more than two units are to be multiplied. * * Returns: When @result is %NULL, a newly created SI unit that has to be * dereferenced when no longer used later. Otherwise @result itself * is simply returned, its reference count is NOT increased. * * Since: 2.4 **/ GwySIUnit* gwy_si_unit_power_multiply(GwySIUnit *siunit1, gint power1, GwySIUnit *siunit2, gint power2, GwySIUnit *result) { GwySIUnit *op2 = NULL; GwySimpleUnit *unit, *unit2; gint i, j; g_return_val_if_fail(GWY_IS_SI_UNIT(siunit1), NULL); g_return_val_if_fail(GWY_IS_SI_UNIT(siunit2), NULL); g_return_val_if_fail(!result || GWY_IS_SI_UNIT(result), NULL); if (!result) result = gwy_si_unit_new(NULL); /* Try to avoid hard work by making siunit2 the simplier one */ if (siunit1->units->len < siunit2->units->len || (power2 && !power1) || (siunit2 == result && siunit1 != result)) { GWY_SWAP(GwySIUnit*, siunit1, siunit2); GWY_SWAP(gint, power1, power2); } gwy_si_unit_power_real(siunit1, power1, result); if (!power2) { gwy_si_unit_canonicalize(result); return result; } /* When the second operand is the same object as the result, we have to * operate on a temporary copy */ if (siunit2 == result) { op2 = gwy_si_unit_duplicate(siunit2); siunit2 = op2; } result->power10 += power2*siunit2->power10; for (i = 0; i < siunit2->units->len; i++) { unit2 = &g_array_index(siunit2->units, GwySimpleUnit, i); for (j = 0; j < result->units->len; j++) { unit = &g_array_index(result->units, GwySimpleUnit, j); gwy_debug("[%d] %u == [%d] %u", i, unit2->unit, j, unit->unit); if (unit2->unit == unit->unit) { unit->power += power2*unit2->power; break; } } if (j == result->units->len) { g_array_append_val(result->units, *unit2); unit = &g_array_index(result->units, GwySimpleUnit, result->units->len - 1); unit->power *= power2; } } gwy_si_unit_canonicalize(result); gwy_object_unref(op2); g_signal_emit(result, si_unit_signals[VALUE_CHANGED], 0); return result; }