int level = -1;
int prevLevel = -1;
boolean retainControls = false;
+ Font lastFont = null;
+ int lastFontPos = -1;
while (nextStart < foText.length()) {
ch = foText.charAt(nextStart);
level = foText.bidiLevelAt(nextStart);
+ "}");
}
if (inWord) {
- if (breakOpportunity
- || GlyphMapping.isSpace(ch)
- || CharUtilities.isExplicitBreak(ch)
- || ((prevLevel != -1) && (level != prevLevel))) {
+ boolean processWord = breakOpportunity
+ || GlyphMapping.isSpace(ch)
+ || CharUtilities.isExplicitBreak(ch)
+ || ((prevLevel != -1) && (level != prevLevel));
+ if (!processWord && foText.getCommonFont().getFontSelectionStrategy() == EN_CHARACTER_BY_CHARACTER) {
+ if (lastFont == null || lastFontPos != nextStart - 1) {
+ lastFont = FontSelector.selectFontForCharactersInText(
+ foText, nextStart - 1, nextStart, foText, this);
+ }
+ Font font = FontSelector.selectFontForCharactersInText(
+ foText, nextStart, nextStart + 1, foText, this);
+ processWord = font != lastFont;
+ lastFont = font;
+ lastFontPos = nextStart;
+ }
+ if (processWord) {
// this.foText.charAt(lastIndex) == CharUtilities.SOFT_HYPHEN
prevMapping = processWord(alignment, sequence, prevMapping, ch,
breakOpportunity, true, prevLevel, retainControls);
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+ <info>
+ <p>
+ This test checks the font character-by-character selection.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="normal" page-width="210mm" page-height="297mm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="normal" white-space-collapse="true">
+ <fo:flow flow-name="xsl-region-body" font-selection-strategy="character-by-character">
+ <fo:block>font-family not given</fo:block>
+ <fo:block>this text contains a ∑ symbol in the middle</fo:block>
+ <fo:block>mixed contents should be</fo:block>
+ <fo:block>∑∑text</fo:block>
+ <fo:block>∑∑∑∑text</fo:block>
+ <fo:block>∑∑∑∑sym</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="sans-serif" xpath="//flow/block[1]/lineArea/text/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[2]/lineArea/text[1]/@font-name"/>
+ <eval expected="Symbol" xpath="//flow/block[2]/lineArea/text[2]/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[2]/lineArea/text[3]/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[3]/lineArea/text[1]/@font-name"/>
+ <eval expected="Symbol" xpath="//flow/block[4]/lineArea/text[1]/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[4]/lineArea/text[2]/@font-name"/>
+ <eval expected="Symbol" xpath="//flow/block[5]/lineArea/text[1]/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[5]/lineArea/text[2]/@font-name"/>
+ <eval expected="Symbol" xpath="//flow/block[6]/lineArea/text[1]/@font-name"/>
+ <eval expected="sans-serif" xpath="//flow/block[6]/lineArea/text[2]/@font-name"/>
+ </checks>
+</testcase>