add Colorref structure and use it to store color information in CHP(X)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1150606 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
50fa09aab8
commit
676c39dad0
108
src/scratchpad/src/org/apache/poi/hwpf/model/Colorref.java
Normal file
108
src/scratchpad/src/org/apache/poi/hwpf/model/Colorref.java
Normal file
@ -0,0 +1,108 @@
|
||||
/* ====================================================================
|
||||
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.
|
||||
==================================================================== */
|
||||
package org.apache.poi.hwpf.model;
|
||||
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
/**
|
||||
* 24-bit color structure
|
||||
*
|
||||
* @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
|
||||
*/
|
||||
@Internal
|
||||
public class Colorref implements Cloneable
|
||||
{
|
||||
private int value;
|
||||
|
||||
public Colorref()
|
||||
{
|
||||
this.value = -1;
|
||||
}
|
||||
|
||||
public Colorref( byte[] data, int offset )
|
||||
{
|
||||
this.value = LittleEndian.getInt( data, offset );
|
||||
}
|
||||
|
||||
public Colorref( int value )
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Colorref clone() throws CloneNotSupportedException
|
||||
{
|
||||
return new Colorref( this.value );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( Object obj )
|
||||
{
|
||||
if ( this == obj )
|
||||
return true;
|
||||
if ( obj == null )
|
||||
return false;
|
||||
if ( getClass() != obj.getClass() )
|
||||
return false;
|
||||
Colorref other = (Colorref) obj;
|
||||
if ( value != other.value )
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean isEmpty()
|
||||
{
|
||||
return value == -1;
|
||||
}
|
||||
|
||||
public void setValue( int value )
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public byte[] toByteArray()
|
||||
{
|
||||
if ( isEmpty() )
|
||||
throw new IllegalStateException(
|
||||
"Structure state (EMPTY) is not good for serialization" );
|
||||
|
||||
byte[] bs = new byte[4];
|
||||
LittleEndian.putInt( bs, 0, this.value );
|
||||
return bs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if ( isEmpty() )
|
||||
return "[COLORREF] EMPTY";
|
||||
|
||||
return "[COLORREF] 0x" + Integer.toHexString( value );
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -275,10 +275,12 @@ public final class CharacterSprmCompressor
|
||||
{
|
||||
size += SprmUtils.addSprm((short)0x2859, newCHP.getSfxtText(), null, sprmList);
|
||||
}
|
||||
if (newCHP.getIco24() != oldCHP.getIco24())
|
||||
if ( !newCHP.getCv().equals( oldCHP.getCv() ) )
|
||||
{
|
||||
if(newCHP.getIco24() != -1) // don't add a sprm if we're looking at an ico = Auto
|
||||
size += SprmUtils.addSprm((short)0x6870, newCHP.getIco24(), null, sprmList);
|
||||
// don't add a sprm if we're looking at an ico = Auto
|
||||
if ( !newCHP.getCv().isEmpty() )
|
||||
size += SprmUtils.addSprm( CharacterProperties.SPRM_CCV, newCHP
|
||||
.getCv().getValue(), null, sprmList );
|
||||
}
|
||||
|
||||
return SprmUtils.getGrpprl(sprmList, size);
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
package org.apache.poi.hwpf.sprm;
|
||||
|
||||
import org.apache.poi.hwpf.model.Colorref;
|
||||
import org.apache.poi.hwpf.model.Hyphenation;
|
||||
import org.apache.poi.hwpf.usermodel.BorderCode;
|
||||
import org.apache.poi.hwpf.usermodel.CharacterProperties;
|
||||
@ -602,7 +603,8 @@ public final class CharacterSprmUncompressor extends SprmUncompressor
|
||||
newCHP.setIdctHint ((byte) sprm.getOperand());
|
||||
break;
|
||||
case 0x70:
|
||||
newCHP.setIco24 (sprm.getOperand());
|
||||
// sprmCCv -- 0x6870
|
||||
newCHP.setCv( new Colorref( sprm.getOperand() ) );
|
||||
break;
|
||||
case 0x71:
|
||||
// sprmCShd
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
package org.apache.poi.hwpf.usermodel;
|
||||
|
||||
import org.apache.poi.hwpf.model.Colorref;
|
||||
import org.apache.poi.hwpf.model.types.CHPAbstractType;
|
||||
|
||||
/**
|
||||
@ -65,6 +66,10 @@ public final class CharacterProperties
|
||||
public final static short SPRM_PROPRMARK = (short)0xCA57;
|
||||
public final static short SPRM_FEMBOSS = 0x0858;
|
||||
public final static short SPRM_SFXTEXT = 0x2859;
|
||||
/*
|
||||
* Microsoft Office Word 97-2007 Binary File Format (.doc) Specification;
|
||||
* Page 60 of 210
|
||||
*/
|
||||
public final static short SPRM_DISPFLDRMARK = (short)0xCA62;
|
||||
public final static short SPRM_IBSTRMARKDEL = 0x4863;
|
||||
public final static short SPRM_DTTMRMARKDEL = 0x6864;
|
||||
@ -75,8 +80,10 @@ public final class CharacterProperties
|
||||
public final static short SPRM_NONFELID = 0x486D;
|
||||
public final static short SPRM_FELID = 0x486E;
|
||||
public final static short SPRM_IDCTHINT = 0x286F;
|
||||
|
||||
int _ico24 = -1; // default to -1 so we can ignore it for word 97 files
|
||||
/**
|
||||
* change chp.cv
|
||||
*/
|
||||
public final static short SPRM_CCV = 0x6870;
|
||||
|
||||
public CharacterProperties()
|
||||
{
|
||||
@ -310,61 +317,64 @@ public final class CharacterProperties
|
||||
*/
|
||||
public int getIco24()
|
||||
{
|
||||
if ( _ico24 == -1 )
|
||||
{
|
||||
switch(getIco()) // convert word 97 colour numbers to 0xBBGGRR value
|
||||
if ( !getCv().isEmpty() )
|
||||
return getCv().getValue();
|
||||
|
||||
// convert word 97 colour numbers to 0xBBRRGGRR value
|
||||
switch ( getIco() )
|
||||
{
|
||||
case 0: // auto
|
||||
return -1;
|
||||
case 1: // black
|
||||
return 0x000000;
|
||||
return 0x00000000;
|
||||
case 2: // blue
|
||||
return 0xFF0000;
|
||||
return 0x00FF0000;
|
||||
case 3: // cyan
|
||||
return 0xFFFF00;
|
||||
return 0x00FFFF00;
|
||||
case 4: // green
|
||||
return 0x00FF00;
|
||||
return 0x0000FF00;
|
||||
case 5: // magenta
|
||||
return 0xFF00FF;
|
||||
return 0x00FF00FF;
|
||||
case 6: // red
|
||||
return 0x0000FF;
|
||||
return 0x000000FF;
|
||||
case 7: // yellow
|
||||
return 0x00FFFF;
|
||||
return 0x0000FFFF;
|
||||
case 8: // white
|
||||
return 0x0FFFFFF;
|
||||
return 0x00FFFFFF;
|
||||
case 9: // dark blue
|
||||
return 0x800000;
|
||||
return 0x00800000;
|
||||
case 10: // dark cyan
|
||||
return 0x808000;
|
||||
return 0x00808000;
|
||||
case 11: // dark green
|
||||
return 0x008000;
|
||||
return 0x00008000;
|
||||
case 12: // dark magenta
|
||||
return 0x800080;
|
||||
return 0x00800080;
|
||||
case 13: // dark red
|
||||
return 0x000080;
|
||||
return 0x00000080;
|
||||
case 14: // dark yellow
|
||||
return 0x008080;
|
||||
return 0x00008080;
|
||||
case 15: // dark grey
|
||||
return 0x808080;
|
||||
return 0x00808080;
|
||||
case 16: // light grey
|
||||
return 0xC0C0C0;
|
||||
return 0x00C0C0C0;
|
||||
}
|
||||
}
|
||||
return _ico24;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the ico24 field for the CHP record.
|
||||
*/
|
||||
public void setIco24(int colour24)
|
||||
public void setIco24( int colour24 )
|
||||
{
|
||||
_ico24 = colour24 & 0xFFFFFF; // only keep the 24bit 0xBBGGRR colour
|
||||
setCv( new Colorref( colour24 & 0xFFFFFF ) );
|
||||
}
|
||||
|
||||
public Object clone() throws CloneNotSupportedException
|
||||
{
|
||||
CharacterProperties cp = (CharacterProperties) super.clone();
|
||||
|
||||
cp.setCv( getCv().clone() );
|
||||
cp.setDttmRMark( (DateAndTime) getDttmRMark().clone() );
|
||||
cp.setDttmRMarkDel( (DateAndTime) getDttmRMarkDel().clone() );
|
||||
cp.setDttmPropRMark( (DateAndTime) getDttmPropRMark().clone() );
|
||||
@ -373,8 +383,6 @@ public final class CharacterProperties
|
||||
cp.setShd( (ShadingDescriptor) getShd().clone() );
|
||||
cp.setBrc( (BorderCode) getBrc().clone() );
|
||||
|
||||
cp._ico24 = _ico24;
|
||||
|
||||
return cp;
|
||||
}
|
||||
}
|
||||
|
@ -79,7 +79,8 @@
|
||||
<!-- rgftc[iftcCompositeMax] -->
|
||||
<field type="int" size="4" name="dxaSpace"
|
||||
description="Space following each character in the run expressed in twip units."/>
|
||||
<!-- cv -->
|
||||
|
||||
<field type="Colorref" size="4" name="cv" description="24-bit color"/>
|
||||
|
||||
<!-- Microsoft Office Word 97-2007 Binary File Format (.doc) Specification -->
|
||||
<!-- Page 104 of 210 -->
|
||||
|
Loading…
Reference in New Issue
Block a user