org.apache.fop.render.txt.border.SolidAndDoubleBorderElement Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fop Show documentation
Show all versions of fop Show documentation
Apache FOP (Formatting Objects Processor) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, AFP, TIFF, PNG, SVG, XML (area tree representation), Print, AWT and TXT. The primary output target is PDF.
/*
* 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: SolidAndDoubleBorderElement.java 679326 2008-07-24 09:35:34Z vhennebert $ */
package org.apache.fop.render.txt.border;
import java.util.Arrays;
/**
* This class is responsible for solid and double border elements managing.
*/
public class SolidAndDoubleBorderElement extends AbstractBorderElement {
private static final char LIGHT_HORIZONTAL = '\u2500';
private static final char LIGHT_VERTICAL = '\u2502';
private static final char LIGHT_DOWN_AND_RIGHT = '\u250C';
private static final char LIGHT_DOWN_AND_LEFT = '\u2510';
private static final char LIGHT_UP_AND_RIGHT = '\u2514';
private static final char LIGHT_UP_AND_LEFT = '\u2518';
private static final char LIGHT_VERTICAL_AND_RIGHT = '\u251C';
private static final char LIGHT_VERTICAL_AND_LEFT = '\u2524';
private static final char LIGHT_DOWN_AND_HORIZONTAL = '\u252C';
private static final char LIGHT_UP_AND_HORIZONTAL = '\u2534';
private static final char LIGHT_VERTICAL_AND_HORIZONTAL = '\u253C';
private static final char DOUBLE_HORIZONTAL = '\u2550';
private static final char DOUBLE_VERTICAL = '\u2551';
private static final char DOUBLE_DOWN_AND_RIGHT = '\u2554';
private static final char DOUBLE_DOWN_AND_LEFT = '\u2557';
private static final char DOUBLE_UP_AND_RIGHT = '\u255A';
private static final char DOUBLE_UP_AND_LEFT = '\u255D';
private static final char DOUBLE_VERTICAL_AND_RIGHT = '\u2560';
private static final char DOUBLE_VERTICAL_AND_LEFT = '\u2563';
private static final char DOUBLE_DOWN_AND_HORIZONTAL = '\u2566';
private static final char DOUBLE_UP_AND_HORIZONTAL = '\u2569';
private static final char DOUBLE_VERTICAL_AND_HORIZONTAL = '\u256C';
private static final char DOWN_SINGLE_AND_RIGHT_DOUBLE = '\u2552';
private static final char DOWN_DOUBLE_AND_RIGHT_SINGLE = '\u2553';
private static final char DOWN_SINGLE_AND_LEFT_DOUBLE = '\u2555';
private static final char DOWN_DOUBLE_AND_LEFT_SINGLE = '\u2556';
private static final char UP_SINGLE_AND_RIGHT_DOUBLE = '\u2558';
private static final char UP_DOUBLE_AND_RIGHT_SINGLE = '\u2559';
private static final char UP_SINGLE_AND_LEFT_DOUBLE = '\u255B';
private static final char UP_DOUBLE_AND_LEFT_SINGLE = '\u255C';
private static final char VERTICAL_SINGLE_AND_RIGHT_DOUBLE = '\u255E';
private static final char VERTICAL_DOUBLE_AND_RIGHT_SINGLE = '\u255F';
private static final char VERTICAL_SINGLE_AND_LEFT_DOUBLE = '\u2561';
private static final char VERTICAL_DOUBLE_AND_LEFT_SINGLE = '\u2562';
private static final char DOWN_SINGLE_AND_HORIZONTAL_DOUBLE = '\u2564';
private static final char DOWN_DOUBLE_AND_HORIZONTAL_SINGLE = '\u2565';
private static final char UP_SINGLE_AND_HORIZONTAL_DOUBLE = '\u2567';
private static final char UP_DOUBLE_AND_HORIZONTAL_SINGLE = '\u2568';
private static final char VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE = '\u256A';
private static final char VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE = '\u256B';
private static final char UNDEFINED = '?';
private static final int UP3 = 1;
private static final int DOWN3 = 3;
private static final int LEFT3 = 9;
private static final int RIGHT3 = 27;
private static final char[] MAP = new char[100];
static {
Arrays.fill(MAP, UNDEFINED);
MAP[0] = ' ';
MAP[UP3] = LIGHT_VERTICAL;
MAP[DOWN3] = LIGHT_VERTICAL;
MAP[RIGHT3] = LIGHT_HORIZONTAL;
MAP[LEFT3] = LIGHT_HORIZONTAL;
MAP[UP3 + DOWN3] = LIGHT_VERTICAL;
MAP[LEFT3 + RIGHT3] = LIGHT_HORIZONTAL;
MAP[UP3 + LEFT3] = LIGHT_UP_AND_LEFT;
MAP[LEFT3 + DOWN3] = LIGHT_DOWN_AND_LEFT;
MAP[DOWN3 + RIGHT3] = LIGHT_DOWN_AND_RIGHT;
MAP[UP3 + RIGHT3] = LIGHT_UP_AND_RIGHT;
MAP[UP3 + DOWN3 + RIGHT3] = LIGHT_VERTICAL_AND_RIGHT;
MAP[UP3 + LEFT3 + DOWN3] = LIGHT_VERTICAL_AND_LEFT;
MAP[LEFT3 + DOWN3 + RIGHT3] = LIGHT_DOWN_AND_HORIZONTAL;
MAP[UP3 + LEFT3 + RIGHT3] = LIGHT_UP_AND_HORIZONTAL;
MAP[UP3 + LEFT3 + DOWN3 + RIGHT3] = LIGHT_VERTICAL_AND_HORIZONTAL;
//DOUBLE
MAP[2 * UP3] = DOUBLE_VERTICAL;
MAP[2 * DOWN3] = DOUBLE_VERTICAL;
MAP[2 * RIGHT3] = DOUBLE_HORIZONTAL;
MAP[2 * LEFT3] = DOUBLE_HORIZONTAL;
MAP[2 * UP3 + 2 * DOWN3] = DOUBLE_VERTICAL;
MAP[2 * LEFT3 + 2 * RIGHT3] = DOUBLE_HORIZONTAL;
MAP[2 * UP3 + 2 * LEFT3] = DOUBLE_UP_AND_LEFT;
MAP[2 * LEFT3 + 2 * DOWN3] = DOUBLE_DOWN_AND_LEFT;
MAP[2 * DOWN3 + 2 * RIGHT3] = DOUBLE_DOWN_AND_RIGHT;
MAP[2 * UP3 + 2 * RIGHT3] = DOUBLE_UP_AND_RIGHT;
MAP[2 * UP3 + 2 * DOWN3 + 2 * RIGHT3] = DOUBLE_VERTICAL_AND_RIGHT;
MAP[2 * UP3 + 2 * DOWN3 + 2 * LEFT3] = DOUBLE_VERTICAL_AND_LEFT;
MAP[2 * DOWN3 + 2 * RIGHT3 + 2 * LEFT3] = DOUBLE_DOWN_AND_HORIZONTAL;
MAP[2 * UP3 + 2 * RIGHT3 + 2 * LEFT3] = DOUBLE_UP_AND_HORIZONTAL;
MAP[2 * UP3 + 2 * DOWN3 + 2 * RIGHT3 + 2 * LEFT3] = DOUBLE_VERTICAL_AND_HORIZONTAL;
//DOUBLE&SINGLE
MAP[DOWN3 + 2 * RIGHT3] = DOWN_SINGLE_AND_RIGHT_DOUBLE;
MAP[2 * DOWN3 + RIGHT3] = DOWN_DOUBLE_AND_RIGHT_SINGLE;
MAP[DOWN3 + 2 * LEFT3] = DOWN_SINGLE_AND_LEFT_DOUBLE;
MAP[2 * DOWN3 + LEFT3] = DOWN_DOUBLE_AND_LEFT_SINGLE;
MAP[UP3 + 2 * RIGHT3] = UP_SINGLE_AND_RIGHT_DOUBLE;
MAP[2 * UP3 + RIGHT3] = UP_DOUBLE_AND_RIGHT_SINGLE;
MAP[UP3 + 2 * LEFT3] = UP_SINGLE_AND_LEFT_DOUBLE;
MAP[2 * UP3 + LEFT3] = UP_DOUBLE_AND_LEFT_SINGLE;
MAP[UP3 + DOWN3 + 2 * RIGHT3] = VERTICAL_SINGLE_AND_RIGHT_DOUBLE;
MAP[2 * UP3 + 2 * DOWN3 + RIGHT3] = VERTICAL_DOUBLE_AND_RIGHT_SINGLE;
MAP[UP3 + DOWN3 + 2 * LEFT3] = VERTICAL_SINGLE_AND_LEFT_DOUBLE;
MAP[2 * UP3 + 2 * DOWN3 + LEFT3] = VERTICAL_DOUBLE_AND_LEFT_SINGLE;
MAP[DOWN3 + 2 * LEFT3 + 2 * RIGHT3] = DOWN_SINGLE_AND_HORIZONTAL_DOUBLE;
MAP[2 * DOWN3 + LEFT3 + RIGHT3] = DOWN_DOUBLE_AND_HORIZONTAL_SINGLE;
MAP[UP3 + 2 * LEFT3 + 2 * RIGHT3] = UP_SINGLE_AND_HORIZONTAL_DOUBLE;
MAP[2 * UP3 + LEFT3 + RIGHT3] = UP_DOUBLE_AND_HORIZONTAL_SINGLE;
MAP[UP3 + DOWN3 + 2 * LEFT3 + 2 * RIGHT3] = VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE;
MAP[2 * UP3 + 2 * DOWN3 + LEFT3 + RIGHT3] = VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE;
}
/**
* Initializes a newly created SolidAndDoubleBorderElement
* object so that it represents an empty border element.
*/
public SolidAndDoubleBorderElement() {
}
/**
* Constructs a newly allocated SolidAndDoubleBorderElement
* object. Fills data
using binary representation of
* type
. If border style is EN_DOUBLE, multiplies
* data[side]
by 2 for every side to distinguish EN_SOLID and
* EN_DOUBLE.
*
* @param style integer, representing border style.
* @param type binary representation of type gives data
*/
public SolidAndDoubleBorderElement(int style, int type) {
super(type);
if (style == EN_DOUBLE) {
for (int i = 0; i < 4; i++) {
data[i] *= 2;
}
}
}
/**
* Merges with sde
.
* @param sde instance of SolidAndDoubleBorderElement
* @return instance of AbstractBorderElement
*/
public AbstractBorderElement mergeSolid(SolidAndDoubleBorderElement sde) {
AbstractBorderElement e = new SolidAndDoubleBorderElement(EN_SOLID, 0);
for (int i = 0; i < 4; i++) {
if (sde.getData(i) != 0) {
e.setData(i, sde.getData(i));
} else {
e.setData(i, data[i]);
}
}
return e;
}
/**
* Merges with e.
* @param e instance of AbstractBorderElement
* @return instance of AbstractBorderElement
*/
public AbstractBorderElement merge(AbstractBorderElement e) {
AbstractBorderElement abe = this;
if (e instanceof SolidAndDoubleBorderElement) {
abe = mergeSolid((SolidAndDoubleBorderElement) e);
} else if (e instanceof DottedBorderElement) {
abe = e;
} else if (e instanceof DashedBorderElement) {
abe = e.merge(this);
}
return abe;
}
/**
* Maps to char.
* @return resulting mapping char
*/
private char map2Char() {
int key = 0;
key += data[UP] * UP3;
key += data[LEFT] * LEFT3;
key += data[DOWN] * DOWN3;
key += data[RIGHT] * RIGHT3;
return MAP[key];
}
/**
* Modifies data to nearest normal internal representation.
*/
private void modifyData() {
int c1 = 0;
int c2 = 0;
for (int i = 0; i < 4; i++) {
c1 += (data[i] == 1) ? 1 : 0;
c2 += (data[i] == 2) ? 1 : 0;
}
int m = c1 > c2 ? 1 : 0;
int[] p = {0, m, 2 * (1 - m)};
for (int i = 0; i < 4; i++) {
data[i] = p[data[i]];
}
}
/**
* {@inheritDoc}
*/
public char convert2Char() {
char ch = map2Char();
if (ch == UNDEFINED) {
modifyData();
ch = map2Char();
}
return ch;
}
}