00001 #include "FTSize.h" 00002 00003 00004 FTSize::FTSize() 00005 : ftFace(0), 00006 ftSize(0), 00007 size(0), 00008 xResolution(0), 00009 yResolution(0), 00010 err(0) 00011 {} 00012 00013 00014 FTSize::~FTSize() 00015 {} 00016 00017 00018 bool FTSize::CharSize( FT_Face* face, unsigned int pointSize, unsigned int xRes, unsigned int yRes ) 00019 { 00020 if (size != pointSize || xResolution != xRes || yResolution != yRes) { 00021 err = FT_Set_Char_Size( *face, 0L, pointSize * 64, xResolution, yResolution); 00022 00023 if (!err) { 00024 ftFace = face; 00025 size = pointSize; 00026 xResolution = xRes; 00027 yResolution = yRes; 00028 ftSize = (*ftFace)->size; 00029 } else { 00030 ftFace = 0; 00031 size = 0; 00032 xResolution = 0; 00033 yResolution = 0; 00034 ftSize = 0; 00035 } 00036 } 00037 00038 return !err; 00039 } 00040 00041 00042 unsigned int FTSize::CharSize() const 00043 { 00044 return size; 00045 } 00046 00047 00048 float FTSize::Ascender() const 00049 { 00050 return ftSize == 0 ? 0.0f : static_cast<float>( ftSize->metrics.ascender) / 64.0f; 00051 } 00052 00053 00054 float FTSize::Descender() const 00055 { 00056 return ftSize == 0 ? 0.0f : static_cast<float>( ftSize->metrics.descender) / 64.0f; 00057 } 00058 00059 00060 float FTSize::Height() const 00061 { 00062 if (0 == ftSize) return 0.0f; 00063 00064 if (FT_IS_SCALABLE((*ftFace))) { 00065 return ( (*ftFace)->bbox.yMax - (*ftFace)->bbox.yMin) * ( (float)ftSize->metrics.y_ppem / (float)(*ftFace)->units_per_EM); 00066 } else { 00067 return static_cast<float>( ftSize->metrics.height) / 64.0f; 00068 } 00069 } 00070 00071 00072 float FTSize::Width() const 00073 { 00074 if( 0 == ftSize) return 0.0f; 00075 00076 if( FT_IS_SCALABLE((*ftFace))) { 00077 return ( (*ftFace)->bbox.xMax - (*ftFace)->bbox.xMin) * ( static_cast<float>(ftSize->metrics.x_ppem) / static_cast<float>((*ftFace)->units_per_EM)); 00078 } else { 00079 return static_cast<float>( ftSize->metrics.max_advance) / 64.0f; 00080 } 00081 } 00082 00083 00084 float FTSize::Underline() const 00085 { 00086 return 0.0f; 00087 }