| |
| /* ==================================================================== |
| 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.model; |
| |
| import org.apache.poi.ddf.*; |
| import org.apache.poi.hslf.record.*; |
| import org.apache.poi.hslf.usermodel.PictureData; |
| import org.apache.poi.hslf.usermodel.SlideShow; |
| import org.apache.poi.hslf.exceptions.HSLFException; |
| import org.apache.poi.util.POILogger; |
| import org.apache.poi.util.POILogFactory; |
| |
| import java.awt.*; |
| import java.util.*; |
| |
| /** |
| * Represents functionality provided by the 'Fill Effects' dialog in PowerPoint. |
| * |
| * @author Yegor Kozlov |
| */ |
| public class Fill { |
| // For logging |
| protected POILogger logger = POILogFactory.getLogger(this.getClass()); |
| |
| /** |
| * Fill with a solid color |
| */ |
| public static final int FILL_SOLID = 0; |
| |
| /** |
| * Fill with a pattern (bitmap) |
| */ |
| public static final int FILL_PATTERN = 1; |
| |
| /** |
| * A texture (pattern with its own color map) |
| */ |
| public static final int FILL_TEXTURE = 2; |
| |
| /** |
| * Center a picture in the shape |
| */ |
| public static final int FILL_PICTURE = 3; |
| |
| /** |
| * Shade from start to end points |
| */ |
| public static final int FILL_SHADE = 4; |
| |
| /** |
| * Shade from bounding rectangle to end point |
| */ |
| public static final int FILL_SHADE_CENTER = 5; |
| |
| /** |
| * Shade from shape outline to end point |
| */ |
| public static final int FILL_SHADE_SHAPE = 6; |
| |
| /** |
| * Similar to FILL_SHADE, but the fill angle |
| * is additionally scaled by the aspect ratio of |
| * the shape. If shape is square, it is the same as FILL_SHADE |
| */ |
| public static final int FILL_SHADE_SCALE = 7; |
| |
| /** |
| * shade to title |
| */ |
| public static final int FILL_SHADE_TITLE = 8; |
| |
| /** |
| * Use the background fill color/pattern |
| */ |
| public static final int FILL_BACKGROUND = 9; |
| |
| |
| |
| /** |
| * The shape this background applies to |
| */ |
| protected Shape shape; |
| |
| /** |
| * Construct a <code>Fill</code> object for a shape. |
| * Fill information will be read from shape's escher properties. |
| * |
| * @param shape the shape this background applies to |
| */ |
| public Fill(Shape shape){ |
| this.shape = shape; |
| } |
| |
| /** |
| * Returns fill type. |
| * Must be one of the <code>FILL_*</code> constants defined in this class. |
| * |
| * @return type of fill |
| */ |
| public int getFillType(){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| EscherSimpleProperty prop = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE); |
| return prop == null ? FILL_SOLID : prop.getPropertyValue(); |
| } |
| |
| /** |
| * Sets fill type. |
| * Must be one of the <code>FILL_*</code> constants defined in this class. |
| * |
| * @param type type of the fill |
| */ |
| public void setFillType(int type){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| Shape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type); |
| } |
| |
| /** |
| * Foreground color |
| */ |
| public Color getForegroundColor(){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| EscherSimpleProperty p1 = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__FILLCOLOR); |
| EscherSimpleProperty p2 = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); |
| |
| int p2val = p2 == null ? 0 : p2.getPropertyValue(); |
| |
| Color clr = null; |
| if (p1 != null && (p2val & 0x10) != 0){ |
| int rgb = p1.getPropertyValue(); |
| clr = shape.getColor(rgb); |
| } |
| return clr; |
| } |
| |
| /** |
| * Foreground color |
| */ |
| public void setForegroundColor(Color color){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| if (color == null) { |
| Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, -1); |
| Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150010); |
| } |
| else { |
| int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB(); |
| Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb); |
| Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011); |
| } |
| } |
| |
| /** |
| * Background color |
| */ |
| public Color getBackgroundColor(){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| EscherSimpleProperty p1 = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR); |
| EscherSimpleProperty p2 = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST); |
| |
| int p2val = p2 == null ? 0 : p2.getPropertyValue(); |
| |
| Color clr = null; |
| if (p1 != null && (p2val & 0x10) != 0){ |
| int rgb = p1.getPropertyValue(); |
| clr = shape.getColor(rgb); |
| } |
| return clr; |
| } |
| |
| /** |
| * Background color |
| */ |
| public void setBackgroundColor(Color color){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| if (color == null) { |
| Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1); |
| } |
| else { |
| int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB(); |
| Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb); |
| } |
| } |
| |
| /** |
| * <code>PictureData</code> object used in a texture, pattern of picture fill. |
| */ |
| public PictureData getPictureData(){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| EscherSimpleProperty p = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE); |
| if (p == null) return null; |
| |
| SlideShow ppt = shape.getSheet().getSlideShow(); |
| PictureData[] pict = ppt.getPictureData(); |
| Document doc = ppt.getDocumentRecord(); |
| |
| EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer(); |
| EscherContainerRecord bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER); |
| |
| java.util.List lst = bstore.getChildRecords(); |
| int idx = p.getPropertyValue(); |
| if (idx == 0){ |
| logger.log(POILogger.ERROR, "no reference to picture data found "); |
| } else { |
| EscherBSERecord bse = (EscherBSERecord)lst.get(idx - 1); |
| for ( int i = 0; i < pict.length; i++ ) { |
| if (pict[i].getOffset() == bse.getOffset()){ |
| return pict[i]; |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Assign picture used to fill the underlying shape. |
| * |
| * @param idx 0-based index of the picture added to this ppt by <code>SlideShow.addPicture</code> method. |
| */ |
| public void setPictureData(int idx){ |
| EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID); |
| Shape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx); |
| } |
| |
| } |