Browse Source

First version of text-decoration support (no colors, yet, PDF rendering may not be optimal, yet, but the rest seems to work)

This change may kill what text-decoration support already was in the RTF renderer. This will need to be fixed later.
Some javadoc and style touch-ups.


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198314 13f79535-47bb-0310-9956-ffa450edef68
tags/Root_Temp_KnuthStylePageBreaking
Jeremias Maerki 19 years ago
parent
commit
c62eb56cc3

+ 19
- 1
src/java/org/apache/fop/area/inline/InlineArea.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
package org.apache.fop.area.inline;

import org.apache.fop.area.Area;
import org.apache.fop.area.Trait;

/**
* Inline Area
@@ -65,5 +66,22 @@ public class InlineArea extends Area {
public int getOffset() {
return verticalPosition;
}
public boolean hasUnderline() {
return getBooleanTrait(Trait.UNDERLINE);
}

public boolean hasOverline() {
return getBooleanTrait(Trait.OVERLINE);
}
public boolean hasLineThrough() {
return getBooleanTrait(Trait.LINETHROUGH);
}
public boolean isBlinking() {
return getBooleanTrait(Trait.BLINK);
}
}


+ 3
- 1
src/java/org/apache/fop/fo/FOPropertyMapping.java View File

@@ -46,6 +46,7 @@ import org.apache.fop.fo.properties.PropertyMaker;
import org.apache.fop.fo.properties.SpaceProperty;
import org.apache.fop.fo.properties.SpacingPropertyMaker;
import org.apache.fop.fo.properties.StringProperty;
import org.apache.fop.fo.properties.TextDecorationProperty;
import org.apache.fop.fo.properties.ToBeImplementedProperty;

/**
@@ -1701,7 +1702,8 @@ public class FOPropertyMapping implements Constants {
addPropertyMaker("suppress-at-line-break", m);

// text-decoration
m = new EnumProperty.Maker(PR_TEXT_DECORATION);
//m = new EnumProperty.Maker(PR_TEXT_DECORATION);
m = new TextDecorationProperty.Maker(PR_TEXT_DECORATION);
m.setInherited(false);
m.addEnum("none", getEnumProperty(EN_NONE, "NONE"));
m.addEnum("underline", getEnumProperty(EN_UNDERLINE, "UNDERLINE"));

+ 20
- 9
src/java/org/apache/fop/fo/FOText.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ import org.apache.fop.fo.flow.Block;
import org.apache.fop.fo.pagination.Root;
import org.apache.fop.fo.properties.CommonFont;
import org.apache.fop.fo.properties.CommonHyphenation;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.Property;
import org.apache.fop.fo.properties.SpaceProperty;
import org.apache.fop.layoutmgr.TextLayoutManager;
@@ -110,6 +111,9 @@ public class FOText extends FONode {
*/
private Block ancestorBlock = null;

/** Holds the text decoration values. May be null */
private CommonTextDecoration textDecoration;
private static final int IS_WORD_CHAR_FALSE = 0;
private static final int IS_WORD_CHAR_TRUE = 1;
private static final int IS_WORD_CHAR_MAYBE = 2;
@@ -144,6 +148,7 @@ public class FOText extends FONode {
textTransform = pList.get(Constants.PR_TEXT_TRANSFORM).getEnum();
wordSpacing = pList.get(Constants.PR_WORD_SPACING);
wrapOption = pList.get(Constants.PR_WRAP_OPTION).getEnum();
textDecoration = pList.getTextDecorationProps();
}

protected void startOfNode() {
@@ -520,51 +525,57 @@ public class FOText extends FONode {
}

/**
* Return the Common Font Properties.
* @return the Common Font Properties.
*/
public CommonFont getCommonFont() {
return commonFont;
}

/**
* Return the Common Hyphenation Properties.
* @return the Common Hyphenation Properties.
*/
public CommonHyphenation getCommonHyphenation() {
return commonHyphenation;
}

/**
* Return the "color" property.
* @return the "color" property.
*/
public ColorType getColor() {
return color;
}

/**
* Return the "letter-spacing" property.
* @return the "letter-spacing" property.
*/
public Property getLetterSpacing() {
return letterSpacing;
}
/**
* Return the "line-height" property.
* @return the "line-height" property.
*/
public SpaceProperty getLineHeight() {
return lineHeight;
}
/**
* Return the "word-spacing" property.
* @return the "word-spacing" property.
*/
public Property getWordSpacing() {
return wordSpacing;
}
/**
* Return the "wrap-option" property.
* @return the "wrap-option" property.
*/
public int getWrapOption() {
return wrapOption;
}
}
/** @return the "text-decoration" property. */
public CommonTextDecoration getTextDecoration() {
return textDecoration;
}
}

