222 lines
7.5 KiB
Java
222 lines
7.5 KiB
Java
/* ====================================================================
|
|
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.hslf.record;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
|
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
|
import org.apache.poi.util.LittleEndian;
|
|
|
|
/**
|
|
* A ColorSchemeAtom (type 2032). Holds the 8 RGB values for the different
|
|
* colours of bits of text, that makes up a given colour scheme.
|
|
* Slides (presumably) link to a given colour scheme atom, and that
|
|
* defines the colours to be used
|
|
*
|
|
* @author Nick Burch
|
|
*/
|
|
public final class ColorSchemeAtom extends RecordAtom {
|
|
private byte[] _header;
|
|
private static long _type = 2032l;
|
|
|
|
private int backgroundColourRGB;
|
|
private int textAndLinesColourRGB;
|
|
private int shadowsColourRGB;
|
|
private int titleTextColourRGB;
|
|
private int fillsColourRGB;
|
|
private int accentColourRGB;
|
|
private int accentAndHyperlinkColourRGB;
|
|
private int accentAndFollowingHyperlinkColourRGB;
|
|
|
|
/** Fetch the RGB value for Background Colour */
|
|
public int getBackgroundColourRGB() { return backgroundColourRGB; }
|
|
/** Set the RGB value for Background Colour */
|
|
public void setBackgroundColourRGB(int rgb) { backgroundColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Text And Lines Colour */
|
|
public int getTextAndLinesColourRGB() { return textAndLinesColourRGB; }
|
|
/** Set the RGB value for Text And Lines Colour */
|
|
public void setTextAndLinesColourRGB(int rgb) { textAndLinesColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Shadows Colour */
|
|
public int getShadowsColourRGB() { return shadowsColourRGB; }
|
|
/** Set the RGB value for Shadows Colour */
|
|
public void setShadowsColourRGB(int rgb) { shadowsColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Title Text Colour */
|
|
public int getTitleTextColourRGB() { return titleTextColourRGB; }
|
|
/** Set the RGB value for Title Text Colour */
|
|
public void setTitleTextColourRGB(int rgb) { titleTextColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Fills Colour */
|
|
public int getFillsColourRGB() { return fillsColourRGB; }
|
|
/** Set the RGB value for Fills Colour */
|
|
public void setFillsColourRGB(int rgb) { fillsColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Accent Colour */
|
|
public int getAccentColourRGB() { return accentColourRGB; }
|
|
/** Set the RGB value for Accent Colour */
|
|
public void setAccentColourRGB(int rgb) { accentColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Accent And Hyperlink Colour */
|
|
public int getAccentAndHyperlinkColourRGB()
|
|
{ return accentAndHyperlinkColourRGB; }
|
|
/** Set the RGB value for Accent And Hyperlink Colour */
|
|
public void setAccentAndHyperlinkColourRGB(int rgb)
|
|
{ accentAndHyperlinkColourRGB = rgb; }
|
|
|
|
/** Fetch the RGB value for Accent And Following Hyperlink Colour */
|
|
public int getAccentAndFollowingHyperlinkColourRGB()
|
|
{ return accentAndFollowingHyperlinkColourRGB; }
|
|
/** Set the RGB value for Accent And Following Hyperlink Colour */
|
|
public void setAccentAndFollowingHyperlinkColourRGB(int rgb)
|
|
{ accentAndFollowingHyperlinkColourRGB = rgb; }
|
|
|
|
/* *************** record code follows ********************** */
|
|
|
|
/**
|
|
* For the Colour Scheme (ColorSchem) Atom
|
|
*/
|
|
protected ColorSchemeAtom(byte[] source, int start, int len) {
|
|
// Sanity Checking - we're always 40 bytes long
|
|
if(len < 40) {
|
|
len = 40;
|
|
if(source.length - start < 40) {
|
|
throw new HSLFException("Not enough data to form a ColorSchemeAtom (always 40 bytes long) - found " + (source.length - start));
|
|
}
|
|
}
|
|
|
|
// Get the header
|
|
_header = new byte[8];
|
|
System.arraycopy(source,start,_header,0,8);
|
|
|
|
// Grab the rgb values
|
|
backgroundColourRGB = LittleEndian.getInt(source,start+8+0);
|
|
textAndLinesColourRGB = LittleEndian.getInt(source,start+8+4);
|
|
shadowsColourRGB = LittleEndian.getInt(source,start+8+8);
|
|
titleTextColourRGB = LittleEndian.getInt(source,start+8+12);
|
|
fillsColourRGB = LittleEndian.getInt(source,start+8+16);
|
|
accentColourRGB = LittleEndian.getInt(source,start+8+20);
|
|
accentAndHyperlinkColourRGB = LittleEndian.getInt(source,start+8+24);
|
|
accentAndFollowingHyperlinkColourRGB = LittleEndian.getInt(source,start+8+28);
|
|
}
|
|
|
|
/**
|
|
* Create a new ColorSchemeAtom, to go with a new Slide
|
|
*/
|
|
public ColorSchemeAtom(){
|
|
_header = new byte[8];
|
|
LittleEndian.putUShort(_header, 0, 16);
|
|
LittleEndian.putUShort(_header, 2, (int)_type);
|
|
LittleEndian.putInt(_header, 4, 32);
|
|
|
|
// Setup the default rgb values
|
|
backgroundColourRGB = 16777215;
|
|
textAndLinesColourRGB = 0;
|
|
shadowsColourRGB = 8421504;
|
|
titleTextColourRGB = 0;
|
|
fillsColourRGB = 10079232;
|
|
accentColourRGB = 13382451;
|
|
accentAndHyperlinkColourRGB = 16764108;
|
|
accentAndFollowingHyperlinkColourRGB = 11711154;
|
|
}
|
|
|
|
|
|
/**
|
|
* We are of type 3999
|
|
*/
|
|
@Override
|
|
public long getRecordType() { return _type; }
|
|
|
|
|
|
/**
|
|
* Convert from an integer RGB value to individual R, G, B 0-255 values
|
|
*/
|
|
public static byte[] splitRGB(int rgb) {
|
|
byte[] ret = new byte[3];
|
|
|
|
// Serialise to bytes, then grab the right ones out
|
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
try {
|
|
writeLittleEndian(rgb,baos);
|
|
} catch(IOException ie) {
|
|
// Should never happen
|
|
throw new HSLFException(ie);
|
|
}
|
|
byte[] b = baos.toByteArray();
|
|
System.arraycopy(b,0,ret,0,3);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Convert from split R, G, B values to an integer RGB value
|
|
*/
|
|
public static int joinRGB(byte r, byte g, byte b) {
|
|
return joinRGB(new byte[] { r,g,b });
|
|
}
|
|
/**
|
|
* Convert from split R, G, B values to an integer RGB value
|
|
*/
|
|
public static int joinRGB(byte[] rgb) {
|
|
if(rgb.length != 3) {
|
|
throw new HSLFException("joinRGB accepts a byte array of 3 values, but got one of " + rgb.length + " values!");
|
|
}
|
|
byte[] with_zero = new byte[4];
|
|
System.arraycopy(rgb,0,with_zero,0,3);
|
|
with_zero[3] = 0;
|
|
int ret = LittleEndian.getInt(with_zero,0);
|
|
return ret;
|
|
}
|
|
|
|
|
|
/**
|
|
* Write the contents of the record back, so it can be written
|
|
* to disk
|
|
*/
|
|
@Override
|
|
public void writeOut(OutputStream out) throws IOException {
|
|
// Header - size or type unchanged
|
|
out.write(_header);
|
|
|
|
// Write out the rgb values
|
|
writeLittleEndian(backgroundColourRGB,out);
|
|
writeLittleEndian(textAndLinesColourRGB,out);
|
|
writeLittleEndian(shadowsColourRGB,out);
|
|
writeLittleEndian(titleTextColourRGB,out);
|
|
writeLittleEndian(fillsColourRGB,out);
|
|
writeLittleEndian(accentColourRGB,out);
|
|
writeLittleEndian(accentAndHyperlinkColourRGB,out);
|
|
writeLittleEndian(accentAndFollowingHyperlinkColourRGB,out);
|
|
}
|
|
|
|
/**
|
|
* Returns color by its index
|
|
*
|
|
* @param idx 0-based color index
|
|
* @return color by its index
|
|
*/
|
|
public int getColor(int idx){
|
|
int[] clr = {backgroundColourRGB, textAndLinesColourRGB, shadowsColourRGB, titleTextColourRGB,
|
|
fillsColourRGB, accentColourRGB, accentAndHyperlinkColourRGB, accentAndFollowingHyperlinkColourRGB};
|
|
return clr[idx];
|
|
}
|
|
}
|