.circleci/config.yml | 16 ++ CMakeLists.txt | 2 src/hb-directwrite.cc | 251 ++++++++++++++++++++++---------------------- src/hb-open-file-private.hh | 12 +- src/hb-ot-glyf-table.hh | 40 +++---- src/hb-ot-kern-table.hh | 2 6 files changed, 175 insertions(+), 148 deletions(-)
New commits: commit 95f0458f44e9a7ec250f1bc7d9f060745dbabcf3 Author: Nikolaus Waxweiler <[email protected]> Date: Fri Mar 23 19:38:11 2018 +0000 Policy 0063 must be enabled to have hidden inline visibility... (#900) ...on static builds. diff --git a/CMakeLists.txt b/CMakeLists.txt index 85709b2e..a41afc4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,6 @@ cmake_minimum_required(VERSION 2.8.0) +cmake_policy(SET CMP0063 NEW) + project(harfbuzz) enable_testing() commit 2a236063392c4f7c4d718be36d2dec2b8804b560 Author: Ebrahim Byagowi <[email protected]> Date: Fri Mar 23 18:37:01 2018 +0430 Fix llvm-gcc-4.2 compile issue and add a macOS bot to test it (#899) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ef10586..19beeeea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,19 @@ version: 2 jobs: + macos-llvm-gcc-4.2: + macos: + xcode: "8.3.3" + steps: + - checkout + - run: brew update-reset + - run: brew install wget pkg-config libtool ragel freetype glib cairo + - run: wget https://packages.macports.org/llvm-gcc42/llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 + - run: CC=$PWD/opt/local/bin/llvm-gcc-4.2 CXX=$PWD/opt/local/bin/llvm-g++-4.2 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo + # Ignoring assembler complains, https://stackoverflow.com/a/39867021 + - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' + - run: make check || .ci/fail.sh + distcheck: docker: - image: ubuntu:17.10 @@ -163,6 +176,9 @@ workflows: version: 2 build: jobs: + # macOS + - macos-llvm-gcc-4.2 + # both autotools and cmake - distcheck diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh index e2644eaf..ac027520 100644 --- a/src/hb-open-file-private.hh +++ b/src/hb-open-file-private.hh @@ -295,11 +295,13 @@ struct OpenTypeFontFile { static const hb_tag_t tableTag = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */ - static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */ - static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */ - static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f'); /* TrueType Collection */ - static const hb_tag_t TrueTag = HB_TAG ('t','r','u','e'); /* Obsolete Apple TrueType */ - static const hb_tag_t Typ1Tag = HB_TAG ('t','y','p','1'); /* Obsolete Apple Type1 font in SFNT container */ + enum { + CFFTag = HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */ + TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */ + TTCTag = HB_TAG ('t','t','c','f'), /* TrueType Collection */ + TrueTag = HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */ + Typ1Tag = HB_TAG ('t','y','p','1') /* Obsolete Apple Type1 font in SFNT container */ + }; inline hb_tag_t get_tag (void) const { return u.tag; } diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 79467061..4eb2ad18 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -134,18 +134,20 @@ struct glyf struct CompositeGlyphHeader { - static const uint16_t ARG_1_AND_2_ARE_WORDS = 0x0001; - static const uint16_t ARGS_ARE_XY_VALUES = 0x0002; - static const uint16_t ROUND_XY_TO_GRID = 0x0004; - static const uint16_t WE_HAVE_A_SCALE = 0x0008; - static const uint16_t MORE_COMPONENTS = 0x0020; - static const uint16_t WE_HAVE_AN_X_AND_Y_SCALE = 0x0040; - static const uint16_t WE_HAVE_A_TWO_BY_TWO = 0x0080; - static const uint16_t WE_HAVE_INSTRUCTIONS = 0x0100; - static const uint16_t USE_MY_METRICS = 0x0200; - static const uint16_t OVERLAP_COMPOUND = 0x0400; - static const uint16_t SCALED_COMPONENT_OFFSET = 0x0800; - static const uint16_t UNSCALED_COMPONENT_OFFSET = 0x1000; + enum composite_glyph_flag_t { + ARG_1_AND_2_ARE_WORDS = 0x0001, + ARGS_ARE_XY_VALUES = 0x0002, + ROUND_XY_TO_GRID = 0x0004, + WE_HAVE_A_SCALE = 0x0008, + MORE_COMPONENTS = 0x0020, + WE_HAVE_AN_X_AND_Y_SCALE = 0x0040, + WE_HAVE_A_TWO_BY_TWO = 0x0080, + WE_HAVE_INSTRUCTIONS = 0x0100, + USE_MY_METRICS = 0x0200, + OVERLAP_COMPOUND = 0x0400, + SCALED_COMPONENT_OFFSET = 0x0800, + UNSCALED_COMPONENT_OFFSET = 0x1000 + }; HBUINT16 flags; HBUINT16 glyphIndex; @@ -280,16 +282,18 @@ struct glyf composite); } + enum simple_glyph_flag_t { + FLAG_X_SHORT = 0x02, + FLAG_Y_SHORT = 0x04, + FLAG_REPEAT = 0x08, + FLAG_X_SAME = 0x10, + FLAG_Y_SAME = 0x20 + }; + /* based on FontTools _g_l_y_f.py::trim */ inline bool remove_padding(unsigned int start_offset, unsigned int *end_offset) const { - static const int FLAG_X_SHORT = 0x02; - static const int FLAG_Y_SHORT = 0x04; - static const int FLAG_REPEAT = 0x08; - static const int FLAG_X_SAME = 0x10; - static const int FLAG_Y_SAME = 0x20; - if (*end_offset - start_offset < GlyphHeader::static_size) return true; diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 368f547a..4d379eaa 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -205,7 +205,7 @@ struct KernSubTableWrapper { TRACE_SANITIZE (this); return_trace (c->check_struct (thiz()) && - thiz()->length >= thiz()->min_size && + thiz()->length >= T::min_size && c->check_array (thiz(), 1, thiz()->length) && thiz()->subtable.sanitize (c, thiz()->format)); } commit 7919033ce8f6fd32b2dd980ad0aa59c7149a4827 Author: Ebrahim Byagowi <[email protected]> Date: Thu Mar 22 16:04:38 2018 +0430 [dwrite] Replace rest of 'malloc/free's with 'new/delete' (#897) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 0d3b1c2e..f1277277 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -32,8 +32,19 @@ #include "hb-directwrite.h" -HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, face) -HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, font) +HB_SHAPER_DATA_ENSURE_DEFINE (directwrite, face) +HB_SHAPER_DATA_ENSURE_DEFINE (directwrite, font) + + +/* + * hb-directwrite uses new/delete syntatically but as we let users + * to override malloc/free, we will redefine new/delete so users + * won't need to do that by their own. + */ +void* operator new (size_t size) { return malloc (size); } +void* operator new [] (size_t size) { return malloc (size); } +void operator delete (void* pointer) { free (pointer); } +void operator delete [] (void* pointer) { free (pointer); } /* @@ -54,12 +65,12 @@ public: } // IUnknown interface - IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; } - IFACEMETHOD_(ULONG, AddRef)() { return 1; } - IFACEMETHOD_(ULONG, Release)() { return 1; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } + IFACEMETHOD_ (ULONG, AddRef) () { return 1; } + IFACEMETHOD_ (ULONG, Release) () { return 1; } // IDWriteFontFileLoader methods - virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, + virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey (void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream) { @@ -81,12 +92,12 @@ public: } // IUnknown interface - IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; } - IFACEMETHOD_(ULONG, AddRef)() { return 1; } - IFACEMETHOD_(ULONG, Release)() { return 1; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } + IFACEMETHOD_ (ULONG, AddRef) () { return 1; } + IFACEMETHOD_ (ULONG, Release) () { return 1; } // IDWriteFontFileStream methods - virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, + virtual HRESULT STDMETHODCALLTYPE ReadFileFragment (void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext) @@ -105,15 +116,15 @@ public: return S_OK; } - virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext) { } + virtual void STDMETHODCALLTYPE ReleaseFileFragment (void* fragmentContext) { } - virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize) + virtual HRESULT STDMETHODCALLTYPE GetFileSize (OUT UINT64* fileSize) { *fileSize = mSize; return S_OK; } - virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime) + virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime (OUT UINT64* lastWriteTime) { return E_NOTIMPL; } @@ -134,10 +145,9 @@ struct hb_directwrite_shaper_face_data_t { }; hb_directwrite_shaper_face_data_t * -_hb_directwrite_shaper_face_data_create(hb_face_t *face) +_hb_directwrite_shaper_face_data_create (hb_face_t *face) { - hb_directwrite_shaper_face_data_t *data = - (hb_directwrite_shaper_face_data_t *) malloc (sizeof (hb_directwrite_shaper_face_data_t)); + hb_directwrite_shaper_face_data_t *data = new hb_directwrite_shaper_face_data_t; if (unlikely (!data)) return nullptr; @@ -201,7 +211,7 @@ _hb_directwrite_shaper_face_data_create(hb_face_t *face) } void -_hb_directwrite_shaper_face_data_destroy(hb_directwrite_shaper_face_data_t *data) +_hb_directwrite_shaper_face_data_destroy (hb_directwrite_shaper_face_data_t *data) { if (data->fontFace) data->fontFace->Release (); @@ -219,7 +229,7 @@ _hb_directwrite_shaper_face_data_destroy(hb_directwrite_shaper_face_data_t *data if (data->faceBlob) hb_blob_destroy (data->faceBlob); if (data) - free (data); + delete data; } @@ -235,8 +245,7 @@ _hb_directwrite_shaper_font_data_create (hb_font_t *font) { if (unlikely (!hb_directwrite_shaper_face_data_ensure (font->face))) return nullptr; - hb_directwrite_shaper_font_data_t *data = - (hb_directwrite_shaper_font_data_t *) malloc (sizeof (hb_directwrite_shaper_font_data_t)); + hb_directwrite_shaper_font_data_t *data = new hb_directwrite_shaper_font_data_t; if (unlikely (!data)) return nullptr; @@ -246,7 +255,7 @@ _hb_directwrite_shaper_font_data_create (hb_font_t *font) void _hb_directwrite_shaper_font_data_destroy (hb_directwrite_shaper_font_data_t *data) { - free (data); + delete data; } @@ -278,9 +287,9 @@ class TextAnalysis { public: - IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; } - IFACEMETHOD_(ULONG, AddRef)() { return 1; } - IFACEMETHOD_(ULONG, Release)() { return 1; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } + IFACEMETHOD_ (ULONG, AddRef) () { return 1; } + IFACEMETHOD_ (ULONG, Release) () { return 1; } // A single contiguous run of characters containing the same analysis // results. @@ -295,7 +304,7 @@ public: uint8_t mBidiLevel; bool mIsSideways; - inline bool ContainsTextPosition(uint32_t aTextPosition) const + inline bool ContainsTextPosition (uint32_t aTextPosition) const { return aTextPosition >= mTextStart && aTextPosition < mTextStart + mTextLength; @@ -305,26 +314,26 @@ public: }; public: - TextAnalysis(const wchar_t* text, + TextAnalysis (const wchar_t* text, uint32_t textLength, const wchar_t* localeName, DWRITE_READING_DIRECTION readingDirection) - : mText(text) - , mTextLength(textLength) - , mLocaleName(localeName) - , mReadingDirection(readingDirection) - , mCurrentRun(nullptr) { }; + : mText (text) + , mTextLength (textLength) + , mLocaleName (localeName) + , mReadingDirection (readingDirection) + , mCurrentRun (nullptr) { }; - ~TextAnalysis() { + ~TextAnalysis () { // delete runs, except mRunHead which is part of the TextAnalysis object for (Run *run = mRunHead.nextRun; run;) { Run *origRun = run; run = run->nextRun; - free (origRun); + delete origRun; } } - STDMETHODIMP GenerateResults(IDWriteTextAnalyzer* textAnalyzer, + STDMETHODIMP GenerateResults (IDWriteTextAnalyzer* textAnalyzer, Run **runHead) { // Analyzes the text using the script analyzer and returns // the result as a series of runs. @@ -350,7 +359,7 @@ public: // IDWriteTextAnalysisSource implementation - IFACEMETHODIMP GetTextAtPosition(uint32_t textPosition, + IFACEMETHODIMP GetTextAtPosition (uint32_t textPosition, OUT wchar_t const** textString, OUT uint32_t* textLength) { @@ -366,7 +375,7 @@ public: return S_OK; } - IFACEMETHODIMP GetTextBeforePosition(uint32_t textPosition, + IFACEMETHODIMP GetTextBeforePosition (uint32_t textPosition, OUT wchar_t const** textString, OUT uint32_t* textLength) { @@ -383,10 +392,10 @@ public: return S_OK; } - IFACEMETHODIMP_(DWRITE_READING_DIRECTION) - GetParagraphReadingDirection() { return mReadingDirection; } + IFACEMETHODIMP_ (DWRITE_READING_DIRECTION) + GetParagraphReadingDirection () { return mReadingDirection; } - IFACEMETHODIMP GetLocaleName(uint32_t textPosition, + IFACEMETHODIMP GetLocaleName (uint32_t textPosition, uint32_t* textLength, wchar_t const** localeName) { @@ -394,7 +403,7 @@ public: } IFACEMETHODIMP - GetNumberSubstitution(uint32_t textPosition, + GetNumberSubstitution (uint32_t textPosition, OUT uint32_t* textLength, OUT IDWriteNumberSubstitution** numberSubstitution) { @@ -408,15 +417,15 @@ public: // IDWriteTextAnalysisSink implementation IFACEMETHODIMP - SetScriptAnalysis(uint32_t textPosition, + SetScriptAnalysis (uint32_t textPosition, uint32_t textLength, DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis) { - SetCurrentRun(textPosition); - SplitCurrentRun(textPosition); + SetCurrentRun (textPosition); + SplitCurrentRun (textPosition); while (textLength > 0) { - Run *run = FetchNextRun(&textLength); + Run *run = FetchNextRun (&textLength); run->mScript = *scriptAnalysis; } @@ -424,22 +433,22 @@ public: } IFACEMETHODIMP - SetLineBreakpoints(uint32_t textPosition, + SetLineBreakpoints (uint32_t textPosition, uint32_t textLength, const DWRITE_LINE_BREAKPOINT* lineBreakpoints) { return S_OK; } - IFACEMETHODIMP SetBidiLevel(uint32_t textPosition, + IFACEMETHODIMP SetBidiLevel (uint32_t textPosition, uint32_t textLength, uint8_t explicitLevel, uint8_t resolvedLevel) { return S_OK; } IFACEMETHODIMP - SetNumberSubstitution(uint32_t textPosition, + SetNumberSubstitution (uint32_t textPosition, uint32_t textLength, IDWriteNumberSubstitution* numberSubstitution) { return S_OK; } protected: - Run *FetchNextRun(IN OUT uint32_t* textLength) + Run *FetchNextRun (IN OUT uint32_t* textLength) { // Used by the sink setters, this returns a reference to the next run. // Position and length are adjusted to now point after the current run @@ -463,7 +472,7 @@ protected: return origRun; } - void SetCurrentRun(uint32_t textPosition) + void SetCurrentRun (uint32_t textPosition) { // Move the current run to the given position. // Since the analyzers generally return results in a forward manner, @@ -482,15 +491,15 @@ protected: return; } } - //NS_NOTREACHED("We should always be able to find the text position in one \ + //NS_NOTREACHED ("We should always be able to find the text position in one \ // of our runs"); } - void SplitCurrentRun(uint32_t splitPosition) + void SplitCurrentRun (uint32_t splitPosition) { if (!mCurrentRun) { - //NS_ASSERTION(false, "SplitCurrentRun called without current run."); + //NS_ASSERTION (false, "SplitCurrentRun called without current run."); // Shouldn't be calling this when no current run is set! return; } @@ -501,7 +510,7 @@ protected: // or before it. Usually the first. return; } - Run *newRun = (Run*) malloc (sizeof (Run)); + Run *newRun = new Run; *newRun = *mCurrentRun; @@ -536,14 +545,14 @@ protected: static inline uint16_t hb_uint16_swap (const uint16_t v) { return (v >> 8) | (v << 8); } static inline uint32_t hb_uint32_swap (const uint32_t v) -{ return (hb_uint16_swap(v) << 16) | hb_uint16_swap(v >> 16); } +{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); } /* * shaper */ static hb_bool_t -_hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, +_hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, @@ -557,7 +566,7 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, IDWriteFontFace *fontFace = face_data->fontFace; IDWriteTextAnalyzer* analyzer; - dwriteFactory->CreateTextAnalyzer(&analyzer); + dwriteFactory->CreateTextAnalyzer (&analyzer); unsigned int scratch_size; hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size); @@ -572,16 +581,16 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, #define utf16_index() var1.u32 - ALLOCATE_ARRAY(wchar_t, textString, buffer->len * 2); + ALLOCATE_ARRAY (wchar_t, textString, buffer->len * 2); unsigned int chars_len = 0; for (unsigned int i = 0; i < buffer->len; i++) { hb_codepoint_t c = buffer->info[i].codepoint; - buffer->info[i].utf16_index() = chars_len; - if (likely(c <= 0xFFFFu)) + buffer->info[i].utf16_index () = chars_len; + if (likely (c <= 0xFFFFu)) textString[chars_len++] = c; - else if (unlikely(c > 0x10FFFFu)) + else if (unlikely (c > 0x10FFFFu)) textString[chars_len++] = 0xFFFDu; else { textString[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10); @@ -589,7 +598,7 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, } } - ALLOCATE_ARRAY(WORD, log_clusters, chars_len); + ALLOCATE_ARRAY (WORD, log_clusters, chars_len); // if (num_features) { /* Need log_clusters to assign features. */ @@ -599,7 +608,7 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, hb_codepoint_t c = buffer->info[i].codepoint; unsigned int cluster = buffer->info[i].cluster; log_clusters[chars_len++] = cluster; - if (hb_in_range(c, 0x10000u, 0x10FFFFu)) + if (hb_in_range (c, 0x10000u, 0x10FFFFu)) log_clusters[chars_len++] = cluster; /* Surrogates. */ } } @@ -617,10 +626,10 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, */ uint32_t textLength = buffer->len; - TextAnalysis analysis(textString, textLength, nullptr, readingDirection); + TextAnalysis analysis (textString, textLength, nullptr, readingDirection); TextAnalysis::Run *runHead; HRESULT hr; - hr = analysis.GenerateResults(analyzer, &runHead); + hr = analysis.GenerateResults (analyzer, &runHead); #define FAIL(...) \ HB_STMT_START { \ @@ -649,27 +658,25 @@ _hb_directwrite_shape_full(hb_shape_plan_t *shape_plan, singleFeatures.featureCount = num_features; if (num_features) { - DWRITE_FONT_FEATURE* dwfeatureArray = (DWRITE_FONT_FEATURE*) - malloc (sizeof (DWRITE_FONT_FEATURE) * num_features); + singleFeatures.features = new DWRITE_FONT_FEATURE[num_features]; for (unsigned int i = 0; i < num_features; ++i) { - dwfeatureArray[i].nameTag = (DWRITE_FONT_FEATURE_TAG) + singleFeatures.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG) hb_uint32_swap (features[i].tag); - dwfeatureArray[i].parameter = features[i].value; + singleFeatures.features[i].parameter = features[i].value; } - singleFeatures.features = dwfeatureArray; } const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures = (const DWRITE_TYPOGRAPHIC_FEATURES*) &singleFeatures; const uint32_t featureRangeLengths[] = { textLength }; - uint16_t* clusterMap = (uint16_t*) malloc (textLength * sizeof (uint16_t)); - DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = (DWRITE_SHAPING_TEXT_PROPERTIES*) - malloc (textLength * sizeof (DWRITE_SHAPING_TEXT_PROPERTIES)); + uint16_t* clusterMap = new uint16_t[textLength]; + DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = + new DWRITE_SHAPING_TEXT_PROPERTIES[textLength]; retry_getglyphs: - uint16_t* glyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t)); - DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties = (DWRITE_SHAPING_GLYPH_PROPERTIES*) - malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES)); + uint16_t* glyphIndices = new uint16_t[maxGlyphCount]; + DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties = + new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount]; hr = analyzer->GetGlyphs (textString, textLength, fontFace, false, isRightToLeft, &runHead->mScript, localeName, nullptr, &dwFeatures, @@ -678,8 +685,8 @@ retry_getglyphs: if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))) { - free (glyphIndices); - free (glyphProperties); + delete [] glyphIndices; + delete [] glyphProperties; maxGlyphCount *= 2; @@ -691,23 +698,22 @@ retry_getglyphs: return false; } - float* glyphAdvances = (float*) malloc (maxGlyphCount * sizeof (float)); - DWRITE_GLYPH_OFFSET* glyphOffsets = (DWRITE_GLYPH_OFFSET*) - malloc(maxGlyphCount * sizeof (DWRITE_GLYPH_OFFSET)); + float* glyphAdvances = new float[maxGlyphCount]; + DWRITE_GLYPH_OFFSET* glyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount]; /* The -2 in the following is to compensate for possible - * alignment needed after the WORD array. sizeof(WORD) == 2. */ - unsigned int glyphs_size = (scratch_size * sizeof(int) - 2) - / (sizeof(WORD) + - sizeof(DWRITE_SHAPING_GLYPH_PROPERTIES) + - sizeof(int) + - sizeof(DWRITE_GLYPH_OFFSET) + - sizeof(uint32_t)); + * alignment needed after the WORD array. sizeof (WORD) == 2. */ + unsigned int glyphs_size = (scratch_size * sizeof (int) - 2) + / (sizeof (WORD) + + sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) + + sizeof (int) + + sizeof (DWRITE_GLYPH_OFFSET) + + sizeof (uint32_t)); ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size); #undef ALLOCATE_ARRAY - int fontEmSize = font->face->get_upem(); + int fontEmSize = font->face->get_upem (); if (fontEmSize < 0) fontEmSize = -fontEmSize; @@ -736,8 +742,7 @@ retry_getglyphs: { DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities = - (DWRITE_JUSTIFICATION_OPPORTUNITY*) - malloc (maxGlyphCount * sizeof (DWRITE_JUSTIFICATION_OPPORTUNITY)); + new DWRITE_JUSTIFICATION_OPPORTUNITY[maxGlyphCount]; hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, runHead->mScript, textLength, glyphCount, textString, clusterMap, glyphProperties, justificationOpportunities); @@ -748,16 +753,14 @@ retry_getglyphs: return false; } - float* justifiedGlyphAdvances = - (float*) malloc (maxGlyphCount * sizeof (float)); - DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*) - malloc (glyphCount * sizeof (DWRITE_GLYPH_OFFSET)); + float* justifiedGlyphAdvances = new float[maxGlyphCount]; + DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[glyphCount]; hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities, glyphAdvances, glyphOffsets, justifiedGlyphAdvances, justifiedGlyphOffsets); if (FAILED (hr)) { - FAIL("Analyzer failed to get justified glyph advances."); + FAIL ("Analyzer failed to get justified glyph advances."); return false; } @@ -765,7 +768,7 @@ retry_getglyphs: hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties); if (FAILED (hr)) { - FAIL("Analyzer failed to get script properties."); + FAIL ("Analyzer failed to get script properties."); return false; } uint32_t justificationCharacter = scriptProperties.justificationCharacter; @@ -773,12 +776,12 @@ retry_getglyphs: // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs if (justificationCharacter != 32) { - uint16_t* modifiedClusterMap = (uint16_t*) malloc (textLength * sizeof (uint16_t)); + uint16_t* modifiedClusterMap = new uint16_t[textLength]; retry_getjustifiedglyphs: - uint16_t* modifiedGlyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t)); - float* modifiedGlyphAdvances = (float*) malloc (maxGlyphCount * sizeof (float)); - DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*) - malloc (maxGlyphCount * sizeof (DWRITE_GLYPH_OFFSET)); + uint16_t* modifiedGlyphIndices = new uint16_t[maxGlyphCount]; + float* modifiedGlyphAdvances = new float[maxGlyphCount]; + DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = + new DWRITE_GLYPH_OFFSET[maxGlyphCount]; uint32_t actualGlyphsCount; hr = analyzer1->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript, textLength, glyphCount, maxGlyphCount, clusterMap, glyphIndices, @@ -789,9 +792,9 @@ retry_getglyphs: if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)) { maxGlyphCount = actualGlyphsCount; - free (modifiedGlyphIndices); - free (modifiedGlyphAdvances); - free (modifiedGlyphOffsets); + delete [] modifiedGlyphIndices; + delete [] modifiedGlyphAdvances; + delete [] modifiedGlyphOffsets; maxGlyphCount = actualGlyphsCount; @@ -803,10 +806,10 @@ retry_getglyphs: return false; } - free (clusterMap); - free (glyphIndices); - free (glyphAdvances); - free (glyphOffsets); + delete [] clusterMap; + delete [] glyphIndices; + delete [] glyphAdvances; + delete [] glyphOffsets; glyphCount = actualGlyphsCount; clusterMap = modifiedClusterMap; @@ -814,19 +817,19 @@ retry_getglyphs: glyphAdvances = modifiedGlyphAdvances; glyphOffsets = modifiedGlyphOffsets; - free (justifiedGlyphAdvances); - free (justifiedGlyphOffsets); + delete [] justifiedGlyphAdvances; + delete [] justifiedGlyphOffsets; } else { - free (glyphAdvances); - free (glyphOffsets); + delete [] glyphAdvances; + delete [] glyphOffsets; glyphAdvances = justifiedGlyphAdvances; glyphOffsets = justifiedGlyphOffsets; } - free (justificationOpportunities); + delete [] justificationOpportunities; } @@ -839,7 +842,7 @@ retry_getglyphs: for (unsigned int i = 0; i < buffer->len; i++) { uint32_t *p = - &vis_clusters[log_clusters[buffer->info[i].utf16_index()]]; + &vis_clusters[log_clusters[buffer->info[i].utf16_index ()]]; *p = MIN (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphCount; i++) @@ -885,28 +888,28 @@ retry_getglyphs: if (isRightToLeft) hb_buffer_reverse (buffer); - free (clusterMap); - free (glyphIndices); - free (textProperties); - free (glyphProperties); - free (glyphAdvances); - free (glyphOffsets); + delete [] clusterMap; + delete [] glyphIndices; + delete [] textProperties; + delete [] glyphProperties; + delete [] glyphAdvances; + delete [] glyphOffsets; if (num_features) - free (singleFeatures.features); + delete [] singleFeatures.features; /* Wow, done! */ return true; } hb_bool_t -_hb_directwrite_shape(hb_shape_plan_t *shape_plan, +_hb_directwrite_shape (hb_shape_plan_t *shape_plan, hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features) { - return _hb_directwrite_shape_full(shape_plan, font, buffer, + return _hb_directwrite_shape_full (shape_plan, font, buffer, features, num_features, 0); } @@ -915,7 +918,7 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan, */ hb_bool_t -hb_directwrite_shape_experimental_width(hb_font_t *font, +hb_directwrite_shape_experimental_width (hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features, _______________________________________________ HarfBuzz mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/harfbuzz
