anchors.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. def getGlyph(gname, font):
  2. return font[gname] if font.has_key(gname) else None
  3. def getComponentByName(f, g, componentName):
  4. for c in g.components:
  5. if c.baseGlyph == componentName:
  6. return c
  7. def getAnchorByName(g,anchorName):
  8. for a in g.anchors:
  9. if a.name == anchorName:
  10. return a
  11. def moveMarkAnchors(f, g, anchorName, accentName, dx, dy):
  12. if "top"==anchorName:
  13. anchors = f[accentName].anchors
  14. for anchor in anchors:
  15. if "mkmktop_acc" == anchor.name:
  16. anchor2 = Anchor()
  17. #print anchor.x, dx, anchor.y, dy
  18. anchor2.name = "top"
  19. anchor2.x = anchor.x + int(dx)
  20. anchor2.y = anchor.y + int(dy)
  21. g.anchors.append(anchor2)
  22. elif "bottom"==anchorName:
  23. anchors = f[accentName].anchors
  24. for anchor in anchors:
  25. if "mkmkbottom_acc" == anchor.name:
  26. for n in range(len(g.anchors)):
  27. if g.anchors[n].name == "bottom":
  28. del g.anchors[n]
  29. break
  30. anchor2 = Anchor()
  31. #print anchor.x, dx, anchor.y, dy
  32. anchor2.name = "bottom"
  33. anchor2.x = anchor.x + int(dx)
  34. anchor2.y = anchor.y + int(dy)
  35. for anc in anchors:
  36. if "top" == anc.name:
  37. anchor2.x = anc.x + int(dx)
  38. g.anchors.append(anchor2)
  39. def alignComponentToAnchor(f,glyphName,baseName,accentName,anchorName):
  40. g = getGlyph(glyphName,f)
  41. base = getGlyph(baseName,f)
  42. accent = getGlyph(accentName,f)
  43. if g == None or base == None or accent == None:
  44. return
  45. a1 = getAnchorByName(base,anchorName)
  46. a2 = getAnchorByName(accent,"_" + anchorName)
  47. if a1 == None or a2 == None:
  48. return
  49. offset = (a1.x - a2.x, a1.y - a2.y)
  50. c = getComponentByName(f, g, accentName)
  51. c.offset = offset
  52. moveMarkAnchors(f, g, anchorName, accentName, offset.x, offset.y)
  53. def alignComponentsToAnchors(f,glyphName,baseName,accentNames):
  54. for a in accentNames:
  55. if len(a) == 1:
  56. continue
  57. alignComponentToAnchor(f,glyphName,baseName,a[0],a[1])