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

226 lines
8.2 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_FONTMANAGER_H_INCLUDED
#define BLEND2D_FONTMANAGER_H_INCLUDED
#include "font.h"
#include "object.h"
#include "string.h"
//! \addtogroup blend2d_api_text
//! \{
//! \name BLFontManager - Structs
//! \{
//! Properties that can be used to query \ref BLFont and \ref BLFontFace.
//!
//! \sa BLFontManager.
struct BLFontQueryProperties {
//! \name Members
//! \{
//! Font style.
uint32_t style;
//! Font weight.
uint32_t weight;
//! Font stretch.
uint32_t stretch;
//! \}
#ifdef __cplusplus
//! \name Common Functionality
//! \{
BL_INLINE_NODEBUG void reset() noexcept { *this = BLFontQueryProperties{}; }
//! \}
#endif
};
//! \}
//! \name BLFontManager - C API
//! \{
//! Font manager [C API].
struct BLFontManagerCore BL_CLASS_INHERITS(BLObjectCore) {
BL_DEFINE_OBJECT_DETAIL
BL_DEFINE_OBJECT_DCAST(BLFontManager)
};
BL_BEGIN_C_DECLS
BL_API BLResult BL_CDECL blFontManagerInit(BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerInitMove(BLFontManagerCore* self, BLFontManagerCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerInitWeak(BLFontManagerCore* self, const BLFontManagerCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerInitNew(BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerDestroy(BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerReset(BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerAssignMove(BLFontManagerCore* self, BLFontManagerCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerAssignWeak(BLFontManagerCore* self, const BLFontManagerCore* other) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerCreate(BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API size_t BL_CDECL blFontManagerGetFaceCount(const BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API size_t BL_CDECL blFontManagerGetFamilyCount(const BLFontManagerCore* self) BL_NOEXCEPT_C;
BL_API bool BL_CDECL blFontManagerHasFace(const BLFontManagerCore* self, const BLFontFaceCore* face) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerAddFace(BLFontManagerCore* self, const BLFontFaceCore* face) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerQueryFace(const BLFontManagerCore* self, const char* name, size_t nameSize, const BLFontQueryProperties* properties, BLFontFaceCore* out) BL_NOEXCEPT_C;
BL_API BLResult BL_CDECL blFontManagerQueryFacesByFamilyName(const BLFontManagerCore* self, const char* name, size_t nameSize, BLArrayCore* out) BL_NOEXCEPT_C;
BL_API bool BL_CDECL blFontManagerEquals(const BLFontManagerCore* a, const BLFontManagerCore* b) BL_NOEXCEPT_C;
BL_END_C_DECLS
//! \}
//! \cond INTERNAL
//! \name BLFontManager - Internals
//! \{
//! Font manager [Virtual Function Table].
struct BLFontManagerVirt BL_CLASS_INHERITS(BLObjectVirt) {
BL_DEFINE_VIRT_BASE
};
//! Font manager [Impl].
struct BLFontManagerImpl BL_CLASS_INHERITS(BLObjectImpl) {
//! Virtual function table.
const BLFontManagerVirt* virt;
};
//! \}
//! \endcond
//! \name BLFontManager - C++ API
//! \{
#ifdef __cplusplus
//! Font manager [C++ API].
class BLFontManager final : public BLFontManagerCore {
public:
//! \cond INTERNAL
BL_INLINE_NODEBUG BLFontManagerImpl* _impl() const noexcept { return static_cast<BLFontManagerImpl*>(_d.impl); }
//! \endcond
//! \name Construction & Destruction
//! \{
BL_INLINE_NODEBUG BLFontManager() noexcept { blFontManagerInit(this); }
BL_INLINE_NODEBUG BLFontManager(BLFontManager&& other) noexcept { blFontManagerInitMove(this, &other); }
BL_INLINE_NODEBUG BLFontManager(const BLFontManager& other) noexcept { blFontManagerInitWeak(this, &other); }
BL_INLINE_NODEBUG ~BLFontManager() noexcept { blFontManagerDestroy(this); }
//! \}
//! \name Overloaded Operators
//! \{
BL_INLINE_NODEBUG BLFontManager& operator=(BLFontManager&& other) noexcept { blFontManagerAssignMove(this, &other); return *this; }
BL_INLINE_NODEBUG BLFontManager& operator=(const BLFontManager& other) noexcept { blFontManagerAssignWeak(this, &other); return *this; }
BL_INLINE_NODEBUG bool operator==(const BLFontManager& other) const noexcept { return equals(other); }
BL_INLINE_NODEBUG bool operator!=(const BLFontManager& other) const noexcept { return !equals(other); }
//! \}
//! \name Common Functionality
//! \{
BL_INLINE_NODEBUG BLResult reset() noexcept { return blFontManagerReset(this); }
BL_INLINE_NODEBUG void swap(BLFontManager& other) noexcept { _d.swap(other._d); }
BL_INLINE_NODEBUG BLResult assign(BLFontManager&& other) noexcept { return blFontManagerAssignMove(this, &other); }
BL_INLINE_NODEBUG BLResult assign(const BLFontManager& other) noexcept { return blFontManagerAssignWeak(this, &other); }
//! Tests whether the font-manager is a valid FontManager and not a built-in default instance.
BL_NODISCARD
BL_INLINE_NODEBUG bool isValid() const noexcept { return _d.aField() == 0; }
BL_NODISCARD
BL_INLINE_NODEBUG bool equals(const BLFontManager& other) const noexcept { return blFontManagerEquals(this, &other); }
//! \}
//! \name Create Functionality
//! \{
BL_INLINE_NODEBUG BLResult create() noexcept { return blFontManagerCreate(this); }
//! \}
//! Returns the number of BLFontFace instances the font manager holds.
BL_NODISCARD
BL_INLINE_NODEBUG size_t faceCount() const noexcept { return blFontManagerGetFaceCount(this); }
//! Returns the number of unique font families the font manager holds.
BL_NODISCARD
BL_INLINE_NODEBUG size_t familyCount() const noexcept { return blFontManagerGetFamilyCount(this); }
//! \name Face Management
//! \{
//! Tests whether the font manager contains the given font `face`.
BL_NODISCARD
BL_INLINE_NODEBUG bool hasFace(const BLFontFaceCore& face) const noexcept {
return blFontManagerHasFace(this, &face);
}
//! Adds a font `face` to the font manager.
//!
//! Important conditions:
//! - `BL_SUCCESS` is returned if the `face` was successfully added to font manager or if font manager already
//! held it.
//! - `BL_ERROR_FONT_NOT_INITIALIZED` is returned if the font `face` is invalid.
//! - `BL_ERROR_OUT_OF_MEMORY` is returned if memory allocation failed.
BL_INLINE_NODEBUG BLResult addFace(const BLFontFaceCore& face) noexcept {
return blFontManagerAddFace(this, &face);
}
//! Queries a font face by family `name` and stores the result to `out`.
BL_INLINE_NODEBUG BLResult queryFace(const char* name, BLFontFaceCore& out) const noexcept {
return blFontManagerQueryFace(this, name, SIZE_MAX, nullptr, &out);
}
//! \overload
BL_INLINE_NODEBUG BLResult queryFace(BLStringView name, BLFontFaceCore& out) const noexcept {
return blFontManagerQueryFace(this, name.data, name.size, nullptr, &out);
}
//! Queries a font face by family `name` and stores the result to `out`.
//!
//! A `properties` parameter contains query properties that the query engine will consider when doing the match.
//! The best candidate will be selected based on the following rules:
//!
//! - Style has the highest priority.
//! - Weight has the lowest priority.
BL_INLINE_NODEBUG BLResult queryFace(const char* name, const BLFontQueryProperties& properties, BLFontFaceCore& out) const noexcept {
return blFontManagerQueryFace(this, name, SIZE_MAX, &properties, &out);
}
//! \overload
BL_INLINE_NODEBUG BLResult queryFace(BLStringView name, const BLFontQueryProperties& properties, BLFontFaceCore& out) const noexcept {
return blFontManagerQueryFace(this, name.data, name.size, &properties, &out);
}
//! Queries all font faces by family `name` and stores the result to `out`.
BL_INLINE_NODEBUG BLResult queryFacesByFamilyName(const char* name, BLArray<BLFontFace>& out) const noexcept {
return blFontManagerQueryFacesByFamilyName(this, name, SIZE_MAX, &out);
}
//! \overload
BL_INLINE_NODEBUG BLResult queryFacesByFamilyName(BLStringView name, BLArray<BLFontFace>& out) const noexcept {
return blFontManagerQueryFacesByFamilyName(this, name.data, name.size, &out);
}
//! \}
};
#endif
//! \}
//! \}
#endif // BLEND2D_FONTMANAGER_H_INCLUDED