@@ -3697,18 +3697,28 @@ OIIO_API bool has_error();
36973697// / error messages.
36983698OIIO_API std::string geterror (bool clear = true );
36993699
3700- // / `OIIO::attribute()` sets a global attribute (i.e., a property or
3701- // / option) of OpenImageIO. The `name` designates the name of the attribute,
3702- // / `type` describes the type of data, and `value` is a pointer to memory
3703- // / containing the new value for the attribute.
3700+ // / @defgroup OIIO_attribute (global OIIO::attribute())
3701+ // / @{
37043702// /
3705- // / If the name is known, valid attribute that matches the type specified,
3706- // / the attribute will be set to the new value and `attribute()` will return
3707- // / `true`. If `name` is not recognized, or if the types do not match
3708- // / (e.g., `type` is `TypeFloat` but the named attribute is a string), the
3709- // / attribute will not be modified, and `attribute()` will return `false`.
3703+ // / `OIIO::attribute()` sets a global attribute (i.e., a property or option)
3704+ // / of OpenImageIO. The `name` designates the name of the attribute, `value`
3705+ // / is the value to use for the attribute, and for some varieties of the call,
3706+ // / `type` is a TypeDesc describing the data type.
37103707// /
3711- // / The following are the recognized attributes:
3708+ // / Most varieties of the call will return `true` if `name` is a known
3709+ // / attribute and its expected type is compatible with the type specified. If
3710+ // / `name` is not recognized, or if the types do not match (e.g., `type` is
3711+ // / `TypeFloat` but the named attribute is supposed to be a string), the
3712+ // / internal attribute will not be modified, and `attribute()` will return
3713+ // / `false`.
3714+ // /
3715+ // / In all cases, is up to the caller to ensure that `value` is or refers to
3716+ // / the right kind and size of storage for the given type.
3717+ // /
3718+ // / Note that all attributes set by this call may also be retrieved by
3719+ // / `OIIO::getattribute()`.
3720+ // /
3721+ // / RECOGNIZED ATTRIBUTES
37123722// /
37133723// / - `string options`
37143724// /
@@ -3927,7 +3937,25 @@ OIIO_API std::string geterror(bool clear = true);
39273937// / enable globally in an environment where security is a higher priority
39283938// / than being tolerant of partially broken image files.
39293939// /
3930- // / @version 3.1
3940+ // / EXAMPLES:
3941+ // / ```
3942+ // / // Setting single simple values simply:
3943+ // / bool ok = OIIO::getattribute("threads", 1); // implied: int
3944+ // / ok = OIIO::attribute("plugin_searchpath", "/foo/bar:/baz"); // implied: string
3945+ // /
3946+ // / // Setting a more complex value using a span, with explicit type
3947+ // / float missing[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
3948+ // / ok = OIIO::attribute("missingcolor", TypeDesc("float[4]"), make_span(missing));
3949+ // / ```
3950+ // /
3951+ // / The different varieties of `OIIO::attribute()` call follow:
3952+
3953+ // / Set the attribute's value from a span (which may be a single value). The
3954+ // / total size of `value` must match the `type` (if not, an assertion will be
3955+ // / thrown for debug builds of OIIO, an error will be printed for release
3956+ // / builds).
3957+ // /
3958+ // / @version 3.1+
39313959template <typename T>
39323960inline bool attribute (string_view name, TypeDesc type, span<T> value)
39333961{
@@ -3936,19 +3964,18 @@ inline bool attribute(string_view name, TypeDesc type, span<T> value)
39363964 return attribute (name, type, OIIO::as_bytes (value));
39373965}
39383966
3939- // / A version of `OIIO::attribute()` that takes its value from a span of
3940- // / untyped bytes. The total size of `value` must match the `type` (if not, an
3941- // / assertion will be thrown for debug builds of OIIO, an error will be
3942- // / printed for release builds).
3967+ // / Set the attribute's value from a span of untyped bytes. The total size of
3968+ // / `value` must match the `type` (if not, an assertion will be thrown for
3969+ // / debug builds of OIIO, an error will be printed for release builds).
39433970// /
3944- // / @version 3.1
3971+ // / @version 3.1+
39453972OIIO_API bool attribute (string_view name, TypeDesc type, cspan<std::byte> value);
39463973
3947- // / A version of `OIIO:: attribute()` where the `value` is only a pointer
3948- // / specifying the beginning of the memory where the value should be copied
3949- // / from. This is "unsafe" in the sense that there is no assurance that it
3950- // / points to a sufficient amount of memory , so the span-based versions of
3951- // / `attribute()` are preferred.
3974+ // / Set the named attribute to the contents of memory pointed to by `value`,
3975+ // / with the `type` implying the total size to be copied. This is "unsafe" in
3976+ // / the sense that there is no assurance that it points to a sufficient amount
3977+ // / of memory or value type , so the span-based versions of `attribute()` are
3978+ // / preferred.
39523979// /
39533980// / This was added in version 2.1.
39543981OIIO_API bool attribute (string_view name, TypeDesc type, const void * value);
@@ -3967,12 +3994,23 @@ inline bool attribute(string_view name, string_view value) {
39673994 const char *s = valstr.c_str ();
39683995 return attribute (name, TypeString, &s);
39693996}
3997+ // / @}
3998+
39703999
3971- // / Get the named global attribute of OpenImageIO, store it in `value`.
3972- // / Return `true` if found and it was compatible with the type specified,
3973- // / otherwise return `false` and do not modify the contents of `value`. It
3974- // / is up to the caller to ensure that `val` points to the right kind and
3975- // / size of storage for the given type.
4000+ // / @defgroup OIIO_getattribute (global OIIO::getattribute())
4001+ // / @{
4002+ // /
4003+ // / `OIIO::getattribute()` retrieves a named global attribute of OpenImageIO,
4004+ // / and stores it in `value`. These are the retrieval side of the symmetric
4005+ // / set of `OIIO::attribute()` calls.
4006+ // /
4007+ // / Most varieties of the call will return `true` if the named attribute was
4008+ // / found and it was compatible with the type specified, otherwise return
4009+ // / `false` and do not modify the contents of `value`. In all cases, it is up
4010+ // / to the caller to ensure that `val` points to the right kind and size of
4011+ // / storage for the given type.
4012+ // /
4013+ // / RECOGNIZED ATTRIBUTES
39764014// /
39774015// / In addition to being able to retrieve all the attributes that are
39784016// / documented as settable by the `OIIO::attribute()` call, `getattribute()`
@@ -4104,8 +4142,32 @@ inline bool attribute(string_view name, string_view value) {
41044142// / IBA::resize 20 0.24s (avg 12.18ms)
41054143// / IBA::zero 8 0.66ms (avg 0.08ms)
41064144// /
4145+ // / EXAMPLES:
4146+ // / ```
4147+ // / // Retrieving a single simple value with success/failure return:
4148+ // / int threads;
4149+ // / bool ok = OIIO::getattribute("threads", threads);
4150+ // / std::string path;
4151+ // / ok = OIIO::getattribute("plugin_searchpath", path);
41074152// /
4108- // / @version 3.1
4153+ // / // Directly returning a single simple value, with default to use
4154+ // / // if the attribute is not found:
4155+ // / int threads = OIIO::get_int_attribute("threads", 0);
4156+ // / string_view path = OIIO::get_string_attribute("plugin_searchpath");
4157+ // /
4158+ // / // Returning into a span, with explicit type
4159+ // / float missing[4];
4160+ // / ok = OIIO::getattribute("missingcolor", TypeDesc("float[4]"),
4161+ // / make_span(missing));
4162+ // / ```
4163+ // /
4164+ // / The different varieties of `OIIO::getattribute()` call follow:
4165+
4166+ // / Store the named attribute's current value into a writable span. The total
4167+ // / size of `value` must match the `type` (if not, an assertion will be thrown
4168+ // / for debug OIIO builds, an error will be printed for release builds).
4169+ // /
4170+ // / @version 3.1+
41094171template <typename T>
41104172inline bool getattribute (string_view name, TypeDesc type, span<T> value)
41114173{
@@ -4114,70 +4176,82 @@ inline bool getattribute(string_view name, TypeDesc type, span<T> value)
41144176 return OIIO::v3_1::getattribute (name, type, OIIO::as_writable_bytes (value));
41154177}
41164178
4117- // / A version of `getattribute()` that stores the value in a span of
4118- // / untyped bytes. The total size of `value` must match the `type` (if
4119- // / not, an assertion will be thrown for debug OIIO builds, an error will
4120- // / be printed for release builds).
4179+ // / Store the value in a span of untyped bytes. The total size of `value` must
4180+ // / match the `type` (if not, an assertion will be thrown for debug OIIO
4181+ // / builds, an error will be printed for release builds).
41214182// /
4122- // / @version 3.1
4183+ // / @version 3.1+
41234184OIIO_API bool getattribute (string_view name, TypeDesc type,
41244185 span<std::byte> value);
41254186
4126- // / A version of `OIIO::getattribute()` where the `value` is only a pointer
4127- // / specifying the beginning of the memory where the value should be copied.
4128- // / This is "unsafe" in the sense that there is no assurance that it points to
4129- // / a sufficient amount of memory, so the span-based versions of `attribute()`
4130- // / are preferred.
4187+ // / Store the value into memory pointed to by `val`. This is "unsafe" in the
4188+ // / sense that there is no assurance that it points to a sufficient amount of
4189+ // / memory or will be interpreted as the correct type, so the span-based
4190+ // / versions of `attribute()` are preferred.
41314191OIIO_API bool getattribute (string_view name, TypeDesc type, void * val);
41324192
4133- // / Shortcut getattribute() for retrieving a single integer. The value is
4134- // / placed in `value`, and the function returns `true` if the attribute was
4135- // / found and was legally convertible to an int.
4193+ // / Retrieve a single- integer attribute . The value is placed in `value`, and
4194+ // / the function returns `true` if the attribute was found and was legally
4195+ // / convertible to an int.
41364196inline bool getattribute (string_view name, int &value) {
41374197 return getattribute (name, TypeInt, &value);
41384198}
4139- // / Shortcut getattribute() for retrieving a single float. The value is placed
4140- // / in `value`, and the function returns `true` if the attribute was found and
4141- // / was legally convertible to a float.
4199+
4200+ // / Retrieve a single-float attribute. The value is placed in `value`, and the
4201+ // / function returns `true` if the attribute was found and was legally
4202+ // / convertible to a float.
41424203inline bool getattribute (string_view name, float &value) {
41434204 return getattribute (name, TypeFloat, &value);
41444205}
4145- // / Shortcut getattribute() for retrieving a single string as a `std::string`.
4146- // / The value is placed in `value`, and the function returns `true` if the
4147- // / attribute was found.
4206+
4207+ // / Retrieve a single-string attribute, placed as a `std::string` into
4208+ // / `value`, and the function returns `true` if the attribute was found and
4209+ // / was legally convertible to an string.
41484210inline bool getattribute (string_view name, std::string &value) {
41494211 ustring s;
41504212 bool ok = getattribute (name, TypeString, &s);
41514213 if (ok)
41524214 value = s.string ();
41534215 return ok;
41544216}
4155- // / Shortcut getattribute() for retrieving a single string as a `char*`.
4156- inline bool getattribute (string_view name, char **val) {
4157- return getattribute (name, TypeString, val);
4217+
4218+ // / Retrieve a single-string attribute, placed as a `const char*` into
4219+ // / `*value`, and the function returns `true` if the attribute was found and
4220+ // / was legally convertible to an string. Note that the `const char*`
4221+ // / retrieved is really the characters belonging to a `ustring`, and so is
4222+ // / owned by OIIO and should not be freed by the calling code.
4223+ inline bool getattribute (string_view name, char **value) {
4224+ return getattribute (name, TypeString, value);
41584225}
4159- // / Shortcut getattribute() for retrieving a single integer, with a supplied
4160- // / default value that will be returned if the attribute is not found or
4161- // / could not legally be converted to an int.
4226+
4227+ // / Retrieve a single-integer attribute, with a supplied default value that
4228+ // / will be returned if the attribute is not found or could not legally be
4229+ // / converted to an int.
41624230inline int get_int_attribute (string_view name, int defaultval=0 ) {
41634231 int val;
41644232 return getattribute (name, TypeInt, &val) ? val : defaultval;
41654233}
4166- // / Shortcut getattribute() for retrieving a single float, with a supplied
4167- // / default value that will be returned if the attribute is not found or
4168- // / could not legally be converted to a float.
4234+
4235+ // / Retrieve a single-float attribute, with a supplied default value that
4236+ // / will be returned if the attribute is not found or could not legally be
4237+ // / converted to a float.
41694238inline float get_float_attribute (string_view name, float defaultval=0 ) {
41704239 float val;
41714240 return getattribute (name, TypeFloat, &val) ? val : defaultval;
41724241}
4173- // / Shortcut getattribute() for retrieving a single string, with a supplied
4174- // / default value that will be returned if the attribute is not found.
4242+
4243+ // / Retrieve a single-string attribute, with a supplied default value that
4244+ // / will be returned if the attribute is not found or could not legally be
4245+ // / converted to an int. default value that will be returned if the attribute
4246+ // / is not found.
41754247inline string_view get_string_attribute (string_view name,
41764248 string_view defaultval = string_view()) {
41774249 ustring val;
41784250 return getattribute (name, TypeString, &val) ? string_view (val) : defaultval;
41794251}
41804252
4253+ // / @}
4254+
41814255
41824256// / Set the metadata of the `spec` to presume that color space is `name` (or
41834257// / to assume nothing about the color space if `name` is empty). The core
0 commit comments