diff --git a/src/font_provider/dwrite/font_provider_dwrite.cpp b/src/font_provider/dwrite/font_provider_dwrite.cpp index b5980863..0ed0b7fb 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.cpp +++ b/src/font_provider/dwrite/font_provider_dwrite.cpp @@ -1,3 +1,6 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + //////////////////////////////// //~ rjf: Globals @@ -169,47 +172,47 @@ fp_init(void) } //- rjf: make dwrite factory - error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), (IUnknown **)&fp_dwrite_state->factory); + error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (void **)&fp_dwrite_state->factory); //- rjf: register static data font "loader" interface - error = fp_dwrite_state->factory->RegisterFontFileLoader((IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader); + error = IDWriteFactory_RegisterFontFileLoader(fp_dwrite_state->factory, (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader); //- rjf: make base rendering params - error = fp_dwrite_state->factory->CreateRenderingParams(&fp_dwrite_state->base_rendering_params); + error = IDWriteFactory_CreateRenderingParams(fp_dwrite_state->factory, &fp_dwrite_state->base_rendering_params); //- rjf: make sharp rendering params { FLOAT gamma = 1.f; - FLOAT enhanced_contrast = fp_dwrite_state->base_rendering_params->GetEnhancedContrast(); + FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); // FLOAT clear_type_level = fp_dwrite_state->base_rendering_params->GetClearTypeLevel(); - error = fp_dwrite_state->factory->CreateCustomRenderingParams(gamma, - enhanced_contrast, - 2.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_GDI_NATURAL, - &fp_dwrite_state->rendering_params[FP_RasterMode_Sharp]); + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, gamma, + enhanced_contrast, + 2.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_GDI_NATURAL, + &fp_dwrite_state->rendering_params[FP_RasterMode_Sharp]); } //- rjf: make smooth rendering params { FLOAT gamma = 1.f; - FLOAT enhanced_contrast = fp_dwrite_state->base_rendering_params->GetEnhancedContrast(); + FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); // FLOAT clear_type_level = fp_dwrite_state->base_rendering_params->GetClearTypeLevel(); - error = fp_dwrite_state->factory->CreateCustomRenderingParams(gamma, - enhanced_contrast, - 2.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, - &fp_dwrite_state->rendering_params[FP_RasterMode_Smooth]); + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, gamma, + enhanced_contrast, + 2.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, + &fp_dwrite_state->rendering_params[FP_RasterMode_Smooth]); } //- rjf: make dwrite gdi interop - error = fp_dwrite_state->factory->GetGdiInterop(&fp_dwrite_state->gdi_interop); + error = IDWriteFactory_GetGdiInterop(fp_dwrite_state->factory, &fp_dwrite_state->gdi_interop); //- rjf: build render target for rasterization fp_dwrite_state->bitmap_render_target_dim = v2s32(2048, 256); - error = fp_dwrite_state->gdi_interop->CreateBitmapRenderTarget(0, fp_dwrite_state->bitmap_render_target_dim.x, fp_dwrite_state->bitmap_render_target_dim.y, &fp_dwrite_state->bitmap_render_target); - fp_dwrite_state->bitmap_render_target->SetPixelsPerDip(1.0); + error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, fp_dwrite_state->bitmap_render_target_dim.x, fp_dwrite_state->bitmap_render_target_dim.y, &fp_dwrite_state->bitmap_render_target); + IDWriteBitmapRenderTarget_SetPixelsPerDip(fp_dwrite_state->bitmap_render_target, 1.0); ProfEnd(); } @@ -223,10 +226,10 @@ fp_font_open(String8 path) HRESULT error = 0; //- rjf: open font file reference - error = fp_dwrite_state->factory->CreateFontFileReference((WCHAR *)path16.str, 0, &font.file); + error = IDWriteFactory_CreateFontFileReference(fp_dwrite_state->factory, (WCHAR *)path16.str, 0, &font.file); //- rjf: open font face - error = fp_dwrite_state->factory->CreateFontFace(DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); + error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); //- rjf: handlify & return FP_Handle handle = fp_dwrite_handle_from_font(font); @@ -244,10 +247,10 @@ fp_font_open_from_static_data_string(String8 *data_ptr) HRESULT error = 0; //- rjf: open font file reference - error = fp_dwrite_state->factory->CreateCustomFontFileReference(&data_ptr, sizeof(String8 *), (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader, &font.file); + error = IDWriteFactory_CreateCustomFontFileReference(fp_dwrite_state->factory, &data_ptr, sizeof(String8 *), (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader, &font.file); //- rjf: open font face - error = fp_dwrite_state->factory->CreateFontFace(DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); + error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); //- rjf: handlify & return FP_Handle handle = fp_dwrite_handle_from_font(font); @@ -263,11 +266,11 @@ fp_font_close(FP_Handle handle) FP_DWrite_Font font = fp_dwrite_font_from_handle(handle); if(font.face != 0) { - font.face->Release(); + IDWriteFontFace_Release(font.face); } if(font.file != 0) { - font.file->Release(); + IDWriteFontFile_Release(font.file); } ProfEnd(); } @@ -280,7 +283,7 @@ fp_metrics_from_font(FP_Handle handle) DWRITE_FONT_METRICS metrics = {0}; if(font.face != 0) { - font.face->GetMetrics(&metrics); + IDWriteFontFace_GetMetrics(font.face, &metrics); } FP_Metrics result = {0}; { @@ -309,7 +312,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str DWRITE_FONT_METRICS font_metrics = {0}; if(font.face != 0) { - font.face->GetMetrics(&font_metrics); + IDWriteFontFace_GetMetrics(font.face, &font_metrics); } F32 design_units_per_em = (F32)font_metrics.designUnitsPerEm; @@ -317,7 +320,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str U16 *glyph_indices = push_array_no_zero(scratch.arena, U16, string32.size); if(font.face != 0) { - error = font.face->GetGlyphIndices(string32.str, string32.size, glyph_indices); + error = IDWriteFontFace_GetGlyphIndices(font.face, string32.str, string32.size, glyph_indices); } //- rjf: get metrics info @@ -325,7 +328,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str DWRITE_GLYPH_METRICS *glyphs_metrics = push_array_no_zero(scratch.arena, DWRITE_GLYPH_METRICS, glyphs_count); if(font.face != 0) { - error = font.face->GetGdiCompatibleGlyphMetrics((96.f/72.f)*size, 1.f, 0, 1, glyph_indices, glyphs_count, glyphs_metrics, 0); + error = IDWriteFontFace_GetGdiCompatibleGlyphMetrics(font.face, (96.f/72.f)*size, 1.f, 0, 1, glyph_indices, glyphs_count, glyphs_metrics, 0); } //- rjf: derive info from metrics @@ -352,15 +355,15 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str IDWriteBitmapRenderTarget *render_target = 0; if(font.face != 0) { - error = fp_dwrite_state->gdi_interop->CreateBitmapRenderTarget(0, atlas_dim.x, atlas_dim.y, &render_target); - render_target->SetPixelsPerDip(1.0); + error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, atlas_dim.x, atlas_dim.y, &render_target); + IDWriteBitmapRenderTarget_SetPixelsPerDip(render_target, 1.f); } //- rjf: get bitmap & clear HDC dc = 0; if(font.face != 0) { - dc = render_target->GetMemoryDC(); + dc = IDWriteBitmapRenderTarget_GetMemoryDC(render_target); HGDIOBJ original = SelectObject(dc, GetStockObject(DC_PEN)); SetDCPenColor(dc, bg_color); SelectObject(dc, GetStockObject(DC_BRUSH)); @@ -388,12 +391,12 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str RECT bounding_box = {0}; if(font.face != 0) { - error = render_target->DrawGlyphRun(draw_p.x, draw_p.y, - DWRITE_MEASURING_MODE_NATURAL, - &glyph_run, - fp_dwrite_state->rendering_params[mode], - fg_color, - &bounding_box); + error = IDWriteBitmapRenderTarget_DrawGlyphRun(render_target, draw_p.x, draw_p.y, + DWRITE_MEASURING_MODE_NATURAL, + &glyph_run, + fp_dwrite_state->rendering_params[mode], + fg_color, + &bounding_box); } //- rjf: get bitmap @@ -446,7 +449,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterMode mode, Str result.atlas_dim = v2s16(0, 0); } } - render_target->Release(); + IDWriteBitmapRenderTarget_Release(render_target); } scratch_end(scratch); ProfEnd(); diff --git a/src/font_provider/dwrite/font_provider_dwrite.h b/src/font_provider/dwrite/font_provider_dwrite.h index 437bef4e..c8c4d1e9 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.h +++ b/src/font_provider/dwrite/font_provider_dwrite.h @@ -1,13 +1,195 @@ -/* date = November 2nd 2022 11:31 am */ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) #ifndef FONT_PROVIDER_DWRITE_H #define FONT_PROVIDER_DWRITE_H -#include - #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "dwrite.lib") +// #include + +//////////////////////////////// +//~ rjf: (C) DirectWrite Definitions +// +// (courtesy of mmozeiko, Martins Mozeiko, https://github.com/mmozeiko/c_d2d_dwrite) +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to + +#include +#include +#include + +//- rjf: enums + +typedef enum DWRITE_FACTORY_TYPE { + DWRITE_FACTORY_TYPE_SHARED = 0, + DWRITE_FACTORY_TYPE_ISOLATED = 1, +} DWRITE_FACTORY_TYPE; + +typedef enum DWRITE_PIXEL_GEOMETRY { + DWRITE_PIXEL_GEOMETRY_FLAT = 0, + DWRITE_PIXEL_GEOMETRY_RGB = 1, + DWRITE_PIXEL_GEOMETRY_BGR = 2, +} DWRITE_PIXEL_GEOMETRY; + +typedef enum DWRITE_RENDERING_MODE { + DWRITE_RENDERING_MODE_DEFAULT = 0, + DWRITE_RENDERING_MODE_ALIASED = 1, + DWRITE_RENDERING_MODE_GDI_CLASSIC = 2, + DWRITE_RENDERING_MODE_GDI_NATURAL = 3, + DWRITE_RENDERING_MODE_NATURAL = 4, + DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC = 5, + DWRITE_RENDERING_MODE_OUTLINE = 6, + DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC = 2, + DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL = 3, + DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL = 4, + DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = 5, +} DWRITE_RENDERING_MODE; + +typedef enum DWRITE_FONT_SIMULATIONS { + DWRITE_FONT_SIMULATIONS_NONE = 0, + DWRITE_FONT_SIMULATIONS_BOLD = 1, + DWRITE_FONT_SIMULATIONS_OBLIQUE = 2, +} DWRITE_FONT_SIMULATIONS; + +typedef enum DWRITE_FONT_FACE_TYPE { + DWRITE_FONT_FACE_TYPE_CFF = 0, + DWRITE_FONT_FACE_TYPE_TRUETYPE = 1, + DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION = 2, + DWRITE_FONT_FACE_TYPE_TYPE1 = 3, + DWRITE_FONT_FACE_TYPE_VECTOR = 4, + DWRITE_FONT_FACE_TYPE_BITMAP = 5, + DWRITE_FONT_FACE_TYPE_UNKNOWN = 6, + DWRITE_FONT_FACE_TYPE_RAW_CFF = 7, + DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION = 2, +} DWRITE_FONT_FACE_TYPE; + +//- rjf: interfaces + +typedef struct IDWriteFactory { struct { void* tbl[]; }* v; } IDWriteFactory; +typedef struct IDWriteFactory1 { struct { void* tbl[]; }* v; } IDWriteFactory1; +typedef struct IDWriteFactory2 { struct { void* tbl[]; }* v; } IDWriteFactory2; +typedef struct IDWriteRenderingParams { struct { void* tbl[]; }* v; } IDWriteRenderingParams; +typedef struct IDWriteRenderingParams1 { struct { void* tbl[]; }* v; } IDWriteRenderingParams1; +typedef struct IDWriteRenderingParams2 { struct { void* tbl[]; }* v; } IDWriteRenderingParams2; +typedef struct IDWriteFontFileLoader { struct { void* tbl[]; }* v; } IDWriteFontFileLoader; +typedef struct IDWriteFontFileStream { struct { void* tbl[]; }* v; } IDWriteFontFileStream; +typedef struct IDWriteFontFile { struct { void* tbl[]; }* v; } IDWriteFontFile; +typedef struct IDWriteFontFace { struct { void* tbl[]; }* v; } IDWriteFontFace; +typedef struct IDWriteFontFace1 { struct { void* tbl[]; }* v; } IDWriteFontFace1; +typedef struct IDWriteFontFace2 { struct { void* tbl[]; }* v; } IDWriteFontFace2; +typedef struct IDWriteGdiInterop { struct { void* tbl[]; }* v; } IDWriteGdiInterop; +typedef struct IDWriteBitmapRenderTarget { struct { void* tbl[]; }* v; } IDWriteBitmapRenderTarget; +typedef struct IDWriteBitmapRenderTarget1 { struct { void* tbl[]; }* v; } IDWriteBitmapRenderTarget1; + +//- rjf: structs + +typedef struct DWRITE_GLYPH_METRICS { + INT32 leftSideBearing; + UINT32 advanceWidth; + INT32 rightSideBearing; + INT32 topSideBearing; + UINT32 advanceHeight; + INT32 bottomSideBearing; + INT32 verticalOriginY; +} DWRITE_GLYPH_METRICS; + +typedef struct DWRITE_GLYPH_OFFSET { + FLOAT advanceOffset; + FLOAT ascenderOffset; +} DWRITE_GLYPH_OFFSET; + +typedef struct DWRITE_GLYPH_RUN { + IDWriteFontFace* fontFace; + FLOAT fontEmSize; + UINT32 glyphCount; + UINT16* glyphIndices; + FLOAT* glyphAdvances; + DWRITE_GLYPH_OFFSET* glyphOffsets; + BOOL isSideways; + UINT32 bidiLevel; +} DWRITE_GLYPH_RUN; + +typedef struct DWRITE_FONT_METRICS { + UINT16 designUnitsPerEm; + UINT16 ascent; + UINT16 descent; + INT16 lineGap; + UINT16 capHeight; + UINT16 xHeight; + INT16 underlinePosition; + UINT16 underlineThickness; + INT16 strikethroughPosition; + UINT16 strikethroughThickness; +} DWRITE_FONT_METRICS; + +typedef struct DWRITE_MATRIX { + FLOAT m11; + FLOAT m12; + FLOAT m21; + FLOAT m22; + FLOAT dx; + FLOAT dy; +} DWRITE_MATRIX; + +//- rjf: GUIDs + +DEFINE_GUID(IID_IDWriteFactory, 0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48); +DEFINE_GUID(IID_IDWriteFactory1, 0x30572f99, 0xdac6, 0x41db, 0xa1, 0x6e, 0x04, 0x86, 0x30, 0x7e, 0x60, 0x6a); +DEFINE_GUID(IID_IDWriteFactory2, 0x0439fc60, 0xca44, 0x4994, 0x8d, 0xee, 0x3a, 0x9a, 0xf7, 0xb7, 0x32, 0xec); + +//- rjf: functions + +EXTERN_C HRESULT DECLSPEC_IMPORT WINAPI DWriteCreateFactory (DWRITE_FACTORY_TYPE factoryType, const GUID* iid, void** factory) WIN_NOEXCEPT; + +//- rjf: methods + +static inline HRESULT IDWriteFactory_RegisterFontFileLoader (IDWriteFactory* this_, IDWriteFontFileLoader* fontFileLoader) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteFontFileLoader*))this_->v->tbl[13])(this_, fontFileLoader); } +static inline HRESULT IDWriteFactory_CreateRenderingParams (IDWriteFactory* this_, IDWriteRenderingParams** renderingParams) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteRenderingParams**))this_->v->tbl[10])(this_, renderingParams); } +static inline HRESULT IDWriteFactory_CreateCustomRenderingParams (IDWriteFactory* this_, FLOAT gamma, FLOAT enhancedContrast, FLOAT clearTypeLevel, DWRITE_PIXEL_GEOMETRY pixelGeometry, DWRITE_RENDERING_MODE renderingMode, IDWriteRenderingParams** renderingParams) { return ((HRESULT (WINAPI*)(IDWriteFactory*, FLOAT, FLOAT, FLOAT, DWRITE_PIXEL_GEOMETRY, DWRITE_RENDERING_MODE, IDWriteRenderingParams**))this_->v->tbl[12])(this_, gamma, enhancedContrast, clearTypeLevel, pixelGeometry, renderingMode, renderingParams); } +static inline HRESULT IDWriteFactory_GetGdiInterop (IDWriteFactory* this_, IDWriteGdiInterop** gdiInterop) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteGdiInterop**))this_->v->tbl[17])(this_, gdiInterop); } +static inline HRESULT IDWriteFactory_CreateCustomFontFileReference (IDWriteFactory* this_, const void* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, IDWriteFontFileLoader* fontFileLoader, IDWriteFontFile** fontFile) { return ((HRESULT (WINAPI*)(IDWriteFactory*, const void*, UINT32, IDWriteFontFileLoader*, IDWriteFontFile**))this_->v->tbl[8])(this_, fontFileReferenceKey, fontFileReferenceKeySize, fontFileLoader, fontFile); } +static inline FLOAT IDWriteRenderingParams_GetEnhancedContrast (IDWriteRenderingParams* this__) { return ((FLOAT (WINAPI*)(IDWriteRenderingParams*))this__->v->tbl[4])(this__); } +static inline HRESULT IDWriteGdiInterop_CreateBitmapRenderTarget (IDWriteGdiInterop* this_, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget** renderTarget) { return ((HRESULT (WINAPI*)(IDWriteGdiInterop*, HDC, UINT32, UINT32, IDWriteBitmapRenderTarget**))this_->v->tbl[7])(this_, hdc, width, height, renderTarget); } +static inline HRESULT IDWriteBitmapRenderTarget_SetPixelsPerDip (IDWriteBitmapRenderTarget* this_, FLOAT pixelsPerDip) { return ((HRESULT (WINAPI*)(IDWriteBitmapRenderTarget*, FLOAT))this_->v->tbl[6])(this_, pixelsPerDip); } +static inline HDC IDWriteBitmapRenderTarget_GetMemoryDC (IDWriteBitmapRenderTarget* this_) { return ((HDC (WINAPI*)(IDWriteBitmapRenderTarget*))this_->v->tbl[4])(this_); } +static inline HRESULT IDWriteBitmapRenderTarget_DrawGlyphRun (IDWriteBitmapRenderTarget* this_, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE measuringMode, const DWRITE_GLYPH_RUN* glyphRun, IDWriteRenderingParams* renderingParams, COLORREF textColor, RECT* blackBoxRect) { return ((HRESULT (WINAPI*)(IDWriteBitmapRenderTarget*, FLOAT, FLOAT, DWRITE_MEASURING_MODE, const DWRITE_GLYPH_RUN*, IDWriteRenderingParams*, COLORREF, RECT*))this_->v->tbl[3])(this_, baselineOriginX, baselineOriginY, measuringMode, glyphRun, renderingParams, textColor, blackBoxRect); } +static inline HRESULT IDWriteFactory_CreateFontFileReference (IDWriteFactory* this_, const WCHAR* filePath, const FILETIME* lastWriteTime, IDWriteFontFile** fontFile) { return ((HRESULT (WINAPI*)(IDWriteFactory*, const WCHAR*, const FILETIME*, IDWriteFontFile**))this_->v->tbl[7])(this_, filePath, lastWriteTime, fontFile); } +static inline HRESULT IDWriteFactory_CreateFontFace (IDWriteFactory* this_, DWRITE_FONT_FACE_TYPE fontFaceType, UINT32 numberOfFiles, IDWriteFontFile** fontFiles, UINT32 faceIndex, DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags, IDWriteFontFace** fontFace) { return ((HRESULT (WINAPI*)(IDWriteFactory*, DWRITE_FONT_FACE_TYPE, UINT32, IDWriteFontFile**, UINT32, DWRITE_FONT_SIMULATIONS, IDWriteFontFace**))this_->v->tbl[9])(this_, fontFaceType, numberOfFiles, fontFiles, faceIndex, fontFaceSimulationFlags, fontFace); } +static inline UINT32 IDWriteFontFace_Release (IDWriteFontFace* this_) { return ((UINT32 (WINAPI*)(IDWriteFontFace*))this_->v->tbl[2])(this_); } +static inline void IDWriteFontFace_GetMetrics (IDWriteFontFace* this_, DWRITE_FONT_METRICS* fontFaceMetrics) { ((void (WINAPI*)(IDWriteFontFace*, DWRITE_FONT_METRICS*))this_->v->tbl[8])(this_, fontFaceMetrics); } +static inline UINT32 IDWriteFontFile_Release (IDWriteFontFile* this_) { return ((UINT32 (WINAPI*)(IDWriteFontFile*))this_->v->tbl[2])(this_); } +static inline HRESULT IDWriteFontFace_GetGlyphIndices (IDWriteFontFace* this_, const UINT32* codePoints, UINT32 codePointCount, UINT16* glyphIndices) { return ((HRESULT (WINAPI*)(IDWriteFontFace*, const UINT32*, UINT32, UINT16*))this_->v->tbl[11])(this_, codePoints, codePointCount, glyphIndices); } +static inline HRESULT IDWriteFontFace_GetGdiCompatibleGlyphMetrics (IDWriteFontFace* this_, FLOAT emSize, FLOAT pixelsPerDip, const DWRITE_MATRIX* transform, BOOL useGdiNatural, const UINT16* glyphIndices, UINT32 glyphCount, DWRITE_GLYPH_METRICS* glyphMetrics, BOOL isSideways) { return ((HRESULT (WINAPI*)(IDWriteFontFace*, FLOAT, FLOAT, const DWRITE_MATRIX*, BOOL, const UINT16*, UINT32, DWRITE_GLYPH_METRICS*, BOOL))this_->v->tbl[17])(this_, emSize, pixelsPerDip, transform, useGdiNatural, glyphIndices, glyphCount, glyphMetrics, isSideways); } +static inline UINT32 IDWriteBitmapRenderTarget_Release (IDWriteBitmapRenderTarget* this_) { return ((UINT32 (WINAPI*)(IDWriteBitmapRenderTarget*))this_->v->tbl[2])(this_); } + +//////////////////////////////// +//~ rjf: Font Provider Implementation Types + //- rjf: font file loader interface types struct FP_DWrite_FontFileLoaderVTable diff --git a/src/font_provider/dwrite/font_provider_dwrite_main.cpp b/src/font_provider/dwrite/font_provider_dwrite_main.cpp index 4ebbb9b2..1f5d20b5 100644 --- a/src/font_provider/dwrite/font_provider_dwrite_main.cpp +++ b/src/font_provider/dwrite/font_provider_dwrite_main.cpp @@ -1,3 +1,6 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + #define BUILD_SUPPLEMENTARY_UNIT 1 #include "base/base_inc.h" diff --git a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c index d0b14071..26d043cd 100644 --- a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c +++ b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c @@ -1,3 +1,6 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + //////////////////////////////// //~ rjf: Build Options