34#define FT_COMPONENT mm
38 ft_face_get_mm_service( FT_Face face,
39 FT_Service_MultiMasters *aservice )
47 return FT_THROW( Invalid_Face_Handle );
49 error = FT_ERR( Invalid_Argument );
51 if ( FT_HAS_MULTIPLE_MASTERS( face ) )
53 FT_FACE_LOOKUP_SERVICE( face,
66 ft_face_get_mvar_service( FT_Face face,
67 FT_Service_MetricsVariations *aservice )
75 return FT_THROW( Invalid_Face_Handle );
77 error = FT_ERR( Invalid_Argument );
79 if ( FT_HAS_MULTIPLE_MASTERS( face ) )
81 FT_FACE_LOOKUP_SERVICE( face,
95 FT_EXPORT_DEF( FT_Error )
96 FT_Get_Multi_Master( FT_Face face,
97 FT_Multi_Master *amaster )
100 FT_Service_MultiMasters service;
106 return FT_THROW( Invalid_Argument );
108 error = ft_face_get_mm_service( face, &service );
111 error = FT_ERR( Invalid_Argument );
112 if ( service->get_mm )
113 error = service->get_mm( face, amaster );
122 FT_EXPORT_DEF( FT_Error )
123 FT_Get_MM_Var( FT_Face face,
124 FT_MM_Var* *amaster )
127 FT_Service_MultiMasters service;
133 return FT_THROW( Invalid_Argument );
135 error = ft_face_get_mm_service( face, &service );
138 error = FT_ERR( Invalid_Argument );
139 if ( service->get_mm_var )
140 error = service->get_mm_var( face, amaster );
149 FT_EXPORT_DEF( FT_Error )
150 FT_Done_MM_Var( FT_Library library,
157 return FT_THROW( Invalid_Library_Handle );
159 memory = library->memory;
168 FT_EXPORT_DEF( FT_Error )
169 FT_Set_MM_Design_Coordinates( FT_Face face,
174 FT_Service_MultiMasters service;
179 if ( num_coords && !coords )
180 return FT_THROW( Invalid_Argument );
182 error = ft_face_get_mm_service( face, &service );
185 error = FT_ERR( Invalid_Argument );
186 if ( service->set_mm_design )
187 error = service->set_mm_design( face, num_coords, coords );
192 face->face_flags |= FT_FACE_FLAG_VARIATION;
194 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
199 if ( !error && face->autohint.finalizer )
201 face->autohint.finalizer( face->autohint.data );
202 face->autohint.data = NULL;
211 FT_EXPORT_DEF( FT_Error )
212 FT_Set_MM_WeightVector( FT_Face face,
214 FT_Fixed* weightvector )
217 FT_Service_MultiMasters service;
222 if ( len && !weightvector )
223 return FT_THROW( Invalid_Argument );
225 error = ft_face_get_mm_service( face, &service );
228 error = FT_ERR( Invalid_Argument );
229 if ( service->set_mm_weightvector )
230 error = service->set_mm_weightvector( face, len, weightvector );
235 face->face_flags |= FT_FACE_FLAG_VARIATION;
237 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
242 if ( !error && face->autohint.finalizer )
244 face->autohint.finalizer( face->autohint.data );
245 face->autohint.data = NULL;
252 FT_EXPORT_DEF( FT_Error )
253 FT_Get_MM_WeightVector( FT_Face face,
255 FT_Fixed* weightvector )
258 FT_Service_MultiMasters service;
263 if ( len && !weightvector )
264 return FT_THROW( Invalid_Argument );
266 error = ft_face_get_mm_service( face, &service );
269 error = FT_ERR( Invalid_Argument );
270 if ( service->get_mm_weightvector )
271 error = service->get_mm_weightvector( face, len, weightvector );
280 FT_EXPORT_DEF( FT_Error )
281 FT_Set_Var_Design_Coordinates( FT_Face face,
286 FT_Service_MultiMasters service_mm = NULL;
287 FT_Service_MetricsVariations service_mvar = NULL;
292 if ( num_coords && !coords )
293 return FT_THROW( Invalid_Argument );
295 if ( !num_coords && !FT_IS_VARIATION( face ) )
298 error = ft_face_get_mm_service( face, &service_mm );
301 error = FT_ERR( Invalid_Argument );
302 if ( service_mm->set_var_design )
303 error = service_mm->set_var_design( face, num_coords, coords );
305 if ( !error || error == -1 || error == -2 )
307 FT_Bool is_variation_old = FT_IS_VARIATION( face );
314 face->face_flags |= FT_FACE_FLAG_VARIATION;
318 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
321 if ( service_mm->construct_ps_name )
327 if ( is_variation_old != FT_IS_VARIATION( face ) )
328 service_mm->construct_ps_name( face );
331 service_mm->construct_ps_name( face );
342 (void)ft_face_get_mvar_service( face, &service_mvar );
344 if ( service_mvar && service_mvar->metrics_adjust )
345 service_mvar->metrics_adjust( face );
349 if ( !error && face->autohint.finalizer )
351 face->autohint.finalizer( face->autohint.data );
352 face->autohint.data = NULL;
361 FT_EXPORT_DEF( FT_Error )
362 FT_Get_Var_Design_Coordinates( FT_Face face,
367 FT_Service_MultiMasters service;
373 return FT_THROW( Invalid_Argument );
375 error = ft_face_get_mm_service( face, &service );
378 error = FT_ERR( Invalid_Argument );
379 if ( service->get_var_design )
380 error = service->get_var_design( face, num_coords, coords );
389 FT_EXPORT_DEF( FT_Error )
390 FT_Set_MM_Blend_Coordinates( FT_Face face,
395 FT_Service_MultiMasters service_mm = NULL;
396 FT_Service_MetricsVariations service_mvar = NULL;
401 if ( num_coords && !coords )
402 return FT_THROW( Invalid_Argument );
404 error = ft_face_get_mm_service( face, &service_mm );
407 error = FT_ERR( Invalid_Argument );
408 if ( service_mm->set_mm_blend )
409 error = service_mm->set_mm_blend( face, num_coords, coords );
411 if ( !error || error == -1 )
413 FT_Bool is_variation_old = FT_IS_VARIATION( face );
417 face->face_flags |= FT_FACE_FLAG_VARIATION;
419 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
421 if ( service_mm->construct_ps_name )
427 if ( is_variation_old != FT_IS_VARIATION( face ) )
428 service_mm->construct_ps_name( face );
431 service_mm->construct_ps_name( face );
442 (void)ft_face_get_mvar_service( face, &service_mvar );
444 if ( service_mvar && service_mvar->metrics_adjust )
445 service_mvar->metrics_adjust( face );
449 if ( !error && face->autohint.finalizer )
451 face->autohint.finalizer( face->autohint.data );
452 face->autohint.data = NULL;
464 FT_EXPORT_DEF( FT_Error )
465 FT_Set_Var_Blend_Coordinates( FT_Face face,
470 FT_Service_MultiMasters service_mm = NULL;
471 FT_Service_MetricsVariations service_mvar = NULL;
476 if ( num_coords && !coords )
477 return FT_THROW( Invalid_Argument );
479 error = ft_face_get_mm_service( face, &service_mm );
482 error = FT_ERR( Invalid_Argument );
483 if ( service_mm->set_mm_blend )
484 error = service_mm->set_mm_blend( face, num_coords, coords );
486 if ( !error || error == -1 || error == -2 )
488 FT_Bool is_variation_old = FT_IS_VARIATION( face );
495 face->face_flags |= FT_FACE_FLAG_VARIATION;
499 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
502 if ( service_mm->construct_ps_name )
508 if ( is_variation_old != FT_IS_VARIATION( face ) )
509 service_mm->construct_ps_name( face );
512 service_mm->construct_ps_name( face );
523 (void)ft_face_get_mvar_service( face, &service_mvar );
525 if ( service_mvar && service_mvar->metrics_adjust )
526 service_mvar->metrics_adjust( face );
530 if ( !error && face->autohint.finalizer )
532 face->autohint.finalizer( face->autohint.data );
533 face->autohint.data = NULL;
542 FT_EXPORT_DEF( FT_Error )
543 FT_Get_MM_Blend_Coordinates( FT_Face face,
548 FT_Service_MultiMasters service;
554 return FT_THROW( Invalid_Argument );
556 error = ft_face_get_mm_service( face, &service );
559 error = FT_ERR( Invalid_Argument );
560 if ( service->get_mm_blend )
561 error = service->get_mm_blend( face, num_coords, coords );
573 FT_EXPORT_DEF( FT_Error )
574 FT_Get_Var_Blend_Coordinates( FT_Face face,
579 FT_Service_MultiMasters service;
585 return FT_THROW( Invalid_Argument );
587 error = ft_face_get_mm_service( face, &service );
590 error = FT_ERR( Invalid_Argument );
591 if ( service->get_mm_blend )
592 error = service->get_mm_blend( face, num_coords, coords );
601 FT_EXPORT_DEF( FT_Error )
602 FT_Get_Var_Axis_Flags( FT_MM_Var* master,
606 FT_UShort* axis_flags;
609 if ( !master || !flags )
610 return FT_THROW( Invalid_Argument );
612 if ( axis_index >= master->num_axis )
613 return FT_THROW( Invalid_Argument );
616 axis_flags = (FT_UShort*)&( master[1] );
617 *flags = axis_flags[axis_index];
625 FT_EXPORT_DEF( FT_Error )
626 FT_Set_Named_Instance( FT_Face face,
627 FT_UInt instance_index )
631 FT_Service_MultiMasters service_mm = NULL;
632 FT_Service_MetricsVariations service_mvar = NULL;
637 error = ft_face_get_mm_service( face, &service_mm );
640 error = FT_ERR( Invalid_Argument );
641 if ( service_mm->set_named_instance )
642 error = service_mm->set_named_instance( face, instance_index );
644 if ( !error || error == -1 )
646 FT_Bool is_variation_old = FT_IS_VARIATION( face );
649 face->face_flags &= ~FT_FACE_FLAG_VARIATION;
650 face->face_index = ( instance_index << 16 ) |
651 ( face->face_index & 0xFFFFL );
653 if ( service_mm->construct_ps_name )
659 if ( is_variation_old != FT_IS_VARIATION( face ) )
660 service_mm->construct_ps_name( face );
663 service_mm->construct_ps_name( face );
674 (void)ft_face_get_mvar_service( face, &service_mvar );
676 if ( service_mvar && service_mvar->metrics_adjust )
677 service_mvar->metrics_adjust( face );
681 if ( !error && face->autohint.finalizer )
683 face->autohint.finalizer( face->autohint.data );
684 face->autohint.data = NULL;
693 FT_EXPORT_DEF( FT_Error )
694 FT_Get_Default_Named_Instance( FT_Face face,
695 FT_UInt *instance_index )
699 FT_Service_MultiMasters service_mm = NULL;
704 error = ft_face_get_mm_service( face, &service_mm );
708 if ( service_mm->get_default_named_instance )
709 error = service_mm->get_default_named_instance( face,