94 lines
3.2 KiB
C
94 lines
3.2 KiB
C
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
// NoesisGUI - http://www.noesisengine.com
|
||
|
|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
|
||
|
|
#ifndef __GUI_CACHEDFONTPROVIDER_H__
|
||
|
|
#define __GUI_CACHEDFONTPROVIDER_H__
|
||
|
|
|
||
|
|
|
||
|
|
#include <NsCore/Noesis.h>
|
||
|
|
#include <NsCore/Vector.h>
|
||
|
|
#include <NsCore/HashMap.h>
|
||
|
|
#include <NsCore/String.h>
|
||
|
|
#include <NsGui/FontProvider.h>
|
||
|
|
#include <NsGui/CachedFontProviderApi.h>
|
||
|
|
|
||
|
|
|
||
|
|
namespace Noesis
|
||
|
|
{
|
||
|
|
|
||
|
|
NS_WARNING_PUSH
|
||
|
|
NS_MSVC_WARNING_DISABLE(4251 4275)
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
/// Helper base class for implementing font providers
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
class NS_GUI_CACHEDFONTPROVIDER_API CachedFontProvider: public FontProvider
|
||
|
|
{
|
||
|
|
protected:
|
||
|
|
/// Registers a font filename in the given folder. Each time this function is invoked, the
|
||
|
|
/// given filename is opened and scanned (through OpenFont). It is recommended deferring
|
||
|
|
/// this call as much as possible (for example, until ScanFolder is invoked)
|
||
|
|
void RegisterFont(const Uri& folder, const char* filename);
|
||
|
|
|
||
|
|
/// Registers a font face with given font properties. In comparison with the previous function
|
||
|
|
/// this one doesn't open the filename to scan it. Always use this function if possible
|
||
|
|
void RegisterFont(const Uri& folder, const char* filename, uint32_t index, const char* family,
|
||
|
|
const char* faceName, FontWeight weight, FontStretch stretch, FontStyle style,
|
||
|
|
uint32_t flags = 0);
|
||
|
|
|
||
|
|
/// First time a font is requested from a folder, this function is invoked to give inheritors
|
||
|
|
/// the opportunity to register faces found in that folder
|
||
|
|
virtual void ScanFolder(const Uri& folder);
|
||
|
|
|
||
|
|
/// Returns a stream to a previously registered filename
|
||
|
|
virtual Ptr<Stream> OpenFont(const Uri& folder, const char* filename) const = 0;
|
||
|
|
|
||
|
|
/// From FontProvider
|
||
|
|
//@{
|
||
|
|
FontSource MatchFont(const Uri& baseUri, const char* familyName, FontWeight& weight,
|
||
|
|
FontStretch& stretch, FontStyle& style) override;
|
||
|
|
bool FamilyExists(const Uri& baseUri, const char* familyName) override;
|
||
|
|
//@}
|
||
|
|
|
||
|
|
private:
|
||
|
|
struct Face
|
||
|
|
{
|
||
|
|
FixedString<64> filename;
|
||
|
|
FixedString<64> faceName;
|
||
|
|
uint32_t faceIndex;
|
||
|
|
|
||
|
|
FontWeight weight;
|
||
|
|
FontStretch stretch;
|
||
|
|
FontStyle style;
|
||
|
|
|
||
|
|
enum Flags
|
||
|
|
{
|
||
|
|
Flags_VarWeight = 1,
|
||
|
|
Flags_VarWidth = 2,
|
||
|
|
Flags_VarItalic = 4
|
||
|
|
};
|
||
|
|
|
||
|
|
uint32_t flags;
|
||
|
|
};
|
||
|
|
|
||
|
|
template<class T> using Bucket = HashBucket_KHV<String, T, CaseStringHashKeyInfo>;
|
||
|
|
|
||
|
|
typedef Vector<Face> Family;
|
||
|
|
typedef HashMap<String, Family, 0, Bucket<Family>> Families;
|
||
|
|
typedef HashMap<String, Families, 0, Bucket<Families>> Folders;
|
||
|
|
Folders mFolders;
|
||
|
|
|
||
|
|
Families& GetFolder(const Uri& folder);
|
||
|
|
FontSource FindBestMatch(const Uri& folder, const Family& faces, FontWeight& weight,
|
||
|
|
FontStretch& stretch, FontStyle& style) const;
|
||
|
|
};
|
||
|
|
|
||
|
|
NS_WARNING_POP
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|