+ 24
- 5
src/java/org/apache/fop/fo/PropertyList.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ import org.apache.fop.fo.properties.CommonHyphenation;
import org.apache.fop.fo.properties.CommonMarginBlock;
import org.apache.fop.fo.properties.CommonMarginInline;
import org.apache.fop.fo.properties.CommonRelativePosition;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.Property;
import org.apache.fop.fo.properties.PropertyMaker;

@@ -396,6 +397,7 @@ abstract public class PropertyList {
/**
* @param propId ID of property
* @return new Property object
* @throws PropertyException if there's a problem while processing the property
*/
private Property getShorthand(int propId) throws PropertyException {
PropertyMaker propertyMaker = findMaker(propId);
@@ -411,7 +413,7 @@ abstract public class PropertyList {
/**
* @param propID ID of property
* @return new Property object
* @throws FOPException for errors in the input
* @throws PropertyException if there's a problem while processing the property
*/
private Property makeProperty(int propId) throws PropertyException {
PropertyMaker propertyMaker = findMaker(propId);
@@ -457,16 +459,17 @@ abstract public class PropertyList {
/**
* Constructs a BorderAndPadding object.
* @return a BorderAndPadding object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonBorderPaddingBackground getBorderPaddingBackgroundProps() throws PropertyException {
public CommonBorderPaddingBackground getBorderPaddingBackgroundProps()
throws PropertyException {
return new CommonBorderPaddingBackground(this, getFObj());
}

/**
* Constructs a HyphenationProps objects.
* @return a HyphenationProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonHyphenation getHyphenationProps() throws PropertyException {
return new CommonHyphenation(this);
@@ -475,6 +478,7 @@ abstract public class PropertyList {
/**
* Constructs a MarginProps objects.
* @return a MarginProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonMarginBlock getMarginBlockProps() throws PropertyException {
return new CommonMarginBlock(this);
@@ -483,6 +487,7 @@ abstract public class PropertyList {
/**
* Constructs a MarginInlineProps objects.
* @return a MarginInlineProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonMarginInline getMarginInlineProps() throws PropertyException {
return new CommonMarginInline(this);
@@ -491,6 +496,7 @@ abstract public class PropertyList {
/**
* Constructs a AccessibilityProps objects.
* @return a AccessibilityProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonAccessibility getAccessibilityProps() throws PropertyException {
return new CommonAccessibility(this);
@@ -499,6 +505,7 @@ abstract public class PropertyList {
/**
* Constructs a AuralProps objects.
* @return a AuralProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonAural getAuralProps() throws PropertyException {
CommonAural props = new CommonAural(this);
@@ -508,6 +515,7 @@ abstract public class PropertyList {
/**
* Constructs a RelativePositionProps objects.
* @return a RelativePositionProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonRelativePosition getRelativePositionProps() throws PropertyException {
return new CommonRelativePosition(this);
@@ -516,6 +524,7 @@ abstract public class PropertyList {
/**
* Constructs a AbsolutePositionProps objects.
* @return a AbsolutePositionProps object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonAbsolutePosition getAbsolutePositionProps() throws PropertyException {
return new CommonAbsolutePosition(this);
@@ -525,9 +534,19 @@ abstract public class PropertyList {
/**
* Constructs a CommonFont object.
* @return A CommonFont object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonFont getFontProps() throws PropertyException {
return new CommonFont(this);
}
/**
* Constructs a CommonTextDecoration object.
* @return a CommonTextDecoration object
* @throws PropertyException if there's a problem while processing the properties
*/
public CommonTextDecoration getTextDecorationProps() throws PropertyException {
return CommonTextDecoration.createFromPropertyList(this);
}
}


+ 18
- 21
src/java/org/apache/fop/fo/flow/Character.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,9 +18,6 @@

package org.apache.fop.fo.flow;

// Java
import java.util.List;

import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
@@ -38,9 +35,9 @@ import org.apache.fop.fo.properties.CommonFont;
import org.apache.fop.fo.properties.CommonHyphenation;
import org.apache.fop.fo.properties.CommonMarginInline;
import org.apache.fop.fo.properties.CommonRelativePosition;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.KeepProperty;
import org.apache.fop.fo.properties.Property;
import org.apache.fop.layoutmgr.CharacterLayoutManager;

/**
* This class represents the flow object 'fo:character'. Its use is defined by
@@ -81,7 +78,8 @@ public class Character extends FObj {
private Length lineHeight;
private int scoreSpaces;
private int suppressAtLineBreak;
private int textDecoration;
/** Holds the text decoration values. May be null */
private CommonTextDecoration textDecoration;
// private ToBeImplementedProperty textShadow;
private int textTransform;
private int verticalAlign;
@@ -130,7 +128,7 @@ public class Character extends FObj {
lineHeight = pList.get(PR_LINE_HEIGHT).getLength();
scoreSpaces = pList.get(PR_SCORE_SPACES).getEnum();
suppressAtLineBreak = pList.get(PR_SUPPRESS_AT_LINE_BREAK).getEnum();
textDecoration = pList.get(PR_TEXT_DECORATION).getEnum();
textDecoration = pList.getTextDecorationProps();
// textShadow = pList.get(PR_TEXT_SHADOW);
textTransform = pList.get(PR_TEXT_TRANSFORM).getEnum();
verticalAlign = pList.get(PR_VERTICAL_ALIGN).getEnum();
@@ -164,70 +162,68 @@ public class Character extends FObj {
}

/**
* Return the Common Border, Padding, and Background Properties.
* @return the Common Border, Padding, and Background Properties.
*/
public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
return commonBorderPaddingBackground;
}

/**
* Return the Common Font Properties.
* @return the Common Font Properties.
*/
public CommonFont getCommonFont() {
return commonFont;
}

/**
* Return the Common Hyphenation Properties.
* @return the Common Hyphenation Properties.
*/
public CommonHyphenation getCommonHyphenation() {
return commonHyphenation;
}

/**
* Return the "character" property.
* @return the "character" property.
*/
public char getCharacter() {
return character;
}

/**
* Return the "color" property.
* @return the "color" property.
*/
public ColorType getColor() {
return color;
}

/**
* Return the "id" property.
* @return the "id" property.
*/
public String getId() {
return id;
}

/**
* Return the "letter-spacing" property.
* @return the "letter-spacing" property.
*/
public Property getLetterSpacing() {
return letterSpacing;
}

/**
* Return the "text-decoration" property.
*/
public int getTextDecoration() {
/** @return the "text-decoration" property. */
public CommonTextDecoration getTextDecoration() {
return textDecoration;
}
/**
* Return the "word-spacing" property.
* @return the "word-spacing" property.
*/
public Property getWordSpacing() {
return wordSpacing;
}

/**
* Return the "vertical-align" property.
* @return the "vertical-align" property.
*/
public int getVerticalAlign() {
return verticalAlign;
@@ -246,4 +242,5 @@ public class Character extends FObj {
public int getNameId() {
return FO_CHARACTER;
}
}

+ 2
- 13
src/java/org/apache/fop/fo/flow/Inline.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,8 +18,6 @@

package org.apache.fop.fo.flow;

import java.util.List;

import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
@@ -30,9 +28,9 @@ import org.apache.fop.fo.InlineCharIterator;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
import org.apache.fop.fo.properties.CommonRelativePosition;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.KeepProperty;
import org.apache.fop.fo.properties.LengthRangeProperty;
import org.apache.fop.layoutmgr.InlineLayoutManager;

/**
* Class modelling the fo:inline formatting object.
@@ -52,7 +50,6 @@ public class Inline extends InlineLevel {
private KeepProperty keepTogether;
private KeepProperty keepWithNext;
private KeepProperty keepWithPrevious;
private int textDecoration;
private int verticalAlign;
private Length width;
private int wrapOption;
@@ -86,7 +83,6 @@ public class Inline extends InlineLevel {
keepTogether = pList.get(PR_KEEP_TOGETHER).getKeep();
keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep();
keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep();
textDecoration = pList.get(PR_TEXT_DECORATION).getEnum();
verticalAlign = pList.get(PR_VERTICAL_ALIGN).getEnum();
width = pList.get(PR_WIDTH).getLength();
wrapOption = pList.get(PR_WRAP_OPTION).getEnum();
@@ -160,13 +156,6 @@ public class Inline extends InlineLevel {
return id;
}

/**
* Return the "text-decoration" property.
*/
public int getTextDecoration() {
return textDecoration;
}

/**
* Return the "vertical-align" property.
*/

+ 12
- 15
src/java/org/apache/fop/fo/flow/PageNumber.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,9 +18,6 @@

package org.apache.fop.fo.flow;

// Java
import java.util.List;

import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
@@ -35,9 +32,9 @@ import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.fo.properties.CommonFont;
import org.apache.fop.fo.properties.CommonMarginInline;
import org.apache.fop.fo.properties.CommonRelativePosition;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.KeepProperty;
import org.apache.fop.fo.properties.SpaceProperty;
import org.apache.fop.layoutmgr.PageNumberLayoutManager;

/**
* Class modelling the fo:page-number object.
@@ -61,7 +58,8 @@ public class PageNumber extends FObj {
private Length lineHeight;
private int scoreSpaces;
private Length textAltitude;
private int textDecoration;
/** Holds the text decoration values. May be null */
private CommonTextDecoration textDecoration;
private Length textDepth;
// private ToBeImplementedProperty textShadow;
private int textTransform;
@@ -98,7 +96,7 @@ public class PageNumber extends FObj {
lineHeight = pList.get(PR_LINE_HEIGHT).getLength();
scoreSpaces = pList.get(PR_SCORE_SPACES).getEnum();
textAltitude = pList.get(PR_TEXT_ALTITUDE).getLength();
textDecoration = pList.get(PR_TEXT_DECORATION).getEnum();
textDecoration = pList.getTextDecorationProps();
textDepth = pList.get(PR_TEXT_DEPTH).getLength();
// textShadow = pList.get(PR_TEXT_SHADOW);
textTransform = pList.get(PR_TEXT_TRANSFORM).getEnum();
@@ -146,19 +144,12 @@ public class PageNumber extends FObj {
}

/**
* Return the "id" property.
* @return the "id" property.
*/
public String getId() {
return id;
}

/**
* Return the "text-decoration" property.
*/
public int getTextDecoration() {
return textDecoration;
}

/**
* @see org.apache.fop.fo.FONode#getName()
*/
@@ -172,4 +163,10 @@ public class PageNumber extends FObj {
public int getNameId() {
return FO_PAGE_NUMBER;
}
/** @return the "text-decoration" property. */
public CommonTextDecoration getTextDecoration() {
return textDecoration;
}

}

+ 10
- 7
src/java/org/apache/fop/fo/flow/PageNumberCitation.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,9 +18,6 @@

package org.apache.fop.fo.flow;

// Java
import java.util.List;

import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
@@ -35,9 +32,9 @@ import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.fo.properties.CommonFont;
import org.apache.fop.fo.properties.CommonMarginInline;
import org.apache.fop.fo.properties.CommonRelativePosition;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.KeepProperty;
import org.apache.fop.fo.properties.SpaceProperty;
import org.apache.fop.layoutmgr.PageNumberCitationLayoutManager;

/**
* Class modelling the fo:page-number-citation object.
@@ -65,7 +62,8 @@ public class PageNumberCitation extends FObj {
private String refId;
private int scoreSpaces;
private Length textAltitude;
private int textDecoration;
/** Holds the text decoration values. May be null */
private CommonTextDecoration textDecoration;
private Length textDepth;
// private ToBeImplementedProperty textShadow;
private int textTransform;
@@ -103,7 +101,7 @@ public class PageNumberCitation extends FObj {
refId = pList.get(PR_REF_ID).getString();
scoreSpaces = pList.get(PR_SCORE_SPACES).getEnum();
textAltitude = pList.get(PR_TEXT_ALTITUDE).getLength();
textDecoration = pList.get(PR_TEXT_DECORATION).getEnum();
textDecoration = pList.getTextDecorationProps();
textDepth = pList.get(PR_TEXT_DEPTH).getLength();
// textShadow = pList.get(PR_TEXT_SHADOW);
textTransform = pList.get(PR_TEXT_TRANSFORM).getEnum();
@@ -138,6 +136,11 @@ public class PageNumberCitation extends FObj {
return commonFont;
}

/** @return the "text-decoration" property. */
public CommonTextDecoration getTextDecoration() {
return textDecoration;
}
/**
* Return the "id" property.
*/

+ 142
- 0
src/java/org/apache/fop/fo/properties/CommonTextDecoration.java View File

@@ -0,0 +1,142 @@
/*
* Copyright 2005 The Apache Software Foundation.
*
* Licensed 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$ */

package org.apache.fop.fo.properties;

import java.util.Iterator;
import java.util.List;

import org.apache.fop.datatypes.ColorType;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;

/**
* Stores all information concerning text-decoration.
*/
public class CommonTextDecoration {

//using a bit-mask here
private static final int UNDERLINE = 1;
private static final int OVERLINE = 2;
private static final int LINE_THROUGH = 4;
private static final int BLINK = 8;
private int decoration;
private ColorType underColor;
private ColorType overColor;
private ColorType throughColor;
/**
* Creates a new CommonTextDecoration object with default values.
*/
public CommonTextDecoration() {
}
/**
* Creates a CommonTextDecoration object from a property list.
* @param pList the property list to build the object for
* @return a CommonTextDecoration object or null if the obj would only have default values
* @throws PropertyException if there's a problem while processing the property
*/
public static CommonTextDecoration createFromPropertyList(PropertyList pList)
throws PropertyException {
return calcTextDecoration(pList);
}
private static CommonTextDecoration calcTextDecoration(PropertyList pList)
throws PropertyException {
CommonTextDecoration deco = null;
PropertyList parentList = pList.getParentPropertyList();
if (parentList != null) {
//Parent is checked first
deco = calcTextDecoration(parentList);
}
List list = pList.get(Constants.PR_TEXT_DECORATION).getList();
Iterator i = list.iterator();
while (i.hasNext()) {
Property prop = (Property)i.next();
int enum = prop.getEnum();
if (enum == Constants.EN_NONE) {
if (deco != null) {
deco.decoration = 0;
}
return deco;
} else if (enum == Constants.EN_UNDERLINE) {
if (deco == null) {
deco = new CommonTextDecoration();
}
deco.decoration |= UNDERLINE;
} else if (enum == Constants.EN_NO_UNDERLINE) {
if (deco != null) {
deco.decoration &= OVERLINE | LINE_THROUGH | BLINK;
}
} else if (enum == Constants.EN_OVERLINE) {
if (deco == null) {
deco = new CommonTextDecoration();
}
deco.decoration |= OVERLINE;
} else if (enum == Constants.EN_NO_OVERLINE) {
if (deco != null) {
deco.decoration &= UNDERLINE | LINE_THROUGH | BLINK;
}
} else if (enum == Constants.EN_LINE_THROUGH) {
if (deco == null) {
deco = new CommonTextDecoration();
}
deco.decoration |= LINE_THROUGH;
} else if (enum == Constants.EN_NO_LINE_THROUGH) {
if (deco != null) {
deco.decoration &= UNDERLINE | OVERLINE | BLINK;
}
} else if (enum == Constants.EN_BLINK) {
if (deco == null) {
deco = new CommonTextDecoration();
}
deco.decoration |= BLINK;
} else if (enum == Constants.EN_NO_BLINK) {
if (deco != null) {
deco.decoration &= UNDERLINE | OVERLINE | LINE_THROUGH;
}
} else {
throw new PropertyException("Illegal value encountered: " + prop.getString());
}
}
return deco;
}
/** @return true if underline is active */
public boolean hasUnderline() {
return (this.decoration & UNDERLINE) != 0;
}

/** @return true if overline is active */
public boolean hasOverline() {
return (this.decoration & OVERLINE) != 0;
}

/** @return true if line-through is active */
public boolean hasLineThrough() {
return (this.decoration & LINE_THROUGH) != 0;
}

/** @return true if blink is active */
public boolean isBlinking() {
return (this.decoration & BLINK) != 0;
}
}

+ 8
- 11
src/java/org/apache/fop/fo/properties/GenericShorthandParser.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@

package org.apache.fop.fo.properties;

import java.util.Enumeration;
import java.util.Iterator;

import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
@@ -37,7 +37,7 @@ public class GenericShorthandParser implements ShorthandParser {
*/
protected Property getElement(Property list, int index) {
if (list.getList().size() > index) {
return (Property) list.getList().elementAt(index);
return (Property) list.getList().get(index);
} else {
return null;
}
@@ -49,9 +49,7 @@ public class GenericShorthandParser implements ShorthandParser {
Property property,
PropertyMaker maker,
PropertyList propertyList)
throws PropertyException
{
Property prop = null;
throws PropertyException {
// Check for keyword "inherit"
if (property.getList().size() == 1) {
String sval = getElement(property, 0).getString();
@@ -75,13 +73,12 @@ public class GenericShorthandParser implements ShorthandParser {
Property property,
PropertyMaker maker,
PropertyList propertyList)
throws PropertyException
{
throws PropertyException {
Property prop = null;
// Try each of the stored values in turn
Enumeration eprop = property.getList().elements();
while (eprop.hasMoreElements() && prop == null) {
Property p = (Property) eprop.nextElement();
Iterator iprop = property.getList().iterator();
while (iprop.hasNext() && prop == null) {
Property p = (Property)iprop.next();
prop = maker.convertShorthandProperty(propertyList, p, null);
}
return prop;

+ 15
- 8
src/java/org/apache/fop/fo/properties/ListProperty.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@

package org.apache.fop.fo.properties;

import java.util.Vector;
import java.util.List;

import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
@@ -34,7 +34,7 @@ public class ListProperty extends Property {
public static class Maker extends PropertyMaker {

/**
* @param name name of property for which Maker should be created
* @param propId ID of the property for which Maker should be created
*/
public Maker(int propId) {
super(propId);
@@ -55,14 +55,21 @@ public class ListProperty extends Property {
}

/** Vector containing the list of sub-properties */
protected Vector list;
protected List list = new java.util.Vector();

/**
* Simple constructor used by subclasses to do some special processing.
*/
protected ListProperty() {
//nop
}
/**
* @param prop the first Property to be added to the list
*/
public ListProperty(Property prop) {
list = new Vector();
list.addElement(prop);
this();
addProperty(prop);
}

/**
@@ -70,13 +77,13 @@ public class ListProperty extends Property {
* @param prop Property to be added to the list
*/
public void addProperty(Property prop) {
list.addElement(prop);
list.add(prop);
}

/**
* @return this.list
*/
public Vector getList() {
public List getList() {
return list;
}


+ 6
- 7
src/java/org/apache/fop/fo/properties/Property.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@

package org.apache.fop.fo.properties;

import java.util.Vector;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -31,6 +31,8 @@ import org.apache.fop.datatypes.Numeric;
* @author unascribed
*/
public class Property {
/** Logger for all property classes */
protected static Log log = LogFactory.getLog(PropertyMaker.class);

/**
@@ -136,7 +138,7 @@ public class Property {
* This method expects to be overridden by subclasses
* @return collection of other property (sub-property) objects
*/
public Vector getList() {
public List getList() {
return null;
}

@@ -180,10 +182,7 @@ public class Property {
return null;
}

/**
* Return a string representation of the property value. Only used
* for debugging.
*/
/** @see java.lang.Object#toString() */
public String toString() {
Object obj = getObject();
if (obj != this) {

+ 159
- 0
src/java/org/apache/fop/fo/properties/TextDecorationProperty.java View File

@@ -0,0 +1,159 @@
/*
* Copyright 2004-2005 The Apache Software Foundation.
*
* Licensed 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.
*/
package org.apache.fop.fo.properties;

import java.util.Iterator;
import java.util.List;

import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.NCnameProperty;
import org.apache.fop.fo.expr.PropertyException;

/**
* Special list property for text-decoration.
*/
public class TextDecorationProperty extends ListProperty {

/**
* Inner class for creating instances of ListProperty
*/
public static class Maker extends PropertyMaker {

/**
* @param propId ID of the property for which Maker should be created
*/
public Maker(int propId) {
super(propId);
}

/**
* @see PropertyMaker#convertProperty
*/
public Property convertProperty(Property p,
PropertyList propertyList, FObj fo)
throws PropertyException {
if (p instanceof TextDecorationProperty) {
return p;
} else {
if (p instanceof ListProperty) {
ListProperty lst = (ListProperty)p;
lst = checkEnums(lst);
return new TextDecorationProperty((ListProperty)p);
} else if (p instanceof EnumProperty) {
ListProperty lst = new ListProperty(p);
return new TextDecorationProperty(lst);
} else {
throw new PropertyException("Cannot convert anything other "
+ "than a list property, got a " + p.getClass().getName());
}
}
}

private ListProperty checkEnums(ListProperty lst) throws PropertyException {
List l = lst.getList();
for (int i = 0; i < l.size(); i++) {
Property prop = (Property)l.get(i);
if (prop instanceof EnumProperty) {
//skip
} else if (prop instanceof NCnameProperty) {
Property enum = checkEnumValues(((NCnameProperty)prop).getString());
if (enum == null) {
throw new PropertyException("Illegal enum value: " + prop.getString());
}
l.set(i, enum);
} else {
throw new PropertyException("Invalid content for text-decoration "
+ "property: " + prop);
}
}
return lst;
}
}

/**
* Constructs a new instance by converting a ListProperty.
* @param listProp the ListProperty to be converted
* @throws PropertyException in case the conversion fails
*/
public TextDecorationProperty(ListProperty listProp) throws PropertyException {
List lst = listProp.getList();
boolean none = false;
boolean under = false;
boolean over = false;
boolean through = false;
boolean blink = false;
Iterator i = lst.iterator();
while (i.hasNext()) {
Property prop = (Property)i.next();
switch (prop.getEnum()) {
case Constants.EN_NONE:
if (under | over | through | blink) {
throw new PropertyException(
"Invalid combination of values");
}
none = true;
break;
case Constants.EN_UNDERLINE:
case Constants.EN_NO_UNDERLINE:
if (none) {
throw new PropertyException("'none' specified, no additional values allowed");
}
if (under) {
throw new PropertyException("Invalid combination of values");
}
under = true;
break;
case Constants.EN_OVERLINE:
case Constants.EN_NO_OVERLINE:
if (none) {
throw new PropertyException("'none' specified, no additional values allowed");
}
if (over) {
throw new PropertyException("Invalid combination of values");
}
over = true;
break;
case Constants.EN_LINE_THROUGH:
case Constants.EN_NO_LINE_THROUGH:
if (none) {
throw new PropertyException("'none' specified, no additional values allowed");
}
if (through) {
throw new PropertyException("Invalid combination of values");
}
through = true;
break;
case Constants.EN_BLINK:
case Constants.EN_NO_BLINK:
if (none) {
throw new PropertyException("'none' specified, no additional values allowed");
}
if (blink) {
throw new PropertyException("Invalid combination of values");
}
blink = true;
break;
default:
throw new PropertyException("Invalid value specified: " + prop);
}
addProperty(prop);
}
}
}

+ 2
- 1
src/java/org/apache/fop/layoutmgr/CharacterLayoutManager.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -59,6 +59,7 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager {
private InlineArea getCharacterInlineArea(Character node) {
org.apache.fop.area.inline.Character ch =
new org.apache.fop.area.inline.Character(node.getCharacter());
TraitSetter.addTextDecoration(ch, fobj.getTextDecoration());
return ch;
}


+ 3
- 1
src/java/org/apache/fop/layoutmgr/PageNumberCitationLayoutManager.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -100,6 +100,8 @@ public class PageNumberCitationLayoutManager extends LeafNodeLayoutManager {
inline.addTrait(Trait.FONT_NAME, font.getFontName());
inline.addTrait(Trait.FONT_SIZE, new Integer(font.getFontSize()));
}
TraitSetter.addTextDecoration(inline, fobj.getTextDecoration());
return inline;
}

+ 3
- 1
src/java/org/apache/fop/layoutmgr/PageNumberLayoutManager.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -59,6 +59,8 @@ public class PageNumberLayoutManager extends LeafNodeLayoutManager {
inline.addTrait(Trait.FONT_SIZE,
new Integer(font.getFontSize()));

TraitSetter.addTextDecoration(inline, fobj.getTextDecoration());

return inline;
}

+ 5
- 1
src/java/org/apache/fop/layoutmgr/TextLayoutManager.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -619,6 +619,7 @@ public class TextLayoutManager extends AbstractLayoutManager
t.setTextLetterSpaceAdjust(iLetterSpaceDim);
t.setTextWordSpaceAdjust(iWordSpaceDim - spaceCharIPD
- 2 * t.getTextLetterSpaceAdjust());
word = t;
if (word != null) {
parentLM.addChild(word);
@@ -659,6 +660,9 @@ public class TextLayoutManager extends AbstractLayoutManager
textArea.addTrait(Trait.FONT_NAME, fs.getFontName());
textArea.addTrait(Trait.FONT_SIZE, new Integer(fs.getFontSize()));
textArea.addTrait(Trait.COLOR, foText.getColor());
TraitSetter.addTextDecoration(textArea, foText.getTextDecoration());
return textArea;
}


+ 24
- 0
src/java/org/apache/fop/layoutmgr/TraitSetter.java View File

@@ -26,6 +26,7 @@ import org.apache.fop.area.Trait;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.properties.CommonMarginBlock;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.fo.properties.CommonTextDecoration;
import org.apache.fop.fo.properties.PercentLength;

/**
@@ -262,4 +263,27 @@ public class TraitSetter {
area.addTrait(Trait.BREAK_AFTER, new Integer(breakAfter));
area.addTrait(Trait.BREAK_BEFORE, new Integer(breakBefore));
}
/**
* Adds the text-decoration traits to the area.
* @param area the area to set the traits on
* @param deco the text decorations
*/
public static void addTextDecoration(Area area, CommonTextDecoration deco) {
//TODO Finish text-decoration
if (deco != null) {
if (deco.hasUnderline()) {
area.addTrait(Trait.UNDERLINE, Boolean.TRUE);
}
if (deco.hasOverline()) {
area.addTrait(Trait.OVERLINE, Boolean.TRUE);
}
if (deco.hasLineThrough()) {
area.addTrait(Trait.LINETHROUGH, Boolean.TRUE);
}
if (deco.isBlinking()) {
area.addTrait(Trait.BLINK, Boolean.TRUE);
}
}
}
}

+ 38
- 1
src/java/org/apache/fop/render/pdf/PDFRenderer.java View File

@@ -50,6 +50,7 @@ import org.apache.fop.area.Trait;
import org.apache.fop.area.OffDocumentItem;
import org.apache.fop.area.BookmarkData;
import org.apache.fop.area.inline.Character;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.TextArea;
import org.apache.fop.area.inline.Viewport;
import org.apache.fop.area.inline.ForeignObject;
@@ -1041,6 +1042,8 @@ public class PDFRenderer extends PrintRenderer {

currentStream.add(pdf.toString());

renderTextDecoration(fs, ch, bl, rx);
super.renderCharacter(ch);
}

@@ -1053,7 +1056,7 @@ public class PDFRenderer extends PrintRenderer {

String name = (String) text.getTrait(Trait.FONT_NAME);
int size = ((Integer) text.getTrait(Trait.FONT_SIZE)).intValue();
// This assumes that *all* CIDFonts use a /ToUnicode mapping
Typeface f = (Typeface) fontInfo.getFonts().get(name);
boolean useMultiByte = f.isMultiByte();
@@ -1112,8 +1115,42 @@ public class PDFRenderer extends PrintRenderer {

currentStream.add(pdf.toString());

renderTextDecoration(fs, text, bl, rx);
super.renderText(text);
}
/**
* Paints the text decoration marks.
* @param fs Current font
* @param inline inline area to paint the marks for
* @param baseline position of the baseline
* @param startx start IPD
*/
protected void renderTextDecoration(Font fs, InlineArea inline,
int baseline, int startx) {
boolean hasTextDeco = inline.hasUnderline()
|| inline.hasOverline()
|| inline.hasLineThrough();
if (hasTextDeco) {
endTextObject();
updateLineStyle(Constants.EN_SOLID);
updateLineWidth(fs.getDescender() / -8 / 1000f);
float endx = (startx + inline.getIPD()) / 1000f;
if (inline.hasUnderline()) {
float y = baseline - fs.getDescender() / 2;
drawLine(startx / 1000f, y / 1000f, endx, y / 1000f);
}
if (inline.hasOverline()) {
float y = (float)(baseline - (1.1 * fs.getCapHeight()));
drawLine(startx / 1000f, y / 1000f, endx, y / 1000f);
}
if (inline.hasLineThrough()) {
float y = (float)(baseline - (0.45 * fs.getCapHeight()));
drawLine(startx / 1000f, y / 1000f, endx, y / 1000f);
}
}
}

/**
* Escapes text according to PDF rules.

+ 6
- 3
src/java/org/apache/fop/render/rtf/TextAttributesConverter.java View File

@@ -94,7 +94,8 @@ class TextAttributesConverter {
FOPRtfAttributes attrib = new FOPRtfAttributes();
attrFont(fobj.getCommonFont(), attrib);
attrFontColor(fobj.getColor(), attrib);
attrTextDecoration(fobj.getTextDecoration(), attrib);
//TODO Fix text-decoration here!
//attrTextDecoration(fobj.getTextDecoration(), attrib);

attrBackgroundColor(fobj.getCommonBorderPaddingBackground(), attrib);
return attrib;
@@ -109,7 +110,8 @@ class TextAttributesConverter {

FOPRtfAttributes attrib = new FOPRtfAttributes();
attrFont(fobj.getCommonFont(), attrib);
attrTextDecoration(fobj.getTextDecoration(), attrib);
//TODO Fix text-decoration here!
//attrTextDecoration(fobj.getTextDecoration(), attrib);
attrBackgroundColor(fobj.getCommonBorderPaddingBackground(), attrib);
return attrib;
}
@@ -124,7 +126,8 @@ class TextAttributesConverter {
FOPRtfAttributes attrib = new FOPRtfAttributes();
attrFont(fobj.getCommonFont(), attrib);
attrFontColor(fobj.getColor(), attrib);
attrTextDecoration(fobj.getTextDecoration(), attrib);
//TODO Fix text-decoration here!
//attrTextDecoration(fobj.getTextDecoration(), attrib);
attrBackgroundColor(fobj.getCommonBorderPaddingBackground(), attrib);
return attrib;
}

Loading…
Cancel
Save