Changed the size stuff to use floats rather than ints. Global height and width is now calculated using the bbox
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
diff --git a/include/FTSize.h b/include/FTSize.h
index c90dcf1..e3dd319 100755
--- a/include/FTSize.h
+++ b/include/FTSize.h
@@ -14,11 +14,11 @@ class FTSize
FTSize();
virtual ~FTSize();
bool CharSize( FT_Face* face, int point_size, int x_resolution, int y_resolution );
- int Ascender() const;
- int Descender() const;
- int Height() const;
- int Width() const;
- int Underline() const;
+ float Ascender() const;
+ float Descender() const;
+ float Height() const;
+ float Width() const;
+ float Underline() const;
FT_Error Error() const { return err; }
@@ -28,6 +28,7 @@ class FTSize
// methods
// attributes
+ FT_Face* ftFace;
FT_Size ftSize;
int size;
diff --git a/src/FTSize.cpp b/src/FTSize.cpp
index 4fede75..41e4dbe 100755
--- a/src/FTSize.cpp
+++ b/src/FTSize.cpp
@@ -13,6 +13,7 @@ FTSize::~FTSize()
bool FTSize::CharSize( FT_Face* ftFace, int point_size, int x_resolution, int y_resolution )
{
+ this->ftFace = ftFace;
size = point_size;
err = FT_Set_Char_Size( *ftFace, 0L, point_size * 64, x_resolution, y_resolution);
@@ -22,33 +23,67 @@ bool FTSize::CharSize( FT_Face* ftFace, int point_size, int x_resolution, int y_
}
-int FTSize::Ascender() const
+float FTSize::Ascender() const
{
return ftSize->metrics.ascender >> 6;
}
-int FTSize::Descender() const
+float FTSize::Descender() const
{
return ftSize->metrics.descender >> 6;
}
-int FTSize::Height() const
+float FTSize::Height() const
{
- return ftSize->metrics.height >> 6;
+ if( FT_IS_SCALABLE((*ftFace)))
+ {
+ float height;
+ if( FT_IS_SFNT((*ftFace))) // Don't think this is correct
+ {
+ height = (*ftFace)->bbox.yMax - (*ftFace)->bbox.yMin; // bbox.yMax-bbox.yMin
+ }
+ else
+ {
+ height = (*ftFace)->bbox.yMax - (*ftFace)->bbox.yMin >> 16; // bbox.yMax-bbox.yMin
+ }
+
+ height = height * ( (float)ftSize->metrics.y_ppem / (float)(*ftFace)->units_per_EM);
+ return height;
+ }
+ else
+ {
+ return ftSize->metrics.height >> 6;
+ }
}
-int FTSize::Width() const
+float FTSize::Width() const
{
- return ftSize->metrics.max_advance >> 6;
+ if( FT_IS_SCALABLE((*ftFace)))
+ {
+ float width;
+ if( FT_IS_SFNT((*ftFace))) // Don't think this is correct
+ {
+ width = ((*ftFace)->bbox.xMax - (*ftFace)->bbox.xMin); // bbox.xMax-bbox.xMin
+ }
+ else
+ {
+ width = ((*ftFace)->bbox.xMax - (*ftFace)->bbox.xMin) >> 16; // bbox.xMax-bbox.xMin
+ }
+
+ width = width * ( (float)ftSize->metrics.x_ppem / (float)(*ftFace)->units_per_EM);
+ return width;
+ }
+ else
+ {
+ return ftSize->metrics.max_advance >> 6;
+ }
}
-int FTSize::Underline() const
+float FTSize::Underline() const
{
return 0;
}
-
-