| /* ==================================================================== |
| 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]; |
| } |
| } |