diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index cbee27a..ff44d15 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -945,32 +945,6 @@
 
     n_points += 4;
 
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-    if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) ||
-         FT_IS_VARIATION( FT_FACE( loader->face ) )      )
-    {
-      /* Deltas apply to the unscaled data. */
-      error = TT_Vary_Apply_Glyph_Deltas( loader->face,
-                                          loader->glyph_index,
-                                          outline,
-                                          (FT_UInt)n_points );
-
-      /* recalculate linear horizontal and vertical advances */
-      /* if we don't have HVAR and VVAR, respectively        */
-      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
-        loader->linear = outline->points[n_points - 3].x -
-                         outline->points[n_points - 4].x;
-      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
-        loader->vadvance = outline->points[n_points - 1].x -
-                           outline->points[n_points - 2].x;
-
-      if ( error )
-        return error;
-    }
-
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
-
     if ( IS_HINTED( loader->load_flags ) )
     {
       tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
@@ -1053,6 +1027,34 @@
       }
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) ||
+         FT_IS_VARIATION( FT_FACE( loader->face ) )      )
+    {
+      /* Deltas apply to the scaled data. */
+      error = TT_Vary_Apply_Glyph_Deltas( loader->face,
+                                          loader->glyph_index,
+                                          outline,
+                                          (FT_UInt)n_points,
+                                          x_scale,
+                                          y_scale );
+
+      /* recalculate linear horizontal and vertical advances */
+      /* if we don't have HVAR and VVAR, respectively        */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+        loader->linear = outline->points[n_points - 3].x -
+                         outline->points[n_points - 4].x;
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+        loader->vadvance = outline->points[n_points - 1].x -
+                           outline->points[n_points - 2].x;
+
+      if ( error )
+        return error;
+    }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
       /* if we have a HVAR table, `pp1' and/or `pp2' are already adjusted */
       if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ||
            !IS_HINTED( loader->load_flags )                                 )
@@ -1702,7 +1704,9 @@
         error = TT_Vary_Apply_Glyph_Deltas( loader->face,
                                             glyph_index,
                                             &outline,
-                                            (FT_UInt)outline.n_points );
+                                            (FT_UInt)outline.n_points,
+                                            0x10000,
+                                            0x10000 );
         if ( error )
           goto Exit;
 
@@ -1928,7 +1932,9 @@
                              face,
                              glyph_index,
                              &outline,
-                             (FT_UInt)outline.n_points ) ) )
+                             (FT_UInt)outline.n_points,
+                             0x10000,
+                             0x10000 ) ) )
           goto Exit1;
 
         subglyph = gloader->current.subglyphs;
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
index 6854d23..4d6f502 100644
--- a/src/truetype/ttgxvar.c
+++ b/src/truetype/ttgxvar.c
@@ -3681,7 +3681,9 @@
   TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
                               FT_UInt      glyph_index,
                               FT_Outline*  outline,
-                              FT_UInt      n_points )
+                              FT_UInt      n_points,
+                              FT_Fixed     x_scale,
+                              FT_Fixed     y_scale )
   {
     FT_Error   error;
     FT_Stream  stream = face->root.stream;
@@ -3801,7 +3803,7 @@
     {
       FT_UInt   tupleDataSize;
       FT_UInt   tupleIndex;
-      FT_Fixed  apply;
+      FT_Fixed  apply, apply_x, apply_y;
 
 
       FT_TRACE6(( "  tuple %d:\n", i ));
@@ -3876,6 +3878,9 @@
                                           point_count == 0 ? n_points
                                                            : point_count );
 
+      apply_x = FT_MulFix( apply, x_scale );
+      apply_y = FT_MulFix( apply, y_scale );
+
       if ( !points || !deltas_y || !deltas_x )
         ; /* failure, ignore it */
 
@@ -3894,8 +3899,8 @@
           FT_Fixed  old_point_delta_x = point_deltas_x[j];
           FT_Fixed  old_point_delta_y = point_deltas_y[j];
 
-          FT_Fixed  point_delta_x = FT_MulFix( deltas_x[j], apply );
-          FT_Fixed  point_delta_y = FT_MulFix( deltas_y[j], apply );
+          FT_Fixed  point_delta_x = FT_MulFix( deltas_x[j], apply_x );
+          FT_Fixed  point_delta_y = FT_MulFix( deltas_y[j], apply_y );
 
 
           if ( j < n_points - 4 )
@@ -3978,8 +3983,8 @@
 
           has_delta[idx] = TRUE;
 
-          points_out[idx].x += FT_MulFix( deltas_x[j], apply );
-          points_out[idx].y += FT_MulFix( deltas_y[j], apply );
+          points_out[idx].x += FT_MulFix( deltas_x[j], apply_x );
+          points_out[idx].y += FT_MulFix( deltas_y[j], apply_y );
         }
 
         /* no need to handle phantom points here,      */
diff --git a/src/truetype/ttgxvar.h b/src/truetype/ttgxvar.h
index 7e8d976..70223b8 100644
--- a/src/truetype/ttgxvar.h
+++ b/src/truetype/ttgxvar.h
@@ -412,11 +412,13 @@ FT_BEGIN_HEADER
                     FT_Stream  stream );
 
 
-  FT_LOCAL( FT_Error )
+  FT_LOCAL_DEF( FT_Error )
   TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
                               FT_UInt      glyph_index,
                               FT_Outline*  outline,
-                              FT_UInt      n_points );
+                              FT_UInt      n_points,
+                              FT_Fixed     x_scale,
+                              FT_Fixed     y_scale );
 
   FT_LOCAL( FT_Error )
   tt_hadvance_adjust( TT_Face  face,
