# # digit enclosing signs # # first we replace any sequence of digits (up to three places) following a # digit enclosing sign by smaller alternates @EndOfAyah = [uni06DD]; @NumSign = [uni0600]; @YearSign = [uni0601]; @FootNote = [uni0602]; @SafhaSign = [uni0603]; @NumSignW = [uni0600.alt]; lookup digit2small { sub @Digits by @Digits.small; } digit2small; lookup NumSignW { sub @NumSign by @NumSignW; } NumSignW; feature calt { sub [@EndOfAyah @NumSign @SafhaSign @FootNote] @Digits' lookup digit2small; sub [@EndOfAyah @NumSign @SafhaSign @FootNote] @Digits.small @Digits' lookup digit2small; sub [@EndOfAyah @NumSign @SafhaSign ] @Digits.small @Digits.small @Digits' lookup digit2small; sub @NumSign @Digits.small @Digits.small @Digits.small @Digits' lookup digit2small; } calt; feature calt { sub @NumSign' lookup NumSignW @Digits.small @Digits.small @Digits.small @Digits.small; } calt; lookup digit2medium { sub @Digits by @Digits.medium; } digit2medium; feature calt { sub @YearSign @Digits' lookup digit2medium; sub @YearSign @Digits.medium @Digits' lookup digit2medium; sub @YearSign @Digits.medium @Digits.medium @Digits' lookup digit2medium; sub @YearSign @Digits.medium @Digits.medium @Digits.medium @Digits' lookup digit2medium; } calt; # now we contextually kern the sign with the digits: # * one digit: move digit's x by -(sw + dw)/2 and its Δx by -dw # * two digits: the above, then move 1st digit's x by -dw/2 and 2nd digit's x # by -sw/2 and its Δx by -dw # * three digits: the above, then move 1st & 2nd digit's x by -dw/2 and 3rd # digit's x by -(sw/2 - dw/2) and its Δx by -dw # # dw = digit width, sw = sign width feature kern { pos @EndOfAyah @Digits.small' <-1610 0 -600 0>; pos @NumSign @Digits.small' <-1622 0 -600 0>; pos @NumSignW @Digits.small' <-1922 0 -600 0>; pos @YearSign @Digits.medium' <-2275 0 -900 0>; pos @FootNote @Digits.small' <-1090 0 -600 0>; pos @SafhaSign @Digits.small' <-1722 0 -600 0>; } kern; feature kern { pos @EndOfAyah @Digits.small' <-300 0 0 0> @Digits.small; pos @NumSign @Digits.small' <-300 0 0 0> @Digits.small; pos @NumSignW @Digits.small' <-300 0 0 0> @Digits.small; pos @YearSign @Digits.medium' <-450 0 0 0> @Digits.medium; pos @FootNote @Digits.small' <-300 0 0 0> @Digits.small; pos @SafhaSign @Digits.small' <-300 0 0 0> @Digits.small; } kern; feature kern { pos @EndOfAyah @Digits.small @Digits.small' <-1310 0 -600 0>; pos @NumSign @Digits.small @Digits.small' <-1322 0 -600 0>; pos @NumSignW @Digits.small @Digits.small' <-1622 0 -600 0>; pos @YearSign @Digits.medium @Digits.medium' <-1825 0 -900 0>; pos @FootNote @Digits.small @Digits.small' <-790 0 -600 0>; pos @SafhaSign @Digits.small @Digits.small' <-1422 0 -600 0>; } kern; feature kern { pos @EndOfAyah @Digits.small' <-300 0 0 0> @Digits.small @Digits.small; pos @NumSign @Digits.small' <-300 0 0 0> @Digits.small @Digits.small; pos @NumSignW @Digits.small' <-300 0 0 0> @Digits.small @Digits.small; pos @YearSign @Digits.medium' <-450 0 0 0> @Digits.medium @Digits.medium; pos @SafhaSign @Digits.small' <-300 0 0 0> @Digits.small @Digits.small; } kern; feature kern { pos @EndOfAyah @Digits.small @Digits.small' <-300 0 0 0> @Digits.small; pos @NumSign @Digits.small @Digits.small' <-300 0 0 0> @Digits.small; pos @NumSignW @Digits.small @Digits.small' <-300 0 0 0> @Digits.small; pos @YearSign @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium; pos @SafhaSign @Digits.small @Digits.small' <-300 0 0 0> @Digits.small; } kern; feature kern { pos @EndOfAyah @Digits.small @Digits.small @Digits.small' <-1010 0 -600 0>; pos @NumSign @Digits.small @Digits.small @Digits.small' <-1022 0 -600 0>; pos @NumSignW @Digits.small @Digits.small @Digits.small' <-1322 0 -600 0>; pos @YearSign @Digits.medium @Digits.medium @Digits.medium' <-1375 0 -900 0>; pos @SafhaSign @Digits.small @Digits.small @Digits.small' <-1122 0 -600 0>; } kern; feature kern { pos @YearSign @Digits.medium' <-450 0 0 0> @Digits.medium @Digits.medium @Digits.medium; pos @NumSignW @Digits.small' <-300 0 0 0> @Digits.small @Digits.small @Digits.small ; } kern; feature kern { pos @YearSign @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium @Digits.medium; pos @NumSignW @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @Digits.small ; } kern; feature kern { pos @YearSign @Digits.medium @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium; pos @NumSignW @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @Digits.small ; } kern; feature kern { pos @YearSign @Digits.medium @Digits.medium @Digits.medium @Digits.medium' <-925 0 -900 0>; pos @NumSignW @Digits.small @Digits.small @Digits.small @Digits.small' <-1022 0 -600 0>; } kern; ############## # HarfBuzz flips LTR Arabic runs before applying OpenType, but this is not what # other engines does, so the above code does not work as it expects the digits # and the sign in LTR order, so we do it for RTL order below until this is # changed in HarfBuzz. feature calt { sub @Digits' lookup digit2small [@EndOfAyah @NumSign @SafhaSign @FootNote]; } calt; feature calt { sub @Digits' lookup digit2small @Digits.small [@EndOfAyah @NumSign @SafhaSign @FootNote]; } calt; feature calt { sub @Digits' lookup digit2small @Digits.small @Digits.small [@EndOfAyah @NumSign @SafhaSign ]; } calt; feature calt { sub @Digits' lookup digit2small @Digits.small @Digits.small @Digits.small @NumSign; } calt; feature calt { sub @Digits.small @Digits.small @Digits.small @Digits.small @NumSign' lookup NumSignW; } calt; feature calt { sub @Digits' lookup digit2medium @YearSign; } calt; feature calt { sub @Digits' lookup digit2medium @Digits.medium @YearSign; } calt; feature calt { sub @Digits' lookup digit2medium @Digits.medium @Digits.medium @YearSign; } calt; feature calt { sub @Digits' lookup digit2medium @Digits.medium @Digits.medium @Digits.medium @YearSign; } calt; feature kern { pos @Digits.small' <-1610 0 -600 0> @EndOfAyah; pos @Digits.small' <-1622 0 -600 0> @NumSign ; pos @Digits.small' <-1922 0 -600 0> @NumSignW ; pos @Digits.medium' <-2275 0 -900 0> @YearSign ; pos @Digits.small' <-1090 0 -600 0> @FootNote ; pos @Digits.small' <-1722 0 -600 0> @SafhaSign; } kern; feature kern { pos @Digits.small @Digits.small' <-300 0 0 0> @EndOfAyah; pos @Digits.small @Digits.small' <-300 0 0 0> @NumSign ; pos @Digits.small @Digits.small' <-300 0 0 0> @NumSignW ; pos @Digits.medium @Digits.medium' <-450 0 0 0> @YearSign ; pos @Digits.small @Digits.small' <-300 0 0 0> @FootNote ; pos @Digits.small @Digits.small' <-300 0 0 0> @SafhaSign; } kern; feature kern { pos @Digits.small' <-1310 0 -600 0> @Digits.small @EndOfAyah; pos @Digits.small' <-1322 0 -600 0> @Digits.small @NumSign ; pos @Digits.small' <-1622 0 -600 0> @Digits.small @NumSignW ; pos @Digits.medium' <-1825 0 -900 0> @Digits.medium @YearSign ; pos @Digits.small' <-790 0 -600 0> @Digits.small @FootNote ; pos @Digits.small' <-1422 0 -600 0> @Digits.small @SafhaSign; } kern; feature kern { pos @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @EndOfAyah; pos @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @NumSign ; pos @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @NumSignW ; pos @Digits.medium @Digits.medium @Digits.medium' <-450 0 0 0> @YearSign ; pos @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @SafhaSign; } kern; feature kern { pos @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @EndOfAyah; pos @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @NumSign ; pos @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @NumSignW ; pos @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium @YearSign ; pos @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @SafhaSign; } kern; feature kern { pos @Digits.small' <-1010 0 -600 0> @Digits.small @Digits.small @EndOfAyah; pos @Digits.small' <-1022 0 -600 0> @Digits.small @Digits.small @NumSign ; pos @Digits.small' <-1322 0 -600 0> @Digits.small @Digits.small @NumSignW ; pos @Digits.medium' <-1375 0 -900 0> @Digits.medium @Digits.medium @YearSign ; pos @Digits.small' <-1122 0 -600 0> @Digits.small @Digits.small @SafhaSign; } kern; feature kern { pos @Digits.medium @Digits.medium @Digits.medium @Digits.medium' <-450 0 0 0> @YearSign; pos @Digits.small @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @NumSignW; } kern; feature kern { pos @Digits.medium @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium @YearSign; pos @Digits.small @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @NumSignW; } kern; feature kern { pos @Digits.medium @Digits.medium' <-450 0 0 0> @Digits.medium @Digits.medium @YearSign; pos @Digits.small @Digits.small' <-300 0 0 0> @Digits.small @Digits.small @NumSignW; } kern; feature kern { pos @Digits.medium' <-925 0 -900 0> @Digits.medium @Digits.medium @Digits.medium @YearSign; pos @Digits.small' <-1022 0 -600 0> @Digits.small @Digits.small @Digits.small @NumSignW; } kern; ##############