2025-11-28 00:35:46 +09:00

92 lines
2.6 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
//
//----------------------------------------------------------------------------
#include "Common.h"
#include "ResourceFontFileLoader.h"
#include "ResourceFontFileStream.h"
// Smart pointer to singleton instance of the font file loader.
IDWriteFontFileLoader* ResourceFontFileLoader::instance_(
new(std::nothrow) ResourceFontFileLoader()
);
// QueryInterface
HRESULT STDMETHODCALLTYPE ResourceFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)
{
if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader))
{
*ppvObject = this;
AddRef();
return S_OK;
}
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
}
// AddRef
ULONG STDMETHODCALLTYPE ResourceFontFileLoader::AddRef()
{
return InterlockedIncrement(&refCount_);
}
// Release
ULONG STDMETHODCALLTYPE ResourceFontFileLoader::Release()
{
ULONG newCount = InterlockedDecrement(&refCount_);
if (newCount == 0)
delete this;
return newCount;
}
// CreateStreamFromKey
//
// Creates an IDWriteFontFileStream from a key that identifies the file. The
// format and meaning of the key is entirely up to the loader implementation.
// The only requirements imposed by DWrite are that a key must remain valid
// for as long as the loader is registered. The same key must also uniquely
// identify the same file, so for example you must not recycle keys so that
// a key might represent different files at different times.
//
// In this case the key is a UINT which identifies a font resources.
//
HRESULT STDMETHODCALLTYPE ResourceFontFileLoader::CreateStreamFromKey(
void const* fontFileReferenceKey, // [fontFileReferenceKeySize] in bytes
UINT32 fontFileReferenceKeySize,
OUT IDWriteFontFileStream** fontFileStream
)
{
*fontFileStream = NULL;
// Make sure the key is the right size.
if (fontFileReferenceKeySize != sizeof(UINT))
return E_INVALIDARG;
UINT resourceID = *static_cast<UINT const*>(fontFileReferenceKey);
// Create the stream object.
ResourceFontFileStream* stream = new(std::nothrow) ResourceFontFileStream(resourceID);
if (stream == NULL)
return E_OUTOFMEMORY;
if (!stream->IsInitialized())
{
delete stream;
return E_FAIL;
}
*fontFileStream = SafeAcquire(stream);
return S_OK;
}