findbugs fixes and refactor some ClassIDs

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872473 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2020-01-07 22:46:29 +00:00
parent a4b6cf895b
commit d1a714f5f1
6 changed files with 137 additions and 139 deletions

View File

@ -92,7 +92,13 @@ public enum ClassIDPredefined {
/** URL Moniker **/
URL_MONIKER ("{79EAC9E0-BAF9-11CE-8C82-00AA004BA90B}", null, null),
/** File Moniker **/
FILE_MONIKER ("{00000303-0000-0000-C000-000000000046}", null, null)
FILE_MONIKER ("{00000303-0000-0000-C000-000000000046}", null, null),
/** Document summary information first property section **/
DOC_SUMMARY ("{D5CDD502-2E9C-101B-9397-08002B2CF9AE}", null, null),
/** Document summary information user defined properties section **/
USER_PROPERTIES ("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", null, null),
/** Summary information property section **/
SUMMARY_PROPERTIES ("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", null, null);
;

View File

@ -17,9 +17,11 @@
package org.apache.poi.hpsf;
import static org.apache.poi.hpsf.ClassIDPredefined.DOC_SUMMARY;
import static org.apache.poi.hpsf.ClassIDPredefined.USER_PROPERTIES;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ -32,6 +34,7 @@ import org.apache.poi.hpsf.wellknown.PropertyIDMap;
*
* @see SummaryInformation
*/
@SuppressWarnings("unused")
public class DocumentSummaryInformation extends PropertySet {
/**
@ -44,15 +47,10 @@ public class DocumentSummaryInformation extends PropertySet {
/**
* The DocumentSummaryInformation's first and second sections' format ID.
*/
private static final ClassID DOC_SUMMARY_INFORMATION =
new ClassID("{D5CDD502-2E9C-101B-9397-08002B2CF9AE}");
private static final ClassID USER_DEFINED_PROPERTIES =
new ClassID("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}");
public static final ClassID[] FORMAT_ID = {
DOC_SUMMARY_INFORMATION, USER_DEFINED_PROPERTIES
DOC_SUMMARY.getClassID(), USER_PROPERTIES.getClassID()
};
@Override
public PropertyIDMap getPropertySetIDMap() {
return PropertyIDMap.getDocumentSummaryInformationProperties();
@ -63,10 +61,10 @@ public class DocumentSummaryInformation extends PropertySet {
* Creates an empty {@link DocumentSummaryInformation}.
*/
public DocumentSummaryInformation() {
getFirstSection().setFormatID(DOC_SUMMARY_INFORMATION);
getFirstSection().setFormatID(DOC_SUMMARY.getClassID());
}
/**
* Creates a {@link DocumentSummaryInformation} from a given
* {@link PropertySet}.
@ -97,20 +95,16 @@ public class DocumentSummaryInformation extends PropertySet {
*
* @param stream Holds the data making out the property set
* stream.
* @throws MarkUnsupportedException
* if the stream does not support the {@link InputStream#markSupported} method.
* @throws IOException
* if the {@link InputStream} cannot be accessed as needed.
* @exception NoPropertySetStreamException
* if the input stream does not contain a property set.
* @exception UnsupportedEncodingException
* if a character encoding is not supported.
*/
public DocumentSummaryInformation(final InputStream stream)
throws NoPropertySetStreamException, MarkUnsupportedException, IOException, UnsupportedEncodingException {
throws NoPropertySetStreamException, IOException {
super(stream);
}
/**
* Returns the category (or {@code null}).
*
@ -531,10 +525,10 @@ public class DocumentSummaryInformation extends PropertySet {
public void removeLinksDirty() {
remove1stProperty(PropertyIDMap.PID_LINKSDIRTY);
}
/**
* Returns the character count including whitespace, or 0 if the
* Returns the character count including whitespace, or 0 if the
* {@link DocumentSummaryInformation} does not contain this char count.
* <p>This is the whitespace-including version of {@link SummaryInformation#getCharCount()}
*
@ -546,42 +540,42 @@ public class DocumentSummaryInformation extends PropertySet {
/**
* Sets the character count including whitespace
*
*
* @param count The character count to set.
*/
public void setCharCountWithSpaces(int count) {
set1stProperty(PropertyIDMap.PID_CCHWITHSPACES, count);
}
/**
* Removes the character count
*/
public void removeCharCountWithSpaces() {
remove1stProperty(PropertyIDMap.PID_CCHWITHSPACES);
}
/**
* Get if the User Defined Property Set has been updated outside of the
* Get if the User Defined Property Set has been updated outside of the
* Application.<p>
* If it has (true), the hyperlinks should be updated on document load.
*
*
* @return true, if the hyperlinks should be updated on document load
*/
public boolean getHyperlinksChanged() {
return getPropertyBooleanValue(PropertyIDMap.PID_HYPERLINKSCHANGED);
}
/**
* Set the flag for if the User Defined Property Set has been updated outside
* Set the flag for if the User Defined Property Set has been updated outside
* of the Application.
*
*
* @param changed true, if the User Defined Property Set has been updated
*/
public void setHyperlinksChanged(boolean changed) {
set1stProperty(PropertyIDMap.PID_HYPERLINKSCHANGED, changed);
}
/**
* Removes the flag for if the User Defined Property Set has been updated
* outside of the Application.
@ -590,30 +584,30 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_HYPERLINKSCHANGED);
}
/**
* Gets the version of the Application which wrote the
* Property set, stored with the two high order bytes having the major
* version number, and the two low order bytes the minor version number.<p>
* This will be 0 if no version is set.
*
*
* @return the Application version
*/
public int getApplicationVersion() {
return getPropertyIntValue(PropertyIDMap.PID_VERSION);
}
/**
* Sets the Application version, which must be a 4 byte int with
* the two high order bytes having the major version number, and the
* the two high order bytes having the major version number, and the
* two low order bytes the minor version number.
*
*
* @param version the Application version
*/
public void setApplicationVersion(int version) {
set1stProperty(PropertyIDMap.PID_VERSION, version);
}
/**
* Removes the Application Version
*/
@ -621,31 +615,28 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_VERSION);
}
/**
* Returns the VBA digital signature for the VBA project
* Returns the VBA digital signature for the VBA project
* embedded in the document (or {@code null}).
*
*
* @return the VBA digital signature
*/
public byte[] getVBADigitalSignature() {
Object value = getProperty(PropertyIDMap.PID_DIGSIG);
if (value != null && value instanceof byte[]) {
return (byte[])value;
}
return null;
return (value instanceof byte[]) ? (byte[])value : null;
}
/**
* Sets the VBA digital signature for the VBA project
* Sets the VBA digital signature for the VBA project
* embedded in the document.
*
*
* @param signature VBA Digital Signature for the project
*/
public void setVBADigitalSignature(byte[] signature) {
set1stProperty(PropertyIDMap.PID_DIGSIG, signature);
}
/**
* Removes the VBA Digital Signature
*/
@ -653,25 +644,25 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_DIGSIG);
}
/**
* Gets the content type of the file (or {@code null}).
*
*
* @return the content type of the file
*/
public String getContentType() {
return getPropertyStringValue(PropertyIDMap.PID_CONTENTTYPE);
}
/**
* Sets the content type of the file
*
*
* @param type the content type of the file
*/
public void setContentType(String type) {
set1stProperty(PropertyIDMap.PID_CONTENTTYPE, type);
}
/**
* Removes the content type of the file
*/
@ -679,25 +670,25 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_CONTENTTYPE);
}
/**
* Gets the content status of the file (or {@code null}).
*
*
* @return the content status of the file
*/
public String getContentStatus() {
return getPropertyStringValue(PropertyIDMap.PID_CONTENTSTATUS);
}
/**
* Sets the content status of the file
*
*
* @param status the content status of the file
*/
public void setContentStatus(String status) {
set1stProperty(PropertyIDMap.PID_CONTENTSTATUS, status);
}
/**
* Removes the content status of the file
*/
@ -705,25 +696,25 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_CONTENTSTATUS);
}
/**
* Gets the document language, which is normally unset and empty (or {@code null}).
*
*
* @return the document language
*/
public String getLanguage() {
return getPropertyStringValue(PropertyIDMap.PID_LANGUAGE);
}
/**
* Set the document language
*
*
* @param language the document language
*/
public void setLanguage(String language) {
set1stProperty(PropertyIDMap.PID_LANGUAGE, language);
}
/**
* Removes the document language
*/
@ -731,26 +722,26 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_LANGUAGE);
}
/**
* Gets the document version as a string, which is normally unset and empty
* (or {@code null}).
*
*
* @return the document verion
*/
public String getDocumentVersion() {
return getPropertyStringValue(PropertyIDMap.PID_DOCVERSION);
}
/**
* Sets the document version string
*
*
* @param version the document version string
*/
public void setDocumentVersion(String version) {
set1stProperty(PropertyIDMap.PID_DOCVERSION, version);
}
/**
* Removes the document version string
*/
@ -758,7 +749,7 @@ public class DocumentSummaryInformation extends PropertySet {
remove1stProperty(PropertyIDMap.PID_DOCVERSION);
}
/**
* Gets the custom properties.
*
@ -824,7 +815,7 @@ public class DocumentSummaryInformation extends PropertySet {
private void ensureSection2() {
if (getSectionCount() < 2) {
Section s2 = new Section();
s2.setFormatID(USER_DEFINED_PROPERTIES);
s2.setFormatID(USER_PROPERTIES.getClassID());
addSection(s2);
}
}
@ -846,7 +837,7 @@ public class DocumentSummaryInformation extends PropertySet {
}
}
}
/**
* Throws an {@link UnsupportedOperationException} with a message text
* telling which functionality is not yet implemented.

View File

@ -62,7 +62,7 @@ import org.apache.poi.util.Removal;
* #getSections} to retrieve the {@link Section}s, then call {@link
* Section#getProperties} for each {@link Section} to get hold of the
* {@link Property} arrays.<p>
*
*
* Since the vast majority of {@link PropertySet}s contains only a single
* {@link Section}, the convenience method {@link #getProperties} returns
* the properties of a {@link PropertySet}'s {@link Section} (throwing a
@ -108,7 +108,7 @@ public class PropertySet {
ClassID.LENGTH + /* Class ID */
LittleEndianConsts.INT_SIZE; /* Section count */
/**
* Specifies this {@link PropertySet}'s byte order. See the
* HPFS documentation for details!
@ -120,7 +120,7 @@ public class PropertySet {
* documentation for details!
*/
private int format;
/**
* Specifies the version of the operating system that created this
* {@link PropertySet}. See the HPFS documentation for details!
@ -138,7 +138,7 @@ public class PropertySet {
*/
private final List<Section> sections = new ArrayList<>();
/**
* Constructs a {@code PropertySet} instance. Its
* primary task is to initialize the field with their proper values.
@ -190,7 +190,7 @@ public class PropertySet {
if (!isPropertySetStream(stream)) {
throw new NoPropertySetStreamException();
}
final byte[] buffer = IOUtils.toByteArray(stream);
init(buffer, 0, buffer.length);
}
@ -208,7 +208,7 @@ public class PropertySet {
* @param length The length of the stream data.
* @throws NoPropertySetStreamException if the byte array is not a
* property set stream.
*
*
* @exception UnsupportedEncodingException if the codepage is not supported.
*/
public PropertySet(final byte[] stream, final int offset, final int length)
@ -227,14 +227,14 @@ public class PropertySet {
* complete byte array contents is the stream data.
* @throws NoPropertySetStreamException if the byte array is not a
* property set stream.
*
*
* @exception UnsupportedEncodingException if the codepage is not supported.
*/
public PropertySet(final byte[] stream)
throws NoPropertySetStreamException, UnsupportedEncodingException {
this(stream, 0, stream.length);
}
/**
* Constructs a {@code PropertySet} by doing a deep copy of
* an existing {@code PropertySet}. All nested elements, i.e.
@ -253,7 +253,7 @@ public class PropertySet {
}
}
/**
* @return The property set stream's low-level "byte order" field. It is always {@code 0xFFFE}.
*/
@ -321,7 +321,7 @@ public class PropertySet {
public void setClassID(ClassID classID) {
this.classID = classID;
}
/**
* @return The number of {@link Section}s in the property set.
*/
@ -348,24 +348,24 @@ public class PropertySet {
public void addSection(final Section section) {
sections.add(section);
}
/**
* Removes all sections from this property set.
*/
public void clearSections() {
sections.clear();
}
/**
* The id to name mapping of the properties in this set.
*
*
* @return the id to name mapping of the properties in this set or {@code null} if not applicable
*/
public PropertyIDMap getPropertySetIDMap() {
return null;
}
/**
* Checks whether an {@link InputStream} is in the Horrible
* Property Set Format.
@ -427,11 +427,9 @@ public class PropertySet {
return false;
}
final long osVersion = leis.readUInt();
byte[] clsBuf = new byte[ClassID.LENGTH];
leis.readFully(clsBuf);
final ClassID classID = new ClassID(clsBuf, 0);
if (leis.skip(ClassID.LENGTH) != ClassID.LENGTH) {
return false;
}
final long sectionCount = leis.readUInt();
return (sectionCount >= 0);
} catch (RuntimeException e) {
@ -482,7 +480,7 @@ public class PropertySet {
* consists of a format ID telling what the section contains
* and an offset telling how many bytes from the start of the
* stream the section begins.
*
*
* Most property sets have only one section. The Document
* Summary Information stream has 2. Everything else is a rare
* exception and is no longer fostered by Microsoft.
@ -608,9 +606,9 @@ public class PropertySet {
/**
* Fetches the property with the given ID, then does its
* best to return it as a String
*
*
* @param propertyId the property id
*
*
* @return The property as a String, or null if unavailable
*/
String getPropertyStringValue(final int propertyId) {
@ -620,9 +618,9 @@ public class PropertySet {
/**
* Return the string representation of a property value
*
*
* @param propertyValue the property value
*
*
* @return The property value as a String, or null if unavailable
*/
public static String getPropertyStringValue(final Object propertyValue) {
@ -633,7 +631,7 @@ public class PropertySet {
if (propertyValue instanceof String) {
return (String)propertyValue;
}
// Do our best with some edge cases
if (propertyValue instanceof byte[]) {
byte[] b = (byte[])propertyValue;
@ -666,7 +664,7 @@ public class PropertySet {
* represents a Summary Information, else {@code false}.
*/
public boolean isSummaryInformation() {
return !sections.isEmpty() && matchesSummary(getFirstSection().getFormatID(), SummaryInformation.FORMAT_ID);
return !sections.isEmpty() && matchesSummary(getFirstSection().getFormatID(), SummaryInformation.FORMAT_ID);
}
/**
@ -676,9 +674,9 @@ public class PropertySet {
* represents a Document Summary Information, else {@code false}.
*/
public boolean isDocumentSummaryInformation() {
return !sections.isEmpty() && matchesSummary(getFirstSection().getFormatID(), DocumentSummaryInformation.FORMAT_ID);
return !sections.isEmpty() && matchesSummary(getFirstSection().getFormatID(), DocumentSummaryInformation.FORMAT_ID);
}
/* package */ static boolean matchesSummary(ClassID actual, ClassID... expected) {
for (ClassID sum : expected) {
if (sum.equals(actual) || sum.equalsInverted(actual)) {
@ -816,7 +814,7 @@ public class PropertySet {
* to the specified parameter, else {@code false}.
*
* @param o the object to compare this {@code PropertySet} with
*
*
* @return {@code true} if the objects are equal, {@code false}
* if not
*/
@ -888,7 +886,7 @@ public class PropertySet {
b.append(']');
return b.toString();
}
void remove1stProperty(long id) {
getFirstSection().removeProperty(id);
@ -897,20 +895,20 @@ public class PropertySet {
void set1stProperty(long id, String value) {
getFirstSection().setProperty((int)id, value);
}
void set1stProperty(long id, int value) {
getFirstSection().setProperty((int)id, value);
}
void set1stProperty(long id, boolean value) {
getFirstSection().setProperty((int)id, value);
}
@SuppressWarnings("SameParameterValue")
void set1stProperty(long id, byte[] value) {
getFirstSection().setProperty((int)id, value);
}
private static void putClassId(final ByteArrayOutputStream out, final ClassID n) {
byte[] b = new byte[16];
n.write(b, 0);

View File

@ -17,6 +17,8 @@
package org.apache.poi.hpsf;
import static org.apache.poi.hpsf.ClassIDPredefined.SUMMARY_PROPERTIES;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
@ -40,8 +42,7 @@ public final class SummaryInformation extends PropertySet {
/**
* The SummaryInformation's section's format ID.
*/
public static final ClassID FORMAT_ID =
new ClassID("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}");
public static final ClassID FORMAT_ID = SUMMARY_PROPERTIES.getClassID();
@Override
public PropertyIDMap getPropertySetIDMap() {
@ -54,7 +55,7 @@ public final class SummaryInformation extends PropertySet {
public SummaryInformation() {
getFirstSection().setFormatID(FORMAT_ID);
}
/**
* Creates a {@link SummaryInformation} from a given {@link
* PropertySet}.
@ -98,7 +99,7 @@ public final class SummaryInformation extends PropertySet {
super(stream);
}
/**
* @return The title or {@code null}
*/
@ -315,7 +316,7 @@ public final class SummaryInformation extends PropertySet {
/**
* Returns the revision number (or {@code null}).
* Returns the revision number (or {@code null}).
*
* @return The revision number or {@code null}
*/
@ -582,7 +583,7 @@ public final class SummaryInformation extends PropertySet {
* change!</strong><p>
*
* To process this data, you may wish to make use of the
* {@link Thumbnail} class. The raw data is generally
* {@link Thumbnail} class. The raw data is generally
* an image in WMF or Clipboard (BMP?) format
*
* @return The thumbnail or {@code null}

View File

@ -104,7 +104,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
extractAll(patriarch, embeddings);
return embeddings;
}
protected void extractAll(ShapeContainer<?> parent, List<EmbeddedData> embeddings) throws IOException {
for (Shape shape : parent) {
EmbeddedData data = null;
@ -124,7 +124,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
} else if (shape instanceof ShapeContainer) {
extractAll((ShapeContainer<?>)shape, embeddings);
}
if (data == null) {
continue;
}
@ -132,7 +132,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
data.setShape(shape);
String filename = data.getFilename();
String extension = (filename == null || filename.lastIndexOf('.') == -1) ? ".bin" : filename.substring(filename.lastIndexOf('.'));
// try to find an alternative name
if (filename == null || filename.isEmpty() || filename.startsWith("MBD") || filename.startsWith("Root Entry")) {
filename = shape.getShapeName();
@ -146,11 +146,11 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
}
filename = filename.trim();
data.setFilename(filename);
embeddings.add(data);
}
}
public boolean canExtract(DirectoryNode source) {
return false;
@ -175,7 +175,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
protected EmbeddedData extract(Picture source) throws IOException {
return null;
}
public static class Ole10Extractor extends EmbeddedExtractor {
@Override
public boolean canExtract(DirectoryNode dn) {
@ -196,11 +196,10 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
}
static class PdfExtractor extends EmbeddedExtractor {
static ClassID PdfClassID = new ClassID("{B801CA65-A1FC-11D0-85AD-444553540000}");
@Override
public boolean canExtract(DirectoryNode dn) {
ClassID clsId = dn.getStorageClsid();
return (PdfClassID.equals(clsId) || dn.hasEntry("CONTENTS"));
return (ClassIDPredefined.PDF.equals(clsId) || dn.hasEntry("CONTENTS"));
}
@Override
@ -211,7 +210,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
return new EmbeddedData(dn.getName() + ".pdf", bos.toByteArray(), CONTENT_TYPE_PDF);
}
}
@Override
public boolean canExtract(Picture source) {
PictureData pd = source.getPictureData();
@ -239,12 +238,12 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
if (idxStart == -1) {
return null;
}
int idxEnd = indexOf(pictureBytes, idxStart, "%%EOF".getBytes(LocaleUtil.CHARSET_1252));
if (idxEnd == -1) {
return null;
}
int pictureBytesLen = idxEnd-idxStart+6;
byte[] pdfBytes = IOUtils.safelyAllocate(pictureBytesLen, MAX_RECORD_LENGTH);
System.arraycopy(pictureBytes, idxStart, pdfBytes, 0, pictureBytesLen);
@ -254,7 +253,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
}
return new EmbeddedData(filename, pdfBytes, CONTENT_TYPE_PDF);
}
}
@ -271,12 +270,12 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
String contentType = null;
String ext = null;
if (clsId != null) {
contentType = clsId.getContentType();
ext = clsId.getFileExtension();
}
if (contentType == null || ext == null) {
contentType = "application/zip";
ext = ".zip";
@ -285,7 +284,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
DocumentInputStream dis = dn.createDocumentInputStream("package");
byte[] data = IOUtils.toByteArray(dis);
dis.close();
return new EmbeddedData(dn.getName()+ext, data, contentType);
}
}
@ -295,7 +294,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
public boolean canExtract(DirectoryNode dn) {
return canExtractExcel(dn) || canExtractWord(dn);
}
protected boolean canExtractExcel(DirectoryNode dn) {
ClassIDPredefined clsId = ClassIDPredefined.lookup(dn.getStorageClsid());
return (ClassIDPredefined.EXCEL_V7 == clsId
@ -309,7 +308,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
|| ClassIDPredefined.WORD_V8 == clsId
|| dn.hasEntry("WordDocument"));
}
@Override
public EmbeddedData extract(DirectoryNode dn) throws IOException {
EmbeddedData ed = super.extract(dn);
@ -320,7 +319,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
ed.setFilename(dn.getName() + ".doc");
ed.setContentType(CONTENT_TYPE_DOC);
}
return ed;
}
}
@ -338,7 +337,7 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
return ed;
}
}
protected static void copyNodes(DirectoryNode src, DirectoryNode dest) throws IOException {
for (Entry e : src) {
if (e instanceof DirectoryNode) {
@ -353,8 +352,8 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
}
}
}
/**
* Knuth-Morris-Pratt Algorithm for Pattern Matching
@ -401,5 +400,5 @@ public class EmbeddedExtractor implements Iterable<EmbeddedExtractor> {
return failure;
}
}

View File

@ -262,8 +262,11 @@ public class HwmfWindowing {
public void draw(HwmfGraphics ctx) {
final HwmfDrawProperties prop = ctx.getProperties();
Rectangle2D old = prop.getWindow();
double oldW = (old == null ? 0 : old.getWidth());
double oldH = (old == null ? 0 : old.getHeight());
double oldW = 0, oldH = 0;
if (old != null) {
oldW = old.getWidth();
oldH = old.getHeight();
}
if (oldW != size.getWidth() || oldH != size.getHeight()) {
prop.setWindowExt(size.getWidth(), size.getHeight());
ctx.updateWindowMapMode();
@ -521,7 +524,7 @@ public class HwmfWindowing {
public void draw(HwmfGraphics ctx) {
ctx.setClip(normalizeBounds(bounds), HwmfRegionMode.RGN_DIFF, false);
}
@Override
public String toString() {
return GenericRecordJsonWriter.marshal(this);
@ -561,7 +564,7 @@ public class HwmfWindowing {
public void draw(HwmfGraphics ctx) {
ctx.setClip(bounds, HwmfRegionMode.RGN_AND, false);
}
@Override
public String toString() {
return GenericRecordJsonWriter.marshal(this);
@ -736,7 +739,7 @@ public class HwmfWindowing {
// lower-right corner of the rectangle.
double bottom = leis.readShort();
bounds.setRect(left, top, right-left, bottom-top);
int size = 9*LittleEndianConsts.SHORT_SIZE+LittleEndianConsts.INT_SIZE;
scanObjects = new WmfScanObject[scanCount];
@ -751,7 +754,7 @@ public class HwmfWindowing {
public void draw(HwmfGraphics ctx) {
ctx.addObjectTableEntry(this);
}
@Override
public void applyObject(HwmfGraphics ctx) {
Rectangle2D lastRect = null;
@ -768,7 +771,7 @@ public class HwmfWindowing {
count++;
}
}
Shape region = null;
if (count > 0) {
region = (count == 1) ? lastRect : scanLines;