Code

improve spcurve::second_point and document its behavior
[inkscape.git] / src / libnrtype / FontInstance.cpp
index 615ddb685debbeaa8ae03d350db194f9a0ada02b..840cff4a1ea90ac9d7790b190710a53ef3dc7ba5 100644 (file)
@@ -67,7 +67,7 @@ bool  font_style_equal::operator()(const font_style &a,const font_style &b) {
        if ( a.stroke_width > 0.01 && b.stroke_width <= 0.01 ) return false;
        if ( a.stroke_width <= 0.01 && b.stroke_width > 0.01 ) return false;
        if ( a.stroke_width <= 0.01 && b.stroke_width <= 0.01 ) return true;
-       
+
        if ( a.stroke_cap != b.stroke_cap ) return false;
        if ( a.stroke_join != b.stroke_join ) return false;
     if ( (int)(a.stroke_miter_limit*100) != (int)(b.stroke_miter_limit*100) ) return false;
@@ -125,7 +125,7 @@ static int ft2_line_to(FREETYPE_VECTOR *to, void *i_user)
 static int ft2_conic_to(FREETYPE_VECTOR *control, FREETYPE_VECTOR *to, void *i_user)
 {
        ft2_to_liv* user=(ft2_to_liv*)i_user;
-       NR::Point   p(user->scale*to->x,user->scale*to->y),c(user->scale*control->x,user->scale*control->y);  
+       NR::Point   p(user->scale*to->x,user->scale*to->y),c(user->scale*control->x,user->scale*control->y);
        //      printf("b c=%f %f  t=%f %f\n",c[0],c[1],p[0],p[1]);
        user->theP->BezierTo(p);
        user->theP->IntermBezierTo(c);
@@ -139,9 +139,9 @@ static int ft2_cubic_to(FREETYPE_VECTOR *control1, FREETYPE_VECTOR *control2, FR
        ft2_to_liv* user=(ft2_to_liv*)i_user;
        NR::Point   p(user->scale*to->x,user->scale*to->y),
        c1(user->scale*control1->x,user->scale*control1->y),
-       c2(user->scale*control2->x,user->scale*control2->y);  
+       c2(user->scale*control2->x,user->scale*control2->y);
        //      printf("c c1=%f %f  c2=%f %f   t=%f %f\n",c1[0],c1[1],c2[0],c2[1],p[0],p[1]);
-       user->theP->CubicTo(p,3*(c1-user->last),3*(p-c2)); 
+       user->theP->CubicTo(p,3*(c1-user->last),3*(p-c2));
        user->last=p;
        return 0;
 }
@@ -229,7 +229,7 @@ unsigned int font_instance::Attribute(const gchar *key, gchar *str, unsigned int
        }
        char*   res=NULL;
        bool    free_res=false;
-       
+
        if ( strcmp(key,"name") == 0 ) {
                PangoFontDescription* td=pango_font_description_copy(descr);
                pango_font_description_unset_fields (td, PANGO_FONT_MASK_SIZE);
@@ -247,11 +247,11 @@ unsigned int font_instance::Attribute(const gchar *key, gchar *str, unsigned int
              bool o = (style == PANGO_STYLE_OBLIQUE);
              PangoWeight weight=pango_font_description_get_weight(descr);
              bool b = (weight >= PANGO_WEIGHT_BOLD);
-   
-             res = g_strdup_printf ("%s%s%s%s", 
-                                    pango_font_description_get_family(descr), 
-                                    (b || i || o) ? "-" : "", 
-                                    (b) ? "Bold" : "", 
+
+             res = g_strdup_printf ("%s%s%s%s",
+                                    pango_font_description_get_family(descr),
+                                    (b || i || o) ? "-" : "",
+                                    (b) ? "Bold" : "",
                                     (i) ? "Italic" : ((o) ? "Oblique" : "")  );
              free_res = true;
          }
@@ -261,51 +261,53 @@ unsigned int font_instance::Attribute(const gchar *key, gchar *str, unsigned int
        } else if ( strcmp(key,"style") == 0 ) {
                PangoStyle v=pango_font_description_get_style(descr);
                if ( v == PANGO_STYLE_ITALIC ) {
-                       res="italic";
+                       res=(char*)"italic";
                } else if ( v == PANGO_STYLE_OBLIQUE ) {
-                       res="oblique";
+                       res=(char*)"oblique";
                } else {
-                       res="normal";
+                       res=(char*)"normal";
                }
                free_res=false;
        } else if ( strcmp(key,"weight") == 0 ) {
                PangoWeight v=pango_font_description_get_weight(descr);
                if ( v <= PANGO_WEIGHT_ULTRALIGHT ) {
-                       res="200";
+                       res=(char*)"200";
                } else if ( v <= PANGO_WEIGHT_LIGHT ) {
-                       res="300";
+                       res=(char*)"300";
                } else if ( v <= PANGO_WEIGHT_NORMAL ) {
-                       res="normal";
+                       res=(char*)"normal";
                } else if ( v <= PANGO_WEIGHT_BOLD ) {
-                       res="bold";
-               } else {
-                       res="800";
+                       res=(char*)"bold";
+               } else if ( v <= PANGO_WEIGHT_ULTRABOLD ) {
+                   res=(char*)"800";
+               } else { // HEAVY
+                       res=(char*)"900";
                }
                free_res=false;
        } else if ( strcmp(key,"stretch") == 0 ) {
                PangoStretch v=pango_font_description_get_stretch(descr);
                if ( v <= PANGO_STRETCH_EXTRA_CONDENSED ) {
-                       res="extra-condensed";
+                       res=(char*)"extra-condensed";
                } else if ( v <= PANGO_STRETCH_CONDENSED ) {
-                       res="condensed";
+                       res=(char*)"condensed";
                } else if ( v <= PANGO_STRETCH_SEMI_CONDENSED ) {
-                       res="semi-condensed";
+                       res=(char*)"semi-condensed";
                } else if ( v <= PANGO_STRETCH_NORMAL ) {
-                       res="normal";
+                       res=(char*)"normal";
                } else if ( v <= PANGO_STRETCH_SEMI_EXPANDED ) {
-                       res="semi-expanded";
+                       res=(char*)"semi-expanded";
                } else if ( v <= PANGO_STRETCH_EXPANDED ) {
-                       res="expanded";
+                       res=(char*)"expanded";
                } else {
-                       res="extra-expanded";
+                       res=(char*)"extra-expanded";
                }
                free_res=false;
        } else if ( strcmp(key,"variant") == 0 ) {
                PangoVariant v=pango_font_description_get_variant(descr);
                if ( v == PANGO_VARIANT_SMALL_CAPS ) {
-                       res="small-caps";
+                       res=(char*)"small-caps";
                } else {
-                       res="normal";
+                       res=(char*)"normal";
                }
                free_res=false;
        } else {
@@ -316,7 +318,7 @@ unsigned int font_instance::Attribute(const gchar *key, gchar *str, unsigned int
                if ( size > 0 ) str[0]=0;
                return 0;
        }
-       
+
        if (res) {
                unsigned int len=strlen(res);
                unsigned int rlen=(size-1<len)?size-1:len;
@@ -432,6 +434,11 @@ void font_instance::LoadGlyph(int glyph_id)
                bool   doAdd=false;
 
 #ifdef USE_PANGO_WIN32
+
+#ifndef GGO_UNHINTED         // For compatibility with old SDKs.
+#define GGO_UNHINTED 0x0100
+#endif
+
         MAT2 identity = {{0,1},{0,0},{0,0},{0,1}};
         OUTLINETEXTMETRIC otm;
         GetOutlineTextMetrics(daddy->hScreenDC, sizeof(otm), &otm);
@@ -597,7 +604,7 @@ bool font_instance::FontSlope(double &run, double &rise)
     rise=otm.otmsCharSlopeRise;
 #else
        if ( !FT_IS_SCALABLE(theFace) ) return false; // bitmap font
-       
+
     TT_HoriHeader *hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(theFace, ft_sfnt_hhea);
     if (hhea == NULL) return false;
     run = hhea->caret_Slope_Run;
@@ -606,7 +613,7 @@ bool font_instance::FontSlope(double &run, double &rise)
        return true;
 }
 
-NR::Rect font_instance::BBox(int glyph_id)
+NR::Maybe<NR::Rect> font_instance::BBox(int glyph_id)
 {
        int no=-1;
        if ( id_to_no.find(glyph_id) == id_to_no.end() ) {
@@ -619,11 +626,13 @@ NR::Rect font_instance::BBox(int glyph_id)
        } else {
                no=id_to_no[glyph_id];
        }
-       if ( no < 0 ) return NR::Rect(NR::Point(0,0),NR::Point(0,0));
-       NR::Point rmin(glyphs[no].bbox[0],glyphs[no].bbox[1]);
-       NR::Point rmax(glyphs[no].bbox[2],glyphs[no].bbox[3]);
-       NR::Rect  res(rmin,rmax);
-       return res;
+       if ( no < 0 ) {
+            return NR::Nothing();
+        } else {
+           NR::Point rmin(glyphs[no].bbox[0],glyphs[no].bbox[1]);
+           NR::Point rmax(glyphs[no].bbox[2],glyphs[no].bbox[3]);
+           return NR::Rect(rmin, rmax);
+        }
 }
 
 Path* font_instance::Outline(int glyph_id,Path* copyInto)
@@ -687,10 +696,10 @@ double font_instance::Advance(int glyph_id,bool vertical)
                }
        }
        return 0;
-}      
+}
 
 
-raster_font* font_instance::RasterFont(const NR::Matrix &trs,double stroke_width,bool vertical,JoinType stroke_join,ButtType stroke_cap,float miter_limit)
+raster_font* font_instance::RasterFont(const NR::Matrix &trs, double stroke_width, bool vertical, JoinType stroke_join, ButtType stroke_cap, float /*miter_limit*/)
 {
        font_style  nStyle;
        nStyle.transform=trs;