Kaydet (Commit) 80e9f9f8 authored tarafından Khaled Hosny's avatar Khaled Hosny Kaydeden (comit) Tomaž Vajngerl

Skip required features from the features dialog

Many OpenType features are required features that are applied to certain
context determined by the layout engine, or should always be on. There
is no value in presenting these features to the user and they just
clutter the dialog for fonts that usually have many of such features
(e.g. Arabic or Indic fonts).

Change-Id: Idc3d7d3a9eb1c4f693ea6fdf9f26f0264b910f91
Reviewed-on: https://gerrit.libreoffice.org/55951
Tested-by: Jenkins
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst ba161dd0
...@@ -26,12 +26,14 @@ class VCL_DLLPUBLIC OpenTypeFeatureDefinitonListPrivate ...@@ -26,12 +26,14 @@ class VCL_DLLPUBLIC OpenTypeFeatureDefinitonListPrivate
private: private:
std::vector<FeatureDefinition> m_aFeatureDefinition; std::vector<FeatureDefinition> m_aFeatureDefinition;
std::unordered_map<sal_uInt32, size_t> m_aCodeToIndex; std::unordered_map<sal_uInt32, size_t> m_aCodeToIndex;
std::vector<sal_uInt32> m_aRequiredFeatures;
void init(); void init();
public: public:
OpenTypeFeatureDefinitonListPrivate(); OpenTypeFeatureDefinitonListPrivate();
FeatureDefinition getDefinition(sal_uInt32 nFeatureCode); FeatureDefinition getDefinition(sal_uInt32 nFeatureCode);
bool isRequired(sal_uInt32 nFeatureCode);
}; };
class VCL_DLLPUBLIC OpenTypeFeatureDefinitonList class VCL_DLLPUBLIC OpenTypeFeatureDefinitonList
......
...@@ -59,12 +59,12 @@ void FontFeatureTest::testGetFontFeatures() ...@@ -59,12 +59,12 @@ void FontFeatureTest::testGetFontFeatures()
} }
} }
CPPUNIT_ASSERT_EQUAL(size_t(31), rDefaultFontFeatures.size()); CPPUNIT_ASSERT_EQUAL(size_t(27), rDefaultFontFeatures.size());
OUString aExpectedFeaturesString = "aalt c2sc case ccmp dlig fina frac hlig " OUString aExpectedFeaturesString = "aalt c2sc case dlig frac hlig liga lnum "
"liga lnum nalt onum pnum salt sinf smcp " "nalt onum pnum salt sinf smcp ss01 ss02 "
"ss01 ss02 ss03 ss04 ss05 ss06 sups tnum " "ss03 ss04 ss05 ss06 sups tnum zero cpsp "
"zero cpsp kern lfbd mark mkmk rtbd "; "kern lfbd rtbd ";
CPPUNIT_ASSERT_EQUAL(aExpectedFeaturesString, aFeaturesString); CPPUNIT_ASSERT_EQUAL(aExpectedFeaturesString, aFeaturesString);
// Check C2SC feature // Check C2SC feature
...@@ -83,7 +83,7 @@ void FontFeatureTest::testGetFontFeatures() ...@@ -83,7 +83,7 @@ void FontFeatureTest::testGetFontFeatures()
// Check FRAC feature // Check FRAC feature
{ {
vcl::font::Feature& rFeature = rDefaultFontFeatures[6]; vcl::font::Feature& rFeature = rDefaultFontFeatures[4];
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("frac"), rFeature.m_aID.m_aFeatureCode); CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("frac"), rFeature.m_aID.m_aFeatureCode);
vcl::font::FeatureDefinition& rFracFeatureDefinition = rFeature.m_aDefinition; vcl::font::FeatureDefinition& rFracFeatureDefinition = rFeature.m_aDefinition;
......
...@@ -92,6 +92,9 @@ void FeatureCollector::collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript ...@@ -92,6 +92,9 @@ void FeatureCollector::collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript
for (hb_tag_t aFeatureTag : aFeatureTags) for (hb_tag_t aFeatureTag : aFeatureTags)
{ {
if (OpenTypeFeatureDefinitonList::get().isRequired(aFeatureTag))
continue;
m_rFontFeatures.emplace_back(); m_rFontFeatures.emplace_back();
vcl::font::Feature& rFeature = m_rFontFeatures.back(); vcl::font::Feature& rFeature = m_rFontFeatures.back();
rFeature.m_aID = { aFeatureTag, aScriptTag, aLanguageTag }; rFeature.m_aID = { aFeatureTag, aScriptTag, aLanguageTag };
......
...@@ -22,27 +22,16 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -22,27 +22,16 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ {
m_aFeatureDefinition.assign({ m_aFeatureDefinition.assign({
{ featureCode("aalt"), STR_FONT_FEATURE_ID_AALT }, { featureCode("aalt"), STR_FONT_FEATURE_ID_AALT },
{ featureCode("abvf"), STR_FONT_FEATURE_ID_ABVF },
{ featureCode("abvm"), STR_FONT_FEATURE_ID_ABVM },
{ featureCode("abvs"), STR_FONT_FEATURE_ID_ABVS },
{ featureCode("afrc"), STR_FONT_FEATURE_ID_AFRC }, { featureCode("afrc"), STR_FONT_FEATURE_ID_AFRC },
{ featureCode("akhn"), STR_FONT_FEATURE_ID_AKHN },
{ featureCode("alig"), STR_FONT_FEATURE_ID_ALIG }, { featureCode("alig"), STR_FONT_FEATURE_ID_ALIG },
{ featureCode("blwf"), STR_FONT_FEATURE_ID_BLWF },
{ featureCode("blwm"), STR_FONT_FEATURE_ID_BLWM },
{ featureCode("blws"), STR_FONT_FEATURE_ID_BLWS },
{ featureCode("c2pc"), STR_FONT_FEATURE_ID_C2PC }, { featureCode("c2pc"), STR_FONT_FEATURE_ID_C2PC },
{ featureCode("c2sc"), STR_FONT_FEATURE_ID_C2SC }, { featureCode("c2sc"), STR_FONT_FEATURE_ID_C2SC },
{ featureCode("calt"), STR_FONT_FEATURE_ID_CALT }, { featureCode("calt"), STR_FONT_FEATURE_ID_CALT },
{ featureCode("case"), STR_FONT_FEATURE_ID_CASE }, { featureCode("case"), STR_FONT_FEATURE_ID_CASE },
{ featureCode("ccmp"), STR_FONT_FEATURE_ID_CCMP },
{ featureCode("cfar"), STR_FONT_FEATURE_ID_CFAR },
{ featureCode("cjct"), STR_FONT_FEATURE_ID_CJCT },
{ featureCode("clig"), STR_FONT_FEATURE_ID_CLIG }, { featureCode("clig"), STR_FONT_FEATURE_ID_CLIG },
{ featureCode("cpct"), STR_FONT_FEATURE_ID_CPCT }, { featureCode("cpct"), STR_FONT_FEATURE_ID_CPCT },
{ featureCode("cpsp"), STR_FONT_FEATURE_ID_CPSP }, { featureCode("cpsp"), STR_FONT_FEATURE_ID_CPSP },
{ featureCode("cswh"), STR_FONT_FEATURE_ID_CSWH }, { featureCode("cswh"), STR_FONT_FEATURE_ID_CSWH },
{ featureCode("curs"), STR_FONT_FEATURE_ID_CURS },
{ featureCode("cv01"), STR_FONT_FEATURE_ID_CV01 }, { featureCode("cv01"), STR_FONT_FEATURE_ID_CV01 },
{ featureCode("cv02"), STR_FONT_FEATURE_ID_CV02 }, { featureCode("cv02"), STR_FONT_FEATURE_ID_CV02 },
{ featureCode("cv03"), STR_FONT_FEATURE_ID_CV03 }, { featureCode("cv03"), STR_FONT_FEATURE_ID_CV03 },
...@@ -53,23 +42,15 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -53,23 +42,15 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("cv08"), STR_FONT_FEATURE_ID_CV08 }, { featureCode("cv08"), STR_FONT_FEATURE_ID_CV08 },
{ featureCode("cv09"), STR_FONT_FEATURE_ID_CV09 }, { featureCode("cv09"), STR_FONT_FEATURE_ID_CV09 },
{ featureCode("dcap"), STR_FONT_FEATURE_ID_DCAP }, { featureCode("dcap"), STR_FONT_FEATURE_ID_DCAP },
{ featureCode("dist"), STR_FONT_FEATURE_ID_DIST },
{ featureCode("dlig"), STR_FONT_FEATURE_ID_DLIG }, { featureCode("dlig"), STR_FONT_FEATURE_ID_DLIG },
{ featureCode("dnom"), STR_FONT_FEATURE_ID_DNOM }, { featureCode("dnom"), STR_FONT_FEATURE_ID_DNOM },
{ featureCode("dpng"), STR_FONT_FEATURE_ID_DPNG }, { featureCode("dpng"), STR_FONT_FEATURE_ID_DPNG },
{ featureCode("dtls"), STR_FONT_FEATURE_ID_DTLS },
{ featureCode("expt"), STR_FONT_FEATURE_ID_EXPT }, { featureCode("expt"), STR_FONT_FEATURE_ID_EXPT },
{ featureCode("falt"), STR_FONT_FEATURE_ID_FALT }, { featureCode("falt"), STR_FONT_FEATURE_ID_FALT },
{ featureCode("fin2"), STR_FONT_FEATURE_ID_FIN2 },
{ featureCode("fin3"), STR_FONT_FEATURE_ID_FIN3 },
{ featureCode("fina"), STR_FONT_FEATURE_ID_FINA },
{ featureCode("flac"), STR_FONT_FEATURE_ID_FLAC },
{ featureCode("frac"), STR_FONT_FEATURE_ID_FRAC, { featureCode("frac"), STR_FONT_FEATURE_ID_FRAC,
std::vector<FeatureParameter>{ { 1, STR_FONT_FEATURE_ID_FRAC_PARAM_1 }, std::vector<FeatureParameter>{ { 1, STR_FONT_FEATURE_ID_FRAC_PARAM_1 },
{ 2, STR_FONT_FEATURE_ID_FRAC_PARAM_2 } } }, { 2, STR_FONT_FEATURE_ID_FRAC_PARAM_2 } } },
{ featureCode("fwid"), STR_FONT_FEATURE_ID_FWID }, { featureCode("fwid"), STR_FONT_FEATURE_ID_FWID },
{ featureCode("half"), STR_FONT_FEATURE_ID_HALF },
{ featureCode("haln"), STR_FONT_FEATURE_ID_HALN },
{ featureCode("halt"), STR_FONT_FEATURE_ID_HALT }, { featureCode("halt"), STR_FONT_FEATURE_ID_HALT },
{ featureCode("hist"), STR_FONT_FEATURE_ID_HIST }, { featureCode("hist"), STR_FONT_FEATURE_ID_HIST },
{ featureCode("hkna"), STR_FONT_FEATURE_ID_HKNA }, { featureCode("hkna"), STR_FONT_FEATURE_ID_HKNA },
...@@ -77,8 +58,6 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -77,8 +58,6 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("hngl"), STR_FONT_FEATURE_ID_HNGL }, { featureCode("hngl"), STR_FONT_FEATURE_ID_HNGL },
{ featureCode("hojo"), STR_FONT_FEATURE_ID_HOJO }, { featureCode("hojo"), STR_FONT_FEATURE_ID_HOJO },
{ featureCode("hwid"), STR_FONT_FEATURE_ID_HWID }, { featureCode("hwid"), STR_FONT_FEATURE_ID_HWID },
{ featureCode("init"), STR_FONT_FEATURE_ID_INIT },
{ featureCode("isol"), STR_FONT_FEATURE_ID_ISOL },
{ featureCode("ital"), STR_FONT_FEATURE_ID_ITAL }, { featureCode("ital"), STR_FONT_FEATURE_ID_ITAL },
{ featureCode("jalt"), STR_FONT_FEATURE_ID_JALT }, { featureCode("jalt"), STR_FONT_FEATURE_ID_JALT },
{ featureCode("jp78"), STR_FONT_FEATURE_ID_JP78 }, { featureCode("jp78"), STR_FONT_FEATURE_ID_JP78 },
...@@ -88,20 +67,10 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -88,20 +67,10 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("kern"), STR_FONT_FEATURE_ID_KERN }, { featureCode("kern"), STR_FONT_FEATURE_ID_KERN },
{ featureCode("lfbd"), STR_FONT_FEATURE_ID_LFBD }, { featureCode("lfbd"), STR_FONT_FEATURE_ID_LFBD },
{ featureCode("liga"), STR_FONT_FEATURE_ID_LIGA }, { featureCode("liga"), STR_FONT_FEATURE_ID_LIGA },
{ featureCode("ljmo"), STR_FONT_FEATURE_ID_LJMO },
{ featureCode("lnum"), STR_FONT_FEATURE_ID_LNUM }, { featureCode("lnum"), STR_FONT_FEATURE_ID_LNUM },
{ featureCode("locl"), STR_FONT_FEATURE_ID_LOCL },
{ featureCode("ltra"), STR_FONT_FEATURE_ID_LTRA },
{ featureCode("ltrm"), STR_FONT_FEATURE_ID_LTRM },
{ featureCode("mark"), STR_FONT_FEATURE_ID_MARK },
{ featureCode("med2"), STR_FONT_FEATURE_ID_MED2 },
{ featureCode("medi"), STR_FONT_FEATURE_ID_MEDI },
{ featureCode("mgrk"), STR_FONT_FEATURE_ID_MGRK }, { featureCode("mgrk"), STR_FONT_FEATURE_ID_MGRK },
{ featureCode("mkmk"), STR_FONT_FEATURE_ID_MKMK },
{ featureCode("mset"), STR_FONT_FEATURE_ID_MSET },
{ featureCode("nalt"), STR_FONT_FEATURE_ID_NALT }, { featureCode("nalt"), STR_FONT_FEATURE_ID_NALT },
{ featureCode("nlck"), STR_FONT_FEATURE_ID_NLCK }, { featureCode("nlck"), STR_FONT_FEATURE_ID_NLCK },
{ featureCode("nukt"), STR_FONT_FEATURE_ID_NUKT },
{ featureCode("numr"), STR_FONT_FEATURE_ID_NUMR }, { featureCode("numr"), STR_FONT_FEATURE_ID_NUMR },
{ featureCode("onum"), STR_FONT_FEATURE_ID_ONUM }, { featureCode("onum"), STR_FONT_FEATURE_ID_ONUM },
{ featureCode("opbd"), STR_FONT_FEATURE_ID_OPBD }, { featureCode("opbd"), STR_FONT_FEATURE_ID_OPBD },
...@@ -111,25 +80,12 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -111,25 +80,12 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("pcap"), STR_FONT_FEATURE_ID_PCAP }, { featureCode("pcap"), STR_FONT_FEATURE_ID_PCAP },
{ featureCode("pkna"), STR_FONT_FEATURE_ID_PKNA }, { featureCode("pkna"), STR_FONT_FEATURE_ID_PKNA },
{ featureCode("pnum"), STR_FONT_FEATURE_ID_PNUM }, { featureCode("pnum"), STR_FONT_FEATURE_ID_PNUM },
{ featureCode("pref"), STR_FONT_FEATURE_ID_PREF },
{ featureCode("pres"), STR_FONT_FEATURE_ID_PRES },
{ featureCode("pstf"), STR_FONT_FEATURE_ID_PSTF },
{ featureCode("psts"), STR_FONT_FEATURE_ID_PSTS },
{ featureCode("pwid"), STR_FONT_FEATURE_ID_PWID }, { featureCode("pwid"), STR_FONT_FEATURE_ID_PWID },
{ featureCode("qwid"), STR_FONT_FEATURE_ID_QWID }, { featureCode("qwid"), STR_FONT_FEATURE_ID_QWID },
{ featureCode("rand"), STR_FONT_FEATURE_ID_RAND },
{ featureCode("rclt"), STR_FONT_FEATURE_ID_RCLT },
{ featureCode("rkrf"), STR_FONT_FEATURE_ID_RKRF },
{ featureCode("rlig"), STR_FONT_FEATURE_ID_RLIG },
{ featureCode("rphf"), STR_FONT_FEATURE_ID_RPHF },
{ featureCode("rtbd"), STR_FONT_FEATURE_ID_RTBD }, { featureCode("rtbd"), STR_FONT_FEATURE_ID_RTBD },
{ featureCode("rtla"), STR_FONT_FEATURE_ID_RTLA },
{ featureCode("rtlm"), STR_FONT_FEATURE_ID_RTLM },
{ featureCode("ruby"), STR_FONT_FEATURE_ID_RUBY }, { featureCode("ruby"), STR_FONT_FEATURE_ID_RUBY },
{ featureCode("rvrn"), STR_FONT_FEATURE_ID_RVRN },
{ featureCode("salt"), STR_FONT_FEATURE_ID_SALT }, { featureCode("salt"), STR_FONT_FEATURE_ID_SALT },
{ featureCode("sinf"), STR_FONT_FEATURE_ID_SINF }, { featureCode("sinf"), STR_FONT_FEATURE_ID_SINF },
{ featureCode("size"), STR_FONT_FEATURE_ID_SIZE },
{ featureCode("smcp"), STR_FONT_FEATURE_ID_SMCP }, { featureCode("smcp"), STR_FONT_FEATURE_ID_SMCP },
{ featureCode("smpl"), STR_FONT_FEATURE_ID_SMPL }, { featureCode("smpl"), STR_FONT_FEATURE_ID_SMPL },
{ featureCode("ss01"), STR_FONT_FEATURE_ID_SS01 }, { featureCode("ss01"), STR_FONT_FEATURE_ID_SS01 },
...@@ -152,23 +108,17 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -152,23 +108,17 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("ss18"), STR_FONT_FEATURE_ID_SS18 }, { featureCode("ss18"), STR_FONT_FEATURE_ID_SS18 },
{ featureCode("ss19"), STR_FONT_FEATURE_ID_SS19 }, { featureCode("ss19"), STR_FONT_FEATURE_ID_SS19 },
{ featureCode("ss20"), STR_FONT_FEATURE_ID_SS20 }, { featureCode("ss20"), STR_FONT_FEATURE_ID_SS20 },
{ featureCode("ssty"), STR_FONT_FEATURE_ID_SSTY },
{ featureCode("stch"), STR_FONT_FEATURE_ID_STCH },
{ featureCode("subs"), STR_FONT_FEATURE_ID_SUBS }, { featureCode("subs"), STR_FONT_FEATURE_ID_SUBS },
{ featureCode("sups"), STR_FONT_FEATURE_ID_SUPS }, { featureCode("sups"), STR_FONT_FEATURE_ID_SUPS },
{ featureCode("swsh"), STR_FONT_FEATURE_ID_SWSH }, { featureCode("swsh"), STR_FONT_FEATURE_ID_SWSH },
{ featureCode("titl"), STR_FONT_FEATURE_ID_TITL }, { featureCode("titl"), STR_FONT_FEATURE_ID_TITL },
{ featureCode("tjmo"), STR_FONT_FEATURE_ID_TJMO },
{ featureCode("tnam"), STR_FONT_FEATURE_ID_TNAM }, { featureCode("tnam"), STR_FONT_FEATURE_ID_TNAM },
{ featureCode("tnum"), STR_FONT_FEATURE_ID_TNUM }, { featureCode("tnum"), STR_FONT_FEATURE_ID_TNUM },
{ featureCode("trad"), STR_FONT_FEATURE_ID_TRAD }, { featureCode("trad"), STR_FONT_FEATURE_ID_TRAD },
{ featureCode("twid"), STR_FONT_FEATURE_ID_TWID }, { featureCode("twid"), STR_FONT_FEATURE_ID_TWID },
{ featureCode("unic"), STR_FONT_FEATURE_ID_UNIC }, { featureCode("unic"), STR_FONT_FEATURE_ID_UNIC },
{ featureCode("valt"), STR_FONT_FEATURE_ID_VALT }, { featureCode("valt"), STR_FONT_FEATURE_ID_VALT },
{ featureCode("vatu"), STR_FONT_FEATURE_ID_VATU },
{ featureCode("vert"), STR_FONT_FEATURE_ID_VERT },
{ featureCode("vhal"), STR_FONT_FEATURE_ID_VHAL }, { featureCode("vhal"), STR_FONT_FEATURE_ID_VHAL },
{ featureCode("vjmo"), STR_FONT_FEATURE_ID_VJMO },
{ featureCode("vkna"), STR_FONT_FEATURE_ID_VKNA }, { featureCode("vkna"), STR_FONT_FEATURE_ID_VKNA },
{ featureCode("vkrn"), STR_FONT_FEATURE_ID_VKRN }, { featureCode("vkrn"), STR_FONT_FEATURE_ID_VKRN },
{ featureCode("vpal"), STR_FONT_FEATURE_ID_VPAL }, { featureCode("vpal"), STR_FONT_FEATURE_ID_VPAL },
...@@ -181,6 +131,22 @@ void OpenTypeFeatureDefinitonListPrivate::init() ...@@ -181,6 +131,22 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ {
m_aCodeToIndex.emplace(m_aFeatureDefinition[i].getCode(), i); m_aCodeToIndex.emplace(m_aFeatureDefinition[i].getCode(), i);
} }
m_aRequiredFeatures.assign({
featureCode("abvf"), featureCode("abvm"), featureCode("abvs"), featureCode("akhn"),
featureCode("blwf"), featureCode("blwm"), featureCode("blws"), featureCode("ccmp"),
featureCode("cfar"), featureCode("cjct"), featureCode("curs"), featureCode("dist"),
featureCode("dtls"), featureCode("fin2"), featureCode("fin3"), featureCode("fina"),
featureCode("flac"), featureCode("half"), featureCode("haln"), featureCode("init"),
featureCode("isol"), featureCode("ljmo"), featureCode("locl"), featureCode("ltra"),
featureCode("ltrm"), featureCode("mark"), featureCode("med2"), featureCode("medi"),
featureCode("mkmk"), featureCode("mset"), featureCode("nukt"), featureCode("pref"),
featureCode("pres"), featureCode("pstf"), featureCode("psts"), featureCode("rand"),
featureCode("rclt"), featureCode("rkrf"), featureCode("rlig"), featureCode("rphf"),
featureCode("rtla"), featureCode("rtlm"), featureCode("rvrn"), featureCode("size"),
featureCode("ssty"), featureCode("stch"), featureCode("tjmo"), featureCode("vatu"),
featureCode("vert"), featureCode("vjmo"),
});
} }
FeatureDefinition OpenTypeFeatureDefinitonListPrivate::getDefinition(sal_uInt32 nFeatureCode) FeatureDefinition OpenTypeFeatureDefinitonListPrivate::getDefinition(sal_uInt32 nFeatureCode)
...@@ -193,6 +159,12 @@ FeatureDefinition OpenTypeFeatureDefinitonListPrivate::getDefinition(sal_uInt32 ...@@ -193,6 +159,12 @@ FeatureDefinition OpenTypeFeatureDefinitonListPrivate::getDefinition(sal_uInt32
return FeatureDefinition(); return FeatureDefinition();
} }
bool OpenTypeFeatureDefinitonListPrivate::isRequired(sal_uInt32 nFeatureCode)
{
return std::find(m_aRequiredFeatures.begin(), m_aRequiredFeatures.end(), nFeatureCode)
!= m_aRequiredFeatures.end();
}
} // end font namespace } // end font namespace
} // end vcl namespace } // end vcl namespace
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment