summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorKhaled Hosny <khaled@aliftype.com>2022-09-08 17:13:25 +0200
committerخالد حسني <khaled@aliftype.com>2022-09-10 07:54:29 +0200
commitf4bd06f9928fc01762f9e52c5bebcb3137b39665 (patch)
tree6bac7330cfd12a672a7b13231a99f891131d2a39 /vcl
parent235b30bdfa76b5c0514c7dfe2a0d13ab8ecf5be2 (diff)
vcl: Use vector instead of array for FontCharMap ranges
Change-Id: I8846c89d51cc33022f90c3a9c03bc1560497e651 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139701 Tested-by: Jenkins Reviewed-by: خالد حسني <khaled@aliftype.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/impfontcharmap.hxx7
-rw-r--r--vcl/source/font/PhysicalFontFace.cxx14
-rw-r--r--vcl/source/font/fontcharmap.cxx82
3 files changed, 42 insertions, 61 deletions
diff --git a/vcl/inc/impfontcharmap.hxx b/vcl/inc/impfontcharmap.hxx
index 1334dc76b262..552cb736020f 100644
--- a/vcl/inc/impfontcharmap.hxx
+++ b/vcl/inc/impfontcharmap.hxx
@@ -22,6 +22,7 @@
#include <tools/ref.hxx>
#include <vcl/dllapi.h>
+#include <vector>
class ImplFontCharMap;
typedef tools::SvRef<ImplFontCharMap> ImplFontCharMapRef;
@@ -30,8 +31,7 @@ class ImplFontCharMap final : public SvRefBase
{
public:
explicit ImplFontCharMap( bool bSymbolic,
- const sal_uInt32* pRangeCodes,
- int nRangeCount);
+ std::vector<sal_uInt32> aRangeCodes);
virtual ~ImplFontCharMap() override;
private:
@@ -44,8 +44,7 @@ private:
bool isDefaultMap() const;
private:
- const sal_uInt32* mpRangeCodes; // pairs of StartCode/(EndCode+1)
- int mnRangeCount;
+ std::vector<sal_uInt32> maRangeCodes; // pairs of StartCode/(EndCode+1)
int mnCharCount; // covered codepoints
const bool m_bSymbolic;
};
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index e3a4638b3139..88670f6e0ff6 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -249,21 +249,15 @@ FontCharMapRef PhysicalFontFace::GetFontCharMap() const
if (hb_set_get_population(pUnicodes))
{
// Convert HarfBuzz set to code ranges.
- int nRangeCount = 0;
+ std::vector<sal_UCS4> aRangeCodes;
hb_codepoint_t nFirst, nLast = HB_SET_VALUE_INVALID;
while (hb_set_next_range(pUnicodes, &nFirst, &nLast))
- nRangeCount++;
-
- nLast = HB_SET_VALUE_INVALID;
- auto* pRangeCodes(new sal_UCS4[nRangeCount * 2]);
- auto* pCP = pRangeCodes;
- while (hb_set_next_range(pUnicodes, &nFirst, &nLast))
{
- *(pCP++) = nFirst;
- *(pCP++) = nLast + 1;
+ aRangeCodes.push_back(nFirst);
+ aRangeCodes.push_back(nLast + 1);
}
- mxCharMap = new FontCharMap(bSymbol, pRangeCodes, nRangeCount);
+ mxCharMap = new FontCharMap(bSymbol, std::move(aRangeCodes));
}
hb_set_destroy(pUnicodes);
diff --git a/vcl/source/font/fontcharmap.cxx b/vcl/source/font/fontcharmap.cxx
index 70fb51375580..0a7148a663c0 100644
--- a/vcl/source/font/fontcharmap.cxx
+++ b/vcl/source/font/fontcharmap.cxx
@@ -24,50 +24,36 @@
#include <vector>
static ImplFontCharMapRef g_pDefaultImplFontCharMap;
-const sal_UCS4 aDefaultUnicodeRanges[] = {0x0020,0xD800, 0xE000,0xFFF0};
-const sal_UCS4 aDefaultSymbolRanges[] = {0x0020,0x0100, 0xF020,0xF100};
+const std::vector<sal_uInt32> aDefaultUnicodeRanges = { 0x0020, 0xD800, 0xE000, 0xFFF0 };
+const std::vector<sal_uInt32> aDefaultSymbolRanges = { 0x0020, 0x0100, 0xF020, 0xF100 };
ImplFontCharMap::~ImplFontCharMap()
{
- if( !isDefaultMap() )
- {
- delete[] mpRangeCodes;
- }
}
-ImplFontCharMap::ImplFontCharMap(bool bSymbolic, const sal_UCS4* pRangeCodes, int nRangeCount)
-: mpRangeCodes(pRangeCodes)
-, mnRangeCount(nRangeCount)
+ImplFontCharMap::ImplFontCharMap(bool bSymbolic, std::vector<sal_uInt32> aRangeCodes)
+: maRangeCodes(std::move(aRangeCodes))
, mnCharCount( 0 )
, m_bSymbolic(bSymbolic)
{
- const sal_UCS4* pRangePtr = mpRangeCodes;
- for( int i = mnRangeCount; --i >= 0; pRangePtr += 2 )
+ for (size_t i = 0; i < maRangeCodes.size(); i += 2)
{
- sal_UCS4 cFirst = pRangePtr[0];
- sal_UCS4 cLast = pRangePtr[1];
+ sal_UCS4 cFirst = maRangeCodes[i];
+ sal_UCS4 cLast = maRangeCodes[i + 1];
mnCharCount += cLast - cFirst;
}
}
ImplFontCharMapRef const & ImplFontCharMap::getDefaultMap( bool bSymbols )
{
- const sal_UCS4* pRangeCodes = aDefaultUnicodeRanges;
- int nCodesCount = std::size(aDefaultUnicodeRanges);
- if( bSymbols )
- {
- pRangeCodes = aDefaultSymbolRanges;
- nCodesCount = std::size(aDefaultSymbolRanges);
- }
-
- g_pDefaultImplFontCharMap = ImplFontCharMapRef(new ImplFontCharMap(bSymbols, pRangeCodes, nCodesCount/2));
-
+ const auto& rRanges = bSymbols ? aDefaultSymbolRanges : aDefaultUnicodeRanges;
+ g_pDefaultImplFontCharMap = ImplFontCharMapRef(new ImplFontCharMap(bSymbols, rRanges));
return g_pDefaultImplFontCharMap;
}
bool ImplFontCharMap::isDefaultMap() const
{
- const bool bIsDefault = (mpRangeCodes == aDefaultUnicodeRanges) || (mpRangeCodes == aDefaultSymbolRanges);
+ const bool bIsDefault = (maRangeCodes == aDefaultUnicodeRanges) || (maRangeCodes == aDefaultSymbolRanges);
return bIsDefault;
}
@@ -107,8 +93,8 @@ FontCharMap::FontCharMap( ImplFontCharMapRef pIFCMap )
{
}
-FontCharMap::FontCharMap(bool bSymbolic, const sal_UCS4* pRangeCodes, int nRangeCount)
- : mpImplFontCharMap(new ImplFontCharMap(bSymbolic, pRangeCodes, nRangeCount))
+FontCharMap::FontCharMap(bool bSymbolic, std::vector<sal_uInt32> aRangeCodes)
+ : mpImplFontCharMap(new ImplFontCharMap(bSymbolic, std::move(aRangeCodes)))
{
}
@@ -137,25 +123,26 @@ int FontCharMap::GetCharCount() const
int FontCharMap::CountCharsInRange( sal_UCS4 cMin, sal_UCS4 cMax ) const
{
+ const auto& rRanges = mpImplFontCharMap->maRangeCodes;
int nCount = 0;
// find and adjust range and char count for cMin
int nRangeMin = findRangeIndex( cMin );
if( nRangeMin & 1 )
++nRangeMin;
- else if( cMin > mpImplFontCharMap->mpRangeCodes[ nRangeMin ] )
- nCount -= cMin - mpImplFontCharMap->mpRangeCodes[ nRangeMin ];
+ else if (cMin > rRanges[nRangeMin])
+ nCount -= cMin - rRanges[nRangeMin];
// find and adjust range and char count for cMax
int nRangeMax = findRangeIndex( cMax );
if( nRangeMax & 1 )
--nRangeMax;
else
- nCount -= mpImplFontCharMap->mpRangeCodes[ nRangeMax+1 ] - cMax - 1;
+ nCount -= rRanges[nRangeMax + 1] - cMax - 1;
// count chars in complete ranges between cMin and cMax
for( int i = nRangeMin; i <= nRangeMax; i+=2 )
- nCount += mpImplFontCharMap->mpRangeCodes[i+1] - mpImplFontCharMap->mpRangeCodes[i];
+ nCount += rRanges[i + 1] - rRanges[i];
return nCount;
}
@@ -163,19 +150,19 @@ int FontCharMap::CountCharsInRange( sal_UCS4 cMin, sal_UCS4 cMax ) const
bool FontCharMap::HasChar( sal_UCS4 cChar ) const
{
const int nRange = findRangeIndex( cChar );
- if( nRange==0 && cChar < mpImplFontCharMap->mpRangeCodes[0] )
+ if (nRange==0 && cChar < mpImplFontCharMap->maRangeCodes[0])
return false;
return ((nRange & 1) == 0); // inside a range
}
sal_UCS4 FontCharMap::GetFirstChar() const
{
- return mpImplFontCharMap->mpRangeCodes[0];
+ return mpImplFontCharMap->maRangeCodes.front();
}
sal_UCS4 FontCharMap::GetLastChar() const
{
- return (mpImplFontCharMap->mpRangeCodes[ 2*mpImplFontCharMap->mnRangeCount-1 ] - 1);
+ return mpImplFontCharMap->maRangeCodes.back() - 1;
}
sal_UCS4 FontCharMap::GetNextChar( sal_UCS4 cChar ) const
@@ -187,7 +174,7 @@ sal_UCS4 FontCharMap::GetNextChar( sal_UCS4 cChar ) const
int nRange = findRangeIndex( cChar + 1 );
if( nRange & 1 ) // outside of range?
- return mpImplFontCharMap->mpRangeCodes[ nRange + 1 ]; // => first in next range
+ return mpImplFontCharMap->maRangeCodes[nRange + 1]; // => first in next range
return (cChar + 1);
}
@@ -200,7 +187,7 @@ sal_UCS4 FontCharMap::GetPrevChar( sal_UCS4 cChar ) const
int nRange = findRangeIndex( cChar - 1 );
if( nRange & 1 ) // outside a range?
- return (mpImplFontCharMap->mpRangeCodes[ nRange ] - 1); // => last in prev range
+ return mpImplFontCharMap->maRangeCodes[nRange] - 1; // => last in prev range
return (cChar - 1);
}
@@ -208,11 +195,11 @@ int FontCharMap::GetIndexFromChar( sal_UCS4 cChar ) const
{
// TODO: improve linear walk?
int nCharIndex = 0;
- const sal_UCS4* pRange = &mpImplFontCharMap->mpRangeCodes[0];
- for( int i = 0; i < mpImplFontCharMap->mnRangeCount; ++i )
+ const auto& rRanges = mpImplFontCharMap->maRangeCodes;
+ for (size_t i = 0; i < rRanges.size(); i += 2)
{
- sal_UCS4 cFirst = *(pRange++);
- sal_UCS4 cLast = *(pRange++);
+ sal_UCS4 cFirst = rRanges[i];
+ sal_UCS4 cLast = rRanges[i + 1];
if( cChar >= cLast )
nCharIndex += cLast - cFirst;
else if( cChar >= cFirst )
@@ -227,28 +214,29 @@ int FontCharMap::GetIndexFromChar( sal_UCS4 cChar ) const
sal_UCS4 FontCharMap::GetCharFromIndex( int nIndex ) const
{
// TODO: improve linear walk?
- const sal_UCS4* pRange = &mpImplFontCharMap->mpRangeCodes[0];
- for( int i = 0; i < mpImplFontCharMap->mnRangeCount; ++i )
+ const auto& rRanges = mpImplFontCharMap->maRangeCodes;
+ for (size_t i = 0; i < rRanges.size(); i += 2)
{
- sal_UCS4 cFirst = *(pRange++);
- sal_UCS4 cLast = *(pRange++);
+ sal_UCS4 cFirst = rRanges[i];
+ sal_UCS4 cLast = rRanges[i + 1];
nIndex -= cLast - cFirst;
if( nIndex < 0 )
return (cLast + nIndex);
}
// we can only get here with an out-of-bounds charindex
- return mpImplFontCharMap->mpRangeCodes[0];
+ return mpImplFontCharMap->maRangeCodes.front();
}
int FontCharMap::findRangeIndex( sal_UCS4 cChar ) const
{
+ const auto& rRanges = mpImplFontCharMap->maRangeCodes;
int nLower = 0;
- int nMid = mpImplFontCharMap->mnRangeCount;
- int nUpper = 2 * mpImplFontCharMap->mnRangeCount - 1;
+ int nMid = rRanges.size() / 2;
+ int nUpper = rRanges.size() - 1;
while( nLower < nUpper )
{
- if( cChar >= mpImplFontCharMap->mpRangeCodes[ nMid ] )
+ if (cChar >= rRanges[nMid])
nLower = nMid;
else
nUpper = nMid - 1;