DYT/Tool/OpenSceneGraph-3.6.5/include/blend2d/fontvariationsettings.h
2024-12-25 07:49:36 +08:00

272 lines
11 KiB
C++

// This file is part of Blend2D project <https://blend2d.com>
//
// See blend2d.h or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef BLEND2D_FONTVARIATIONSETTINGS_H_INCLUDED
#define BLEND2D_FONTVARIATIONSETTINGS_H_INCLUDED
#include "array.h"
#include "bitset.h"
#include "filesystem.h"
#include "fontdefs.h"
#include "geometry.h"
#include "glyphbuffer.h"
#include "object.h"
#include "path.h"
#include "string.h"
//! \addtogroup blend2d_api_text
//! \{
//! \name BLFontVariationSettings - Structs
//! \{
//! Associates a font variation tag with a value.
struct BLFontVariationItem {
//! \name Members
//! \{
//! Variation tag (32-bit).
BLTag tag;
//! Variation value.
//!
//! \note values outside of [0, 1] range are invalid.
float value;
//! \}
#ifdef __cplusplus
//! \name Common Functionality
//! \{
BL_INLINE_NODEBUG void reset() noexcept { *this = BLFontVariationItem{}; }
//! \}
#endif
};
//! A view unifying the representation of an internal storage used by \ref BLFontVariationSettings.
struct BLFontVariationSettingsView {
//! Pointer to font variation items, where each item describes a variation tag and its value.
//!
//! \note If the container is in SSO mode the `data` member will point to `ssoData`.
const BLFontVariationItem* data;
//! Count of items in `data.
size_t size;
//! Unpacked SSO items into `BLFontVariationItem` array.
//!
//! \note This member won't be initialized or zeroed in case `BLFontVariationSettings` is not in SSO mode. And if the
//! container is in SSO mode only the number of items used will be overwritten by \ref blFontVariationSettingsGetView().
BLFontVariationItem ssoData[3];
#if defined(__cplusplus)
//! \name C++ Iterator Compatibility
//! \{
//! Tests whether the view is empty.
BL_NODISCARD
BL_INLINE_NODEBUG bool empty() const noexcept { return size == 0; }
//! Returns a const pointer to \ref BLFontVariationSettingsView data (iterator compatibility).
BL_NODISCARD
BL_INLINE_NODEBUG const BLFontVariationItem* begin() const noexcept { return data; }
//! Returns a const pointer to the end of \ref BLFontVariationSettingsView data (iterator compatibility).
BL_NODISCARD
BL_INLINE_NODEBUG const BLFontVariationItem* end() const noexcept { return data + size; }
//! Returns a const pointer to \ref BLFontVariationSettingsView data (iterator compatibility).
BL_NODISCARD
BL_INLINE_NODEBUG const BLFontVariationItem* cbegin() const noexcept { return data; }
//! Returns a const pointer to the end of \ref BLFontVariationSettingsView data (iterator compatibility).
BL_NODISCARD
BL_INLINE_NODEBUG const BLFontVariationItem* cend() const noexcept { return data + size; }
//! \}
#endif
};
//! \}
//! \name BLFontVariationSettings - C API
//! \{
BL_BEGIN_C_DECLS
BL_API BLResult BL_CDECL blFontVariationSettingsInit(BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsInitMove(BLFontVariationSettingsCore* self, BLFontVariationSettingsCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsInitWeak(BLFontVariationSettingsCore* self, const BLFontVariationSettingsCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsDestroy(BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsReset(BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsClear(BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsShrink(BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsAssignMove(BLFontVariationSettingsCore* self, BLFontVariationSettingsCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsAssignWeak(BLFontVariationSettingsCore* self, const BLFontVariationSettingsCore* other) BL_NOEXCEPT_C;
BL_API size_t BL_CDECL blFontVariationSettingsGetSize(const BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API size_t BL_CDECL blFontVariationSettingsGetCapacity(const BLFontVariationSettingsCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsGetView(const BLFontVariationSettingsCore* self, BLFontVariationSettingsView* out) BL_NOEXCEPT_C;
BL_API bool BL_CDECL blFontVariationSettingsHasValue(const BLFontVariationSettingsCore* self, BLTag variationTag) BL_NOEXCEPT_C;
BL_API float BL_CDECL blFontVariationSettingsGetValue(const BLFontVariationSettingsCore* self, BLTag variationTag) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsSetValue(BLFontVariationSettingsCore* self, BLTag variationTag, float value) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontVariationSettingsRemoveValue(BLFontVariationSettingsCore* self, BLTag variationTag) BL_NOEXCEPT_C;
BL_API bool BL_CDECL blFontVariationSettingsEquals(const BLFontVariationSettingsCore* a, const BLFontVariationSettingsCore* b) BL_NOEXCEPT_C;
BL_END_C_DECLS
//! Font variation settings [C API].
struct BLFontVariationSettingsCore BL_CLASS_INHERITS(BLObjectCore) {
BL_DEFINE_OBJECT_DETAIL
BL_DEFINE_OBJECT_DCAST(BLFontVariationSettings)
};
//! \}
//! \cond INTERNAL
//! \name BLFontVariationSettings - Internals
//! \{
//! Font variation settings [Impl].
//!
//! \note This Impl is fully compatible with `BLArrayImpl`.
struct BLFontVariationSettingsImpl BL_CLASS_INHERITS(BLObjectImpl) {
//! Pointer to variation items.
BLFontVariationItem* data;
//! Number of variation items in `data`.
size_t size;
//! Capacity of `data`.
size_t capacity;
};
//! \}
//! \endcond
//! \name BLFontVariationSettings - C++ API
//! \{
#ifdef __cplusplus
//! Font variation settings [C++ API].
class BLFontVariationSettings final : public BLFontVariationSettingsCore {
public:
//! \cond INTERNAL
//! \name Internals
//! \{
enum : uint32_t {
//! SSO capacity of \ref BLFontVariationSettings container.
kSSOCapacity = 3,
//! Signature of SSO representation of an empty font variation settings.
kSSOEmptySignature = BLObjectInfo::packTypeWithMarker(BL_OBJECT_TYPE_FONT_VARIATION_SETTINGS)
};
BL_INLINE_NODEBUG BLFontVariationSettingsImpl* _impl() const noexcept { return static_cast<BLFontVariationSettingsImpl*>(_d.impl); }
//! \}
//! \endcond
//! \name Construction & Destruction
//! \{
BL_INLINE_NODEBUG BLFontVariationSettings() noexcept {
_d.initStatic(BLObjectInfo{kSSOEmptySignature});
}
BL_INLINE_NODEBUG BLFontVariationSettings(BLFontVariationSettings&& other) noexcept {
_d = other._d;
other._d.initStatic(BLObjectInfo{kSSOEmptySignature});
}
BL_INLINE_NODEBUG BLFontVariationSettings(const BLFontVariationSettings& other) noexcept {
blFontVariationSettingsInitWeak(this, &other);
}
BL_INLINE_NODEBUG ~BLFontVariationSettings() noexcept {
if (BLInternal::objectNeedsCleanup(_d.info.bits))
blFontVariationSettingsDestroy(this);
}
//! \}
//! \name Overloaded Operators
//! \{
BL_INLINE_NODEBUG BLFontVariationSettings& operator=(BLFontVariationSettings&& other) noexcept { blFontVariationSettingsAssignMove(this, &other); return *this; }
BL_INLINE_NODEBUG BLFontVariationSettings& operator=(const BLFontVariationSettings& other) noexcept { blFontVariationSettingsAssignWeak(this, &other); return *this; }
BL_INLINE_NODEBUG bool operator==(const BLFontVariationSettings& other) const noexcept { return equals(other); }
BL_INLINE_NODEBUG bool operator!=(const BLFontVariationSettings& other) const noexcept { return !equals(other); }
//! \}
//! \name Common Functionality
//! \{
BL_INLINE_NODEBUG BLResult reset() noexcept { return blFontVariationSettingsReset(this); }
BL_INLINE_NODEBUG BLResult clear() noexcept { return blFontVariationSettingsClear(this); }
BL_INLINE_NODEBUG void swap(BLFontVariationSettings& other) noexcept { _d.swap(other._d); }
BL_INLINE_NODEBUG BLResult assign(BLFontVariationSettings&& other) noexcept { return blFontVariationSettingsAssignMove(this, &other); }
BL_INLINE_NODEBUG BLResult assign(const BLFontVariationSettings& other) noexcept { return blFontVariationSettingsAssignWeak(this, &other); }
//! \}
//! \name Accessors
//! \{
//! Tests whether the container is empty, which means that no tag/value pairs are stored in it.
BL_INLINE_NODEBUG bool empty() const noexcept { return size() == 0; }
//! Returns the number of tag/value pairs stored in the container.
BL_INLINE_NODEBUG size_t size() const noexcept { return _d.sso() ? size_t(_d.info.aField()) : _impl()->size; }
//! Returns the container capacity.
//!
//! \note If the container is in SSO mode, it would return the SSO capacity, however, such capacity can only be used
//! for simple tag/value pairs (where the tag is known by Blend2D and has associated an internal ID that represents it).
BL_INLINE_NODEBUG size_t capacity() const noexcept { return _d.sso() ? size_t(kSSOCapacity) : _impl()->capacity; }
//! Returns a normalized view of tag/value pairs as an iterable `BLFontVariationItem` array in the output view.
//!
//! \note If the container is in SSO mode then all `BLFontVariationItem` values will be created from the underlying SSO
//! representation and `BLFontVariationSettingsView::data` will point to `BLFontVariationSettingsView::ssoData`. If the
//! container is dynamic, `BLFontVariationSettingsView::ssoData` won't be initialized and `BLFontVariationSettingsView::data`
//! will point to the container's data. This means that the view cannot outlive the container, and also during iteration the
//! view the container cannot be modified as that could invalidate the entire view.
BL_INLINE_NODEBUG BLResult getView(BLFontVariationSettingsView* out) const noexcept { return blFontVariationSettingsGetView(this, out); }
//! Tests whether the settings contains the given `variationTag`.
BL_INLINE_NODEBUG bool hasValue(BLTag variationTag) const noexcept { return blFontVariationSettingsHasValue(this, variationTag); }
//! Returns the value associated with the given `variationTag`.
//!
//! If the `variationTag` doesn't exist or is invalid `NaN` is returned.
BL_INLINE_NODEBUG float getValue(BLTag variationTag) const noexcept { return blFontVariationSettingsGetValue(this, variationTag); }
//! Sets or inserts the given `variationTag` to the settings and associates it with the given `value`.
BL_INLINE_NODEBUG BLResult setValue(BLTag variationTag, float value) noexcept { return blFontVariationSettingsSetValue(this, variationTag, value); }
//! Removes the given `variationTag` and its value from the settings.
//!
//! Nothing happens if the `variationTag` is not in the settings (\ref BL_SUCCESS is returned).
BL_INLINE_NODEBUG BLResult removeValue(BLTag variationTag) noexcept { return blFontVariationSettingsRemoveValue(this, variationTag); }
//! \}
//! \name Equality & Comparison
//! \{
//! Tests whether this font variation settings is equal to `other` - equality means that it has the same tag/value pairs.
BL_INLINE_NODEBUG bool equals(const BLFontVariationSettings& other) const noexcept { return blFontVariationSettingsEquals(this, &other); }
//! \}
};
#endif
//! \}
//! \}
#endif // BLEND2D_FONTVARIATIONSETTINGS_H_INCLUDED