# Source code for fontTools.ttLib.tables.BitmapGlyphMetrics

    # Since bitmap glyph metrics are shared between EBLC and EBDT
    # this class gets its own python file.
    from fontTools.misc import sstruct
    from fontTools.misc.textTools import safeEval
    import logging

    log = logging.getLogger(__name__)

    bigGlyphMetricsFormat = """
      > # big endian
      height:       B
      width:        B
      horiBearingX: b
      horiBearingY: b
      horiAdvance:  B
      vertBearingX: b
      vertBearingY: b
      vertAdvance:  B
    """

    smallGlyphMetricsFormat = """
      > # big endian
      height:   B
      width:    B
      BearingX: b
      BearingY: b
      Advance:  B
    """

    class BitmapGlyphMetrics(object):

        def toXML(self, writer, ttFont):
            writer.begintag(self.__class__.__name__)
            writer.newline()
            for metricName in sstruct.getformat(self.__class__.binaryFormat)[1]:
                writer.simpletag(metricName, value=getattr(self, metricName))
                writer.newline()
            writer.endtag(self.__class__.__name__)
            writer.newline()

        def fromXML(self, name, attrs, content, ttFont):
            metricNames = set(sstruct.getformat(self.__class__.binaryFormat)[1])
            for element in content:
                if not isinstance(element, tuple):
                    continue
                name, attrs, content = element
                # Make sure this is a metric that is needed by GlyphMetrics.
                if name in metricNames:
                    vars(self)[name] = safeEval(attrs["value"])
                else:
                    log.warning(
                        "unknown name '%s' being ignored in %s.",
                        name,
                        self.__class__.__name__,
                    )

    class BigGlyphMetrics(BitmapGlyphMetrics):
        binaryFormat = bigGlyphMetricsFormat

    class SmallGlyphMetrics(BitmapGlyphMetrics):
        binaryFormat = smallGlyphMetricsFormat