Батик — как найти цвет заливки TextNode?

Я пытаюсь использовать Batik для преобразования SVG, и все идет хорошо, за исключением того, что я не могу выяснить, где значение атрибута fill для исходного документа SVG хранится в элементе Batik TextNode. Итак, в моем SVG у меня есть следующее:

<text x="276.1875" y="120.390625" text-anchor="middle" font="10px &quot;Arial&quot;"
      stroke="none" fill="#ffffff" style="-webkit-tap-highlight-color: rgb(0, 0, 0); text-anchor: middle; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 10px; line-height: normal; font-family: Arial;"
      font-size="10px" font-family="Arial">
     <tspan dy="3.5" >Proportion </tspan>
</text>

Это отлично работает, но когда я использую свой собственный TextPainter (через общий мост), чтобы попытаться обработать TextNode, я обнаруживаю следующее:

   public void paint(TextNode node, Graphics2D g2d )
   {
      AttributedCharacterIterator aci = node.getAttributedCharacterIterator();
      Paint colourInfo = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); //null
      Paint bgInfo = (Paint)aci.getAttribute(TextAttribute.BACKGROUND); //null
      // do actual painting
   }

Фактически, большинство атрибутов, относящихся к цвету, которые я могу найти, просматривая пользовательские текстовые атрибуты TextAttribute и GVT, возвращаются нулевыми. У объекта aci действительно есть список ненулевых атрибутов, но я не могу понять, что это за ключи от отладчика, поскольку все они отключены от списков атрибутов.

Существующее свойство paint объекта Graphics2D обычно устанавливается в цвет блока, который он только что нарисовал, что означает, что если я ничего не изменю, я просто получу весь свой текст того же цвета, что и фон, что затрудняет читать.

Как мне найти цвет этих текстовых узлов, которым они снабжены в исходном SVG?


person glenatron    schedule 27.10.2014    source источник


Ответы (1)


Выяснилось, что TextNode разбит на TextRun, и внутри TextRun вы можете получить доступ к свойству PAINT_INFO AttributedCharacterIterator следующим образом:

AttributedCharacterIterator runaci = textRun.getACI();
char c = runaci.first();
TextPaintInfo tpi = (TextPaintInfo) runaci.getAttribute(PAINT_INFO);
if ( tpi == null || !tpi.visible )
   {
      return y;
    }
g2d.setPaint(tpi.fillPaint);

TextPaintInfo содержит данные из исходного SVG, относящиеся к отображаемому тексту.

person glenatron    schedule 29.10.2014