mirror of https://github.com/apache/poi.git
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
62d7a21e94
commit
55ed7e8d77
|
@ -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);
|
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
|
// don't add a sprm if we're looking at an ico = Auto
|
||||||
size += SprmUtils.addSprm((short)0x6870, newCHP.getIco24(), null, sprmList);
|
if ( !newCHP.getCv().isEmpty() )
|
||||||
|
size += SprmUtils.addSprm( CharacterProperties.SPRM_CCV, newCHP
|
||||||
|
.getCv().getValue(), null, sprmList );
|
||||||
}
|
}
|
||||||
|
|
||||||
return SprmUtils.getGrpprl(sprmList, size);
|
return SprmUtils.getGrpprl(sprmList, size);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.apache.poi.hwpf.sprm;
|
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.model.Hyphenation;
|
||||||
import org.apache.poi.hwpf.usermodel.BorderCode;
|
import org.apache.poi.hwpf.usermodel.BorderCode;
|
||||||
import org.apache.poi.hwpf.usermodel.CharacterProperties;
|
import org.apache.poi.hwpf.usermodel.CharacterProperties;
|
||||||
|
@ -602,7 +603,8 @@ public final class CharacterSprmUncompressor extends SprmUncompressor
|
||||||
newCHP.setIdctHint ((byte) sprm.getOperand());
|
newCHP.setIdctHint ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x70:
|
case 0x70:
|
||||||
newCHP.setIco24 (sprm.getOperand());
|
// sprmCCv -- 0x6870
|
||||||
|
newCHP.setCv( new Colorref( sprm.getOperand() ) );
|
||||||
break;
|
break;
|
||||||
case 0x71:
|
case 0x71:
|
||||||
// sprmCShd
|
// sprmCShd
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.apache.poi.hwpf.usermodel;
|
package org.apache.poi.hwpf.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.model.Colorref;
|
||||||
import org.apache.poi.hwpf.model.types.CHPAbstractType;
|
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_PROPRMARK = (short)0xCA57;
|
||||||
public final static short SPRM_FEMBOSS = 0x0858;
|
public final static short SPRM_FEMBOSS = 0x0858;
|
||||||
public final static short SPRM_SFXTEXT = 0x2859;
|
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_DISPFLDRMARK = (short)0xCA62;
|
||||||
public final static short SPRM_IBSTRMARKDEL = 0x4863;
|
public final static short SPRM_IBSTRMARKDEL = 0x4863;
|
||||||
public final static short SPRM_DTTMRMARKDEL = 0x6864;
|
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_NONFELID = 0x486D;
|
||||||
public final static short SPRM_FELID = 0x486E;
|
public final static short SPRM_FELID = 0x486E;
|
||||||
public final static short SPRM_IDCTHINT = 0x286F;
|
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()
|
public CharacterProperties()
|
||||||
{
|
{
|
||||||
|
@ -310,61 +317,64 @@ public final class CharacterProperties
|
||||||
*/
|
*/
|
||||||
public int getIco24()
|
public int getIco24()
|
||||||
{
|
{
|
||||||
if ( _ico24 == -1 )
|
if ( !getCv().isEmpty() )
|
||||||
{
|
return getCv().getValue();
|
||||||
switch(getIco()) // convert word 97 colour numbers to 0xBBGGRR value
|
|
||||||
|
// convert word 97 colour numbers to 0xBBRRGGRR value
|
||||||
|
switch ( getIco() )
|
||||||
{
|
{
|
||||||
case 0: // auto
|
case 0: // auto
|
||||||
return -1;
|
return -1;
|
||||||
case 1: // black
|
case 1: // black
|
||||||
return 0x000000;
|
return 0x00000000;
|
||||||
case 2: // blue
|
case 2: // blue
|
||||||
return 0xFF0000;
|
return 0x00FF0000;
|
||||||
case 3: // cyan
|
case 3: // cyan
|
||||||
return 0xFFFF00;
|
return 0x00FFFF00;
|
||||||
case 4: // green
|
case 4: // green
|
||||||
return 0x00FF00;
|
return 0x0000FF00;
|
||||||
case 5: // magenta
|
case 5: // magenta
|
||||||
return 0xFF00FF;
|
return 0x00FF00FF;
|
||||||
case 6: // red
|
case 6: // red
|
||||||
return 0x0000FF;
|
return 0x000000FF;
|
||||||
case 7: // yellow
|
case 7: // yellow
|
||||||
return 0x00FFFF;
|
return 0x0000FFFF;
|
||||||
case 8: // white
|
case 8: // white
|
||||||
return 0x0FFFFFF;
|
return 0x00FFFFFF;
|
||||||
case 9: // dark blue
|
case 9: // dark blue
|
||||||
return 0x800000;
|
return 0x00800000;
|
||||||
case 10: // dark cyan
|
case 10: // dark cyan
|
||||||
return 0x808000;
|
return 0x00808000;
|
||||||
case 11: // dark green
|
case 11: // dark green
|
||||||
return 0x008000;
|
return 0x00008000;
|
||||||
case 12: // dark magenta
|
case 12: // dark magenta
|
||||||
return 0x800080;
|
return 0x00800080;
|
||||||
case 13: // dark red
|
case 13: // dark red
|
||||||
return 0x000080;
|
return 0x00000080;
|
||||||
case 14: // dark yellow
|
case 14: // dark yellow
|
||||||
return 0x008080;
|
return 0x00008080;
|
||||||
case 15: // dark grey
|
case 15: // dark grey
|
||||||
return 0x808080;
|
return 0x00808080;
|
||||||
case 16: // light grey
|
case 16: // light grey
|
||||||
return 0xC0C0C0;
|
return 0x00C0C0C0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return _ico24;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ico24 field for the CHP record.
|
* 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
|
public Object clone() throws CloneNotSupportedException
|
||||||
{
|
{
|
||||||
CharacterProperties cp = (CharacterProperties) super.clone();
|
CharacterProperties cp = (CharacterProperties) super.clone();
|
||||||
|
|
||||||
|
cp.setCv( getCv().clone() );
|
||||||
cp.setDttmRMark( (DateAndTime) getDttmRMark().clone() );
|
cp.setDttmRMark( (DateAndTime) getDttmRMark().clone() );
|
||||||
cp.setDttmRMarkDel( (DateAndTime) getDttmRMarkDel().clone() );
|
cp.setDttmRMarkDel( (DateAndTime) getDttmRMarkDel().clone() );
|
||||||
cp.setDttmPropRMark( (DateAndTime) getDttmPropRMark().clone() );
|
cp.setDttmPropRMark( (DateAndTime) getDttmPropRMark().clone() );
|
||||||
|
@ -373,8 +383,6 @@ public final class CharacterProperties
|
||||||
cp.setShd( (ShadingDescriptor) getShd().clone() );
|
cp.setShd( (ShadingDescriptor) getShd().clone() );
|
||||||
cp.setBrc( (BorderCode) getBrc().clone() );
|
cp.setBrc( (BorderCode) getBrc().clone() );
|
||||||
|
|
||||||
cp._ico24 = _ico24;
|
|
||||||
|
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,8 @@
|
||||||
<!-- rgftc[iftcCompositeMax] -->
|
<!-- rgftc[iftcCompositeMax] -->
|
||||||
<field type="int" size="4" name="dxaSpace"
|
<field type="int" size="4" name="dxaSpace"
|
||||||
description="Space following each character in the run expressed in twip units."/>
|
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 -->
|
<!-- Microsoft Office Word 97-2007 Binary File Format (.doc) Specification -->
|
||||||
<!-- Page 104 of 210 -->
|
<!-- Page 104 of 210 -->
|
||||||
|
|
Loading…
Reference in New Issue