77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
#include "CharWidth.h"
|
|
|
|
CharWidth::CharWidth(QFont font) {
|
|
fm = new QFontMetrics(font);
|
|
}
|
|
|
|
CharWidth::~CharWidth() {
|
|
delete fm;
|
|
}
|
|
|
|
void CharWidth::setFont(QFont font) {
|
|
delete fm;
|
|
fm = new QFontMetrics(font);
|
|
}
|
|
|
|
int CharWidth::font_width(wchar_t ucs) {
|
|
uint64_t ucode = ucs;
|
|
if(ucode <= 0xffff)
|
|
return fm->horizontalAdvance(QString(QChar(ucs)),1)/fm->horizontalAdvance("0",1);
|
|
else
|
|
return unicode_width(ucs);
|
|
}
|
|
|
|
int CharWidth::font_width(const QChar & c) {
|
|
return fm->horizontalAdvance(c,1)/fm->horizontalAdvance("0",1);
|
|
}
|
|
|
|
int CharWidth::string_font_width( const std::wstring & wstr ) {
|
|
int width = 0;
|
|
for (auto & c : wstr) {
|
|
width += font_width(c);
|
|
}
|
|
return width;
|
|
}
|
|
|
|
int CharWidth::string_font_width( const QString & str ) {
|
|
int width = 0;
|
|
for (auto & c : str) {
|
|
width += font_width(c.unicode());
|
|
}
|
|
return width;
|
|
}
|
|
|
|
int CharWidth::unicode_width(wchar_t ucs, bool fix_width) {
|
|
utf8proc_category_t cat = utf8proc_category( ucs );
|
|
if (cat == UTF8PROC_CATEGORY_CO) {
|
|
return 1;
|
|
}
|
|
if(fix_width) {
|
|
if(ucs >= 0x4dc0 && ucs <= 0x4dff) {
|
|
return 2;
|
|
}
|
|
}
|
|
return utf8proc_charwidth( ucs );
|
|
}
|
|
|
|
int CharWidth::unicode_width(const QChar & c, bool fix_width) {
|
|
return unicode_width(c.unicode(),fix_width);
|
|
}
|
|
|
|
int CharWidth::string_unicode_width(const std::wstring & wstr, bool fix_width) {
|
|
int width = 0;
|
|
for (auto & c : wstr) {
|
|
width += unicode_width(c,fix_width);
|
|
}
|
|
return width;
|
|
}
|
|
|
|
int CharWidth::string_unicode_width(const QString & str, bool fix_width) {
|
|
int width = 0;
|
|
for (auto & c : str) {
|
|
width += unicode_width(c.unicode(),fix_width);
|
|
}
|
|
return width;
|
|
}
|
|
|