Merge
This commit is contained in:
commit
481e6102b8
jdk
make/mapfiles
src
java.desktop
macosx
classes/com/apple/laf
native
share/classes
com/sun
imageio/plugins/tiff
TIFFBaseJPEGCompressor.javaTIFFColorConverter.javaTIFFCompressor.javaTIFFDecompressor.javaTIFFExifJPEGCompressor.javaTIFFFaxCompressor.javaTIFFFieldNode.javaTIFFIFD.javaTIFFImageMetadata.javaTIFFImageReader.javaTIFFImageWriteParam.javaTIFFImageWriter.javaTIFFJPEGCompressor.javaTIFFLZWDecompressor.javaTIFFLZWUtil.javaTIFFNullDecompressor.javaTIFFOldJPEGDecompressor.javaTIFFRLECompressor.javaTIFFRenderedImage.javaTIFFT4Compressor.javaTIFFT6Compressor.java
media/sound
java
javax
imageio/plugins/tiff
BaselineTIFFTagSet.javaExifGPSTagSet.javaExifInteroperabilityTagSet.javaExifParentTIFFTagSet.javaExifTIFFTagSet.javaFaxTIFFTagSet.javaGeoTIFFTagSet.javaTIFFDirectory.javaTIFFField.javaTIFFImageReadParam.javaTIFFTag.javaTIFFTagSet.java
print
swing
sun
unix
windows/classes/sun/java2d/d3d
jdk.accessibility/share/classes/com/sun/java/accessibility/util
test
java/awt
Focus/FocusTraversalPolicy
image
print/PrinterJob
javax
sound/sampled/AudioInputStream
swing
JFileChooser/ShellFolderQueries
JInternalFrame
JScrollPane/HorizontalMouseWheelOnShiftPressed
JTableHeader/8020039
plaf/gtk/crash
sun/java2d/marlin
@ -200,6 +200,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_print_CUPSPrinter_initIDs;
|
||||
Java_sun_print_CUPSPrinter_getCupsServer;
|
||||
Java_sun_print_CUPSPrinter_getCupsPort;
|
||||
Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
|
||||
Java_sun_print_CUPSPrinter_canConnect;
|
||||
Java_sun_print_CUPSPrinter_getMedia;
|
||||
Java_sun_print_CUPSPrinter_getPageSizes;
|
||||
|
@ -73,6 +73,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_print_CUPSPrinter_initIDs;
|
||||
Java_sun_print_CUPSPrinter_getCupsServer;
|
||||
Java_sun_print_CUPSPrinter_getCupsPort;
|
||||
Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
|
||||
Java_sun_print_CUPSPrinter_canConnect;
|
||||
Java_sun_print_CUPSPrinter_getMedia;
|
||||
Java_sun_print_CUPSPrinter_getPageSizes;
|
||||
|
@ -439,6 +439,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_print_CUPSPrinter_initIDs;
|
||||
Java_sun_print_CUPSPrinter_getCupsServer;
|
||||
Java_sun_print_CUPSPrinter_getCupsPort;
|
||||
Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
|
||||
Java_sun_print_CUPSPrinter_canConnect;
|
||||
Java_sun_print_CUPSPrinter_getMedia;
|
||||
Java_sun_print_CUPSPrinter_getPageSizes;
|
||||
|
@ -40,6 +40,7 @@ import apple.laf.JRSUIState.TitleBarHeightState;
|
||||
|
||||
import com.apple.laf.AquaUtils.RecyclableSingleton;
|
||||
import com.apple.laf.AquaInternalFrameBorderMetrics;
|
||||
import java.awt.geom.AffineTransform;
|
||||
|
||||
public class AquaInternalFrameBorder implements Border, UIResource {
|
||||
private static final int kCloseButton = 0;
|
||||
@ -309,18 +310,40 @@ public class AquaInternalFrameBorder implements Border, UIResource {
|
||||
return isInsideYButtonArea(i, y) && x >= startX && x <= endX;
|
||||
}
|
||||
|
||||
protected void paintTitleIcon(final Graphics g, final JInternalFrame frame, final int x, final int y) {
|
||||
Icon icon = frame.getFrameIcon();
|
||||
if (icon == null) icon = UIManager.getIcon("InternalFrame.icon");
|
||||
if (icon == null) return;
|
||||
protected void paintTitleIcon(final Graphics g, final JInternalFrame frame,
|
||||
final int x, final int y) {
|
||||
|
||||
// Resize to 16x16 if necessary.
|
||||
if (icon instanceof ImageIcon && (icon.getIconWidth() > sMaxIconWidth || icon.getIconHeight() > sMaxIconHeight)) {
|
||||
final Image img = ((ImageIcon)icon).getImage();
|
||||
((ImageIcon)icon).setImage(img.getScaledInstance(sMaxIconWidth, sMaxIconHeight, Image.SCALE_SMOOTH));
|
||||
Icon icon = frame.getFrameIcon();
|
||||
if (icon == null) {
|
||||
icon = UIManager.getIcon("InternalFrame.icon");
|
||||
}
|
||||
|
||||
icon.paintIcon(frame, g, x, y);
|
||||
if (icon == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (icon.getIconWidth() > sMaxIconWidth
|
||||
|| icon.getIconHeight() > sMaxIconHeight) {
|
||||
final Graphics2D g2 = (Graphics2D) g;
|
||||
final AffineTransform savedAT = g2.getTransform();
|
||||
double xScaleFactor = (double) sMaxIconWidth / icon.getIconWidth();
|
||||
double yScaleFactor = (double) sMaxIconHeight / icon.getIconHeight();
|
||||
|
||||
//Coordinates are after a translation hence relative origin shifts
|
||||
g2.translate(x, y);
|
||||
|
||||
//scaling factor is needed to scale while maintaining aspect ratio
|
||||
double scaleMaintainAspectRatio = Math.min(xScaleFactor, yScaleFactor);
|
||||
|
||||
//minimum value is taken to set to a maximum Icon Dimension
|
||||
g2.scale(scaleMaintainAspectRatio, scaleMaintainAspectRatio);
|
||||
|
||||
icon.paintIcon(frame, g2, 0, 0);
|
||||
g2.setTransform(savedAT);
|
||||
|
||||
} else {
|
||||
icon.paintIcon(frame, g, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
protected int getIconWidth(final JInternalFrame frame) {
|
||||
@ -330,9 +353,7 @@ public class AquaInternalFrameBorder implements Border, UIResource {
|
||||
if (icon == null) {
|
||||
icon = UIManager.getIcon("InternalFrame.icon");
|
||||
}
|
||||
|
||||
if (icon != null && icon instanceof ImageIcon) {
|
||||
// Resize to 16x16 if necessary.
|
||||
if (icon != null) {
|
||||
width = Math.min(icon.getIconWidth(), sMaxIconWidth);
|
||||
}
|
||||
|
||||
@ -346,9 +367,7 @@ public class AquaInternalFrameBorder implements Border, UIResource {
|
||||
if (icon == null) {
|
||||
icon = UIManager.getIcon("InternalFrame.icon");
|
||||
}
|
||||
|
||||
if (icon != null && icon instanceof ImageIcon) {
|
||||
// Resize to 16x16 if necessary.
|
||||
if (icon != null) {
|
||||
height = Math.min(icon.getIconHeight(), sMaxIconHeight);
|
||||
}
|
||||
|
||||
|
@ -128,14 +128,17 @@ public class AquaTableHeaderUI extends BasicTableHeaderUI {
|
||||
// Modify the table "border" to draw smaller, and with the titles in the right position
|
||||
// and sort indicators, just like an NSSave/Open panel.
|
||||
final AquaTableHeaderBorder cellBorder = AquaTableHeaderBorder.getListHeaderBorder();
|
||||
final boolean thisColumnSelected = localTable.getColumnModel().getColumn(column).getModelIndex() == sortColumn;
|
||||
cellBorder.setSortOrder(AquaTableHeaderBorder.SORT_NONE);
|
||||
|
||||
cellBorder.setSelected(thisColumnSelected);
|
||||
if (thisColumnSelected) {
|
||||
cellBorder.setSortOrder(sortOrder);
|
||||
} else {
|
||||
cellBorder.setSortOrder(AquaTableHeaderBorder.SORT_NONE);
|
||||
if (localTable != null) {
|
||||
final boolean thisColumnSelected = localTable.getColumnModel().getColumn(column).getModelIndex() == sortColumn;
|
||||
|
||||
cellBorder.setSelected(thisColumnSelected);
|
||||
if (thisColumnSelected) {
|
||||
cellBorder.setSortOrder(sortOrder);
|
||||
}
|
||||
}
|
||||
|
||||
setBorder(cellBorder);
|
||||
return this;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ const keyTable[] =
|
||||
{0x3D, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x3E, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x3F, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED}, // the 'fn' key on PowerBooks
|
||||
{0x40, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x40, NO, KL_STANDARD, java_awt_event_KeyEvent_VK_F17},
|
||||
{0x41, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_DECIMAL},
|
||||
{0x42, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x43, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_MULTIPLY},
|
||||
@ -149,8 +149,8 @@ const keyTable[] =
|
||||
{0x4C, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_ENTER},
|
||||
{0x4D, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x4E, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_SUBTRACT},
|
||||
{0x4F, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x50, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x4F, NO, KL_STANDARD, java_awt_event_KeyEvent_VK_F18},
|
||||
{0x50, NO, KL_STANDARD, java_awt_event_KeyEvent_VK_F19},
|
||||
{0x51, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_EQUALS},
|
||||
{0x52, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD0},
|
||||
{0x53, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD1},
|
||||
@ -160,7 +160,7 @@ const keyTable[] =
|
||||
{0x57, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD5},
|
||||
{0x58, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD6},
|
||||
{0x59, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD7},
|
||||
{0x5A, NO, KL_UNKNOWN, java_awt_event_KeyEvent_VK_UNDEFINED},
|
||||
{0x5A, NO, KL_STANDARD, java_awt_event_KeyEvent_VK_F20},
|
||||
{0x5B, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD8},
|
||||
{0x5C, YES, KL_NUMPAD, java_awt_event_KeyEvent_VK_NUMPAD9},
|
||||
{0x5D, YES, KL_STANDARD, java_awt_event_KeyEvent_VK_BACK_SLASH}, // This is a combo yen/backslash on JIS keyboards.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -624,7 +624,8 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
{
|
||||
NSString *selectedText = [self accessibleSelectedText];
|
||||
NSAttributedString *styledText = [[NSAttributedString alloc] initWithString:selectedText];
|
||||
NSData *rtfdData = [styledText RTFDFromRange:NSMakeRange(0, [styledText length]) documentAttributes:nil];
|
||||
NSData *rtfdData = [styledText RTFDFromRange:NSMakeRange(0, [styledText length])
|
||||
documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType}];
|
||||
[styledText release];
|
||||
return rtfdData;
|
||||
}
|
||||
@ -681,7 +682,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
if ([[pboard types] containsObject:NSRTFDPboardType])
|
||||
{
|
||||
NSData *rtfdData = [pboard dataForType:NSRTFDPboardType];
|
||||
NSAttributedString *styledText = [[NSAttributedString alloc] initWithRTFD:rtfdData documentAttributes:nil];
|
||||
NSAttributedString *styledText = [[NSAttributedString alloc] initWithRTFD:rtfdData documentAttributes:NULL];
|
||||
NSString *text = [styledText string];
|
||||
[styledText release];
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -743,9 +743,10 @@ Java_sun_lwawt_macosx_LWCToolkit_initAppkit
|
||||
JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||
OSXAPP_SetJavaVM(vm);
|
||||
|
||||
// We need to let Foundation know that this is a multithreaded application, if it isn't already.
|
||||
// We need to let Foundation know that this is a multithreaded application,
|
||||
// if it isn't already.
|
||||
if (![NSThread isMultiThreaded]) {
|
||||
[NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];
|
||||
[[[[NSThread alloc] init] autorelease] start];
|
||||
}
|
||||
|
||||
return JNI_VERSION_1_4;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -213,25 +213,23 @@ JNF_COCOA_EXIT(env);
|
||||
*/
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1moveToTrash
|
||||
(JNIEnv *env, jclass clz, jstring url)
|
||||
(JNIEnv *env, jclass clz, jstring fileName)
|
||||
{
|
||||
__block jboolean returnValue = JNI_FALSE;
|
||||
__block BOOL returnValue = NO;
|
||||
JNF_COCOA_ENTER(env);
|
||||
|
||||
NSString *path = JNFNormalizedNSStringForPath(env, url);
|
||||
NSString * path = JNFNormalizedNSStringForPath(env, fileName);
|
||||
NSURL *url = [NSURL fileURLWithPath:path];
|
||||
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
|
||||
NSInteger res = 0;
|
||||
[[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation
|
||||
source:[path stringByDeletingLastPathComponent]
|
||||
destination:nil
|
||||
files:[NSArray arrayWithObject:[path lastPathComponent]]
|
||||
tag:&res];
|
||||
returnValue = (res == 0);
|
||||
|
||||
returnValue = [[NSFileManager defaultManager] trashItemAtURL:url
|
||||
resultingItemURL:nil
|
||||
error:nil];
|
||||
}];
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return returnValue;
|
||||
return returnValue ? JNI_TRUE: JNI_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -86,16 +86,16 @@ public abstract class TIFFBaseJPEGCompressor extends TIFFCompressor {
|
||||
|
||||
/**
|
||||
* Whether to write abbreviated JPEG streams (default == false).
|
||||
* A subclass which sets this to <code>true</code> should also
|
||||
* A subclass which sets this to {@code true} should also
|
||||
* initialized {@link #JPEGStreamMetadata}.
|
||||
*/
|
||||
protected boolean writeAbbreviatedStream = false;
|
||||
|
||||
/**
|
||||
* Stream metadata equivalent to a tables-only stream such as in
|
||||
* the <code>JPEGTables</code>. Default value is <code>null</code>.
|
||||
* the {@code JPEGTables}. Default value is {@code null}.
|
||||
* This should be set by any subclass which sets
|
||||
* {@link writeAbbreviatedStream} to <code>true</code>.
|
||||
* {@link writeAbbreviatedStream} to {@code true}.
|
||||
*/
|
||||
protected IIOMetadata JPEGStreamMetadata = null;
|
||||
|
||||
@ -108,15 +108,15 @@ public abstract class TIFFBaseJPEGCompressor extends TIFFCompressor {
|
||||
/**
|
||||
* Removes nonessential nodes from a JPEG native image metadata tree.
|
||||
* All nodes derived from JPEG marker segments other than DHT, DQT,
|
||||
* SOF, SOS segments are removed unless <code>pruneTables</code> is
|
||||
* <code>true</code> in which case the nodes derived from the DHT and
|
||||
* SOF, SOS segments are removed unless {@code pruneTables} is
|
||||
* {@code true} in which case the nodes derived from the DHT and
|
||||
* DQT marker segments are also removed.
|
||||
*
|
||||
* @param tree A <tt>javax_imageio_jpeg_image_1.0</tt> tree.
|
||||
* @param pruneTables Whether to prune Huffman and quantization tables.
|
||||
* @throws NullPointerException if <code>tree</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>tree</code> is not the root
|
||||
* @throws NullPointerException if {@code tree} is
|
||||
* {@code null}.
|
||||
* @throws IllegalArgumentException if {@code tree} is not the root
|
||||
* of a JPEG native image metadata tree.
|
||||
*/
|
||||
private static void pruneNodes(Node tree, boolean pruneTables) {
|
||||
@ -182,8 +182,8 @@ public abstract class TIFFBaseJPEGCompressor extends TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* A <code>ByteArrayOutputStream</code> which allows writing to an
|
||||
* <code>ImageOutputStream</code>.
|
||||
* A {@code ByteArrayOutputStream} which allows writing to an
|
||||
* {@code ImageOutputStream}.
|
||||
*/
|
||||
private static class IIOByteArrayOutputStream extends ByteArrayOutputStream {
|
||||
IIOByteArrayOutputStream() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,39 +31,39 @@ package com.sun.imageio.plugins.tiff;
|
||||
public abstract class TIFFColorConverter {
|
||||
|
||||
/**
|
||||
* Constructs an instance of a <code>TIFFColorConverter</code>.
|
||||
* Constructs an instance of a {@code TIFFColorConverter}.
|
||||
*/
|
||||
public TIFFColorConverter() {}
|
||||
|
||||
/**
|
||||
* Converts an RGB triple into the native color space of this
|
||||
* TIFFColorConverter, and stores the result in the first three
|
||||
* entries of the <code>result</code> array.
|
||||
* entries of the {@code result} array.
|
||||
*
|
||||
* @param r the red value.
|
||||
* @param g the green value.
|
||||
* @param b the blue value.
|
||||
* @param result an array of <code>float</code>s containing three elements.
|
||||
* @throws NullPointerException if <code>result</code> is
|
||||
* <code>null</code>.
|
||||
* @param result an array of {@code float}s containing three elements.
|
||||
* @throws NullPointerException if {@code result} is
|
||||
* {@code null}.
|
||||
* @throws ArrayIndexOutOfBoundsException if
|
||||
* <code>result.length < 3</code>.
|
||||
* {@code result.length < 3}.
|
||||
*/
|
||||
public abstract void fromRGB(float r, float g, float b, float[] result);
|
||||
|
||||
/**
|
||||
* Converts a triple in the native color space of this
|
||||
* TIFFColorConverter into an RGB triple, and stores the result in
|
||||
* the first three entries of the <code>rgb</code> array.
|
||||
* the first three entries of the {@code rgb} array.
|
||||
*
|
||||
* @param x0 the value of channel 0.
|
||||
* @param x1 the value of channel 1.
|
||||
* @param x2 the value of channel 2.
|
||||
* @param rgb an array of <code>float</code>s containing three elements.
|
||||
* @throws NullPointerException if <code>rgb</code> is
|
||||
* <code>null</code>.
|
||||
* @param rgb an array of {@code float}s containing three elements.
|
||||
* @throws NullPointerException if {@code rgb} is
|
||||
* {@code null}.
|
||||
* @throws ArrayIndexOutOfBoundsException if
|
||||
* <code>rgb.length < 3</code>.
|
||||
* {@code rgb.length < 3}.
|
||||
*/
|
||||
public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -35,13 +35,13 @@ import javax.imageio.stream.ImageOutputStream;
|
||||
public abstract class TIFFCompressor {
|
||||
|
||||
/**
|
||||
* The <code>ImageWriter</code> calling this
|
||||
* <code>TIFFCompressor</code>.
|
||||
* The {@code ImageWriter} calling this
|
||||
* {@code TIFFCompressor}.
|
||||
*/
|
||||
protected ImageWriter writer;
|
||||
|
||||
/**
|
||||
* The <code>IIOMetadata</code> object containing metadata for the
|
||||
* The {@code IIOMetadata} object containing metadata for the
|
||||
* current image.
|
||||
*/
|
||||
protected IIOMetadata metadata;
|
||||
@ -63,7 +63,7 @@ public abstract class TIFFCompressor {
|
||||
protected boolean isCompressionLossless;
|
||||
|
||||
/**
|
||||
* The <code>ImageOutputStream</code> to be written.
|
||||
* The {@code ImageOutputStream} to be written.
|
||||
*/
|
||||
protected ImageOutputStream stream;
|
||||
|
||||
@ -75,26 +75,26 @@ public abstract class TIFFCompressor {
|
||||
* to provide the implementation of the compression algorithm of an
|
||||
* unsupported compression type.
|
||||
*
|
||||
* <p>The parameters <code>compressionTagValue</code> and
|
||||
* <code>isCompressionLossless</code> are provided to accomodate
|
||||
* <p>The parameters {@code compressionTagValue} and
|
||||
* {@code isCompressionLossless} are provided to accomodate
|
||||
* compression types which are unknown. A compression type is
|
||||
* "known" if it is either among those already supported by the
|
||||
* TIFF writer (see {@link TIFFImageWriteParam}), or is listed in
|
||||
* the TIFF 6.0 specification but not supported. If the compression
|
||||
* type is unknown, the <code>compressionTagValue</code> and
|
||||
* <code>isCompressionLossless</code> parameters are ignored.</p>
|
||||
* type is unknown, the {@code compressionTagValue} and
|
||||
* {@code isCompressionLossless} parameters are ignored.</p>
|
||||
*
|
||||
* @param compressionType The name of the compression type.
|
||||
* @param compressionTagValue The value to be assigned to the TIFF
|
||||
* <i>Compression</i> tag in the TIFF image metadata; ignored if
|
||||
* <code>compressionType</code> is a known type.
|
||||
* {@code compressionType} is a known type.
|
||||
* @param isCompressionLossless Whether the compression is lossless;
|
||||
* ignored if <code>compressionType</code> is a known type.
|
||||
* ignored if {@code compressionType} is a known type.
|
||||
*
|
||||
* @throws NullPointerException if <code>compressionType</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>compressionTagValue</code> is
|
||||
* less <code>1</code>.
|
||||
* @throws NullPointerException if {@code compressionType} is
|
||||
* {@code null}.
|
||||
* @throws IllegalArgumentException if {@code compressionTagValue} is
|
||||
* less {@code 1}.
|
||||
*/
|
||||
public TIFFCompressor(String compressionType,
|
||||
int compressionTagValue,
|
||||
@ -163,9 +163,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the <code>ImageOutputStream</code> to be written.
|
||||
* Sets the {@code ImageOutputStream} to be written.
|
||||
*
|
||||
* @param stream an <code>ImageOutputStream</code> to be written.
|
||||
* @param stream an {@code ImageOutputStream} to be written.
|
||||
*
|
||||
* @see #getStream
|
||||
*/
|
||||
@ -174,9 +174,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <code>ImageOutputStream</code> that will be written.
|
||||
* Returns the {@code ImageOutputStream} that will be written.
|
||||
*
|
||||
* @return an <code>ImageOutputStream</code>.
|
||||
* @return an {@code ImageOutputStream}.
|
||||
*
|
||||
* @see #setStream(ImageOutputStream)
|
||||
*/
|
||||
@ -185,9 +185,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the <code>writer</code> field.
|
||||
* Sets the value of the {@code writer} field.
|
||||
*
|
||||
* @param writer the current <code>ImageWriter</code>.
|
||||
* @param writer the current {@code ImageWriter}.
|
||||
*
|
||||
* @see #getWriter()
|
||||
*/
|
||||
@ -196,9 +196,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current <code>ImageWriter</code>.
|
||||
* Returns the current {@code ImageWriter}.
|
||||
*
|
||||
* @return an <code>ImageWriter</code>.
|
||||
* @return an {@code ImageWriter}.
|
||||
*
|
||||
* @see #setWriter(ImageWriter)
|
||||
*/
|
||||
@ -207,9 +207,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the <code>metadata</code> field.
|
||||
* Sets the value of the {@code metadata} field.
|
||||
*
|
||||
* @param metadata the <code>IIOMetadata</code> object for the
|
||||
* @param metadata the {@code IIOMetadata} object for the
|
||||
* image being written.
|
||||
*
|
||||
* @see #getMetadata()
|
||||
@ -219,9 +219,9 @@ public abstract class TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current <code>IIOMetadata</code> object.
|
||||
* Returns the current {@code IIOMetadata} object.
|
||||
*
|
||||
* @return the <code>IIOMetadata</code> object for the image being
|
||||
* @return the {@code IIOMetadata} object for the image being
|
||||
* written.
|
||||
*
|
||||
* @see #setMetadata(IIOMetadata)
|
||||
@ -232,15 +232,15 @@ public abstract class TIFFCompressor {
|
||||
|
||||
/**
|
||||
* Encodes the supplied image data, writing to the currently set
|
||||
* <code>ImageOutputStream</code>.
|
||||
* {@code ImageOutputStream}.
|
||||
*
|
||||
* @param b an array of <code>byte</code>s containing the packed
|
||||
* @param b an array of {@code byte}s containing the packed
|
||||
* but uncompressed image data.
|
||||
* @param off the starting offset of the data to be written in the
|
||||
* array <code>b</code>.
|
||||
* array {@code b}.
|
||||
* @param width the width of the rectangle of pixels to be written.
|
||||
* @param height the height of the rectangle of pixels to be written.
|
||||
* @param bitsPerSample an array of <code>int</code>s indicting
|
||||
* @param bitsPerSample an array of {@code int}s indicting
|
||||
* the number of bits used to represent each image sample within
|
||||
* a pixel.
|
||||
* @param scanlineStride the number of bytes separating each
|
||||
@ -249,7 +249,7 @@ public abstract class TIFFCompressor {
|
||||
* @return the number of bytes written.
|
||||
*
|
||||
* @throws IOException if the supplied data cannot be encoded by
|
||||
* this <code>TIFFCompressor</code>, or if any I/O error occurs
|
||||
* this {@code TIFFCompressor}, or if any I/O error occurs
|
||||
* during writing.
|
||||
*/
|
||||
public abstract int encode(byte[] b, int off,
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -29,7 +29,7 @@ import javax.imageio.metadata.IIOMetadata;
|
||||
import javax.imageio.plugins.tiff.BaselineTIFFTagSet;
|
||||
|
||||
/**
|
||||
* A <code>TIFFCompressor</code> for the JPEG variant of Exif.
|
||||
* A {@code TIFFCompressor} for the JPEG variant of Exif.
|
||||
*/
|
||||
public class TIFFExifJPEGCompressor extends TIFFBaseJPEGCompressor {
|
||||
public TIFFExifJPEGCompressor(ImageWriteParam param) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -232,12 +232,12 @@ abstract class TIFFFaxCompressor extends TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the <code>metadata</code> field.
|
||||
* Sets the value of the {@code metadata} field.
|
||||
*
|
||||
* <p> The implementation in this class also sets local options
|
||||
* from the FILL_ORDER field if it exists.</p>
|
||||
*
|
||||
* @param metadata the <code>IIOMetadata</code> object for the
|
||||
* @param metadata the {@code IIOMetadata} object for the
|
||||
* image being written.
|
||||
*
|
||||
* @see #getMetadata()
|
||||
@ -253,8 +253,8 @@ abstract class TIFFFaxCompressor extends TIFFCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return min of <code>maxOffset</code> or offset of first pixel
|
||||
* different from pixel at <code>bitOffset</code>.
|
||||
* Return min of {@code maxOffset} or offset of first pixel
|
||||
* different from pixel at {@code bitOffset}.
|
||||
*/
|
||||
public int nextState(byte[] data,
|
||||
int base,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -34,12 +34,12 @@ import javax.imageio.plugins.tiff.TIFFTag;
|
||||
import javax.imageio.plugins.tiff.TIFFTagSet;
|
||||
|
||||
/**
|
||||
* The <code>Node</code> representation of a <code>TIFFField</code>
|
||||
* The {@code Node} representation of a {@code TIFFField}
|
||||
* wherein the child node is procedural rather than buffered.
|
||||
*/
|
||||
public class TIFFFieldNode extends IIOMetadataNode {
|
||||
private static String getNodeName(TIFFField f) {
|
||||
return f.getData() instanceof TIFFDirectory ?
|
||||
return (f.hasDirectory() || f.getData() instanceof TIFFDirectory) ?
|
||||
"TIFFIFD" : "TIFFField";
|
||||
}
|
||||
|
||||
@ -52,7 +52,8 @@ public class TIFFFieldNode extends IIOMetadataNode {
|
||||
public TIFFFieldNode(TIFFField field) {
|
||||
super(getNodeName(field));
|
||||
|
||||
isIFD = field.getData() instanceof TIFFDirectory;
|
||||
isIFD = field.hasDirectory() ||
|
||||
field.getData() instanceof TIFFDirectory;
|
||||
|
||||
this.field = field;
|
||||
|
||||
@ -68,7 +69,8 @@ public class TIFFFieldNode extends IIOMetadataNode {
|
||||
setAttribute("parentTagName", tagName);
|
||||
}
|
||||
|
||||
TIFFDirectory dir = (TIFFDirectory)field.getData();
|
||||
TIFFDirectory dir = field.hasDirectory() ?
|
||||
field.getDirectory() : (TIFFDirectory)field.getData();
|
||||
TIFFTagSet[] tagSets = dir.getTagSets();
|
||||
if(tagSets != null) {
|
||||
StringBuilder tagSetNames = new StringBuilder();
|
||||
@ -90,7 +92,8 @@ public class TIFFFieldNode extends IIOMetadataNode {
|
||||
if(isInitialized) return;
|
||||
|
||||
if(isIFD) {
|
||||
TIFFDirectory dir = (TIFFDirectory)field.getData();
|
||||
TIFFDirectory dir = field.hasDirectory() ?
|
||||
field.getDirectory() : (TIFFDirectory)field.getData();
|
||||
TIFFField[] fields = dir.getTIFFFields();
|
||||
if(fields != null) {
|
||||
TIFFTagSet[] tagSets = dir.getTagSets();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -153,7 +153,7 @@ public class TIFFIFD extends TIFFDirectory {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an <code>Iterator</code> over the TIFF fields. The
|
||||
* Returns an {@code Iterator} over the TIFF fields. The
|
||||
* traversal is in the order of increasing tag number.
|
||||
*/
|
||||
// Note: the sort is guaranteed for low fields by the use of an
|
||||
@ -164,7 +164,7 @@ public class TIFFIFD extends TIFFDirectory {
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the value of a field. The <code>data</code> parameter should be
|
||||
* Read the value of a field. The {@code data} parameter should be
|
||||
* an array of length 1 of Object.
|
||||
*
|
||||
* @param stream the input stream
|
||||
@ -762,8 +762,8 @@ public class TIFFIFD extends TIFFDirectory {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>TIFFIFD</code> wherein all fields from the
|
||||
* <code>BaselineTIFFTagSet</code> are copied by value and all other
|
||||
* Returns a {@code TIFFIFD} wherein all fields from the
|
||||
* {@code BaselineTIFFTagSet} are copied by value and all other
|
||||
* fields copied by reference.
|
||||
*/
|
||||
public TIFFIFD getShallowClone() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1620,8 +1620,8 @@ public class TIFFImageMetadata extends IIOMetadata {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>TIFFImageMetadata</code> wherein all fields in the
|
||||
* root IFD from the <code>BaselineTIFFTagSet</code> are copied by value
|
||||
* Returns a {@code TIFFImageMetadata} wherein all fields in the
|
||||
* root IFD from the {@code BaselineTIFFTagSet} are copied by value
|
||||
* and all other fields copied by reference.
|
||||
*/
|
||||
public TIFFImageMetadata getShallowClone() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -83,7 +83,7 @@ public class TIFFImageReader extends ImageReader {
|
||||
// Metadata for image at 'currIndex', or null.
|
||||
private TIFFImageMetadata imageMetadata = null;
|
||||
|
||||
// A <code>List</code> of <code>Long</code>s indicating the stream
|
||||
// A {@code List} of {@code Long}s indicating the stream
|
||||
// positions of the start of the IFD for each image. Entries
|
||||
// are added as needed.
|
||||
private List<Long> imageStartPosition = new ArrayList<Long>();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -122,11 +122,11 @@ import javax.imageio.ImageWriteParam;
|
||||
* quality value is passed directly to the JPEG writer plug-in which
|
||||
* interprets it in the usual way.</p>
|
||||
*
|
||||
* <p> The <code>canWriteTiles</code> and
|
||||
* <code>canWriteCompressed</code> methods will return
|
||||
* <code>true</code>; the <code>canOffsetTiles</code> and
|
||||
* <code>canWriteProgressive</code> methods will return
|
||||
* <code>false</code>.</p>
|
||||
* <p> The {@code canWriteTiles} and
|
||||
* {@code canWriteCompressed} methods will return
|
||||
* {@code true}; the {@code canOffsetTiles} and
|
||||
* {@code canWriteProgressive} methods will return
|
||||
* {@code false}.</p>
|
||||
*
|
||||
* <p> If tiles are being written, then each of their dimensions will be
|
||||
* rounded to the nearest multiple of 16 per the TIFF specification. If
|
||||
@ -140,10 +140,10 @@ import javax.imageio.ImageWriteParam;
|
||||
public class TIFFImageWriteParam extends ImageWriteParam {
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFImageWriteParam</code> instance
|
||||
* for a given <code>Locale</code>.
|
||||
* Constructs a {@code TIFFImageWriteParam} instance
|
||||
* for a given {@code Locale}.
|
||||
*
|
||||
* @param locale the <code>Locale</code> for which messages
|
||||
* @param locale the {@code Locale} for which messages
|
||||
* should be localized.
|
||||
*/
|
||||
public TIFFImageWriteParam(Locale locale) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -221,11 +221,11 @@ public class TIFFImageWriter extends ImageWriter {
|
||||
* relative to a given tile grid layout specified by its X offset
|
||||
* and tile width.
|
||||
*
|
||||
* <p> If <code>tileWidth < 0</code>, the results of this method
|
||||
* are undefined. If <code>tileWidth == 0</code>, an
|
||||
* <code>ArithmeticException</code> will be thrown.
|
||||
* <p> If {@code tileWidth < 0}, the results of this method
|
||||
* are undefined. If {@code tileWidth == 0}, an
|
||||
* {@code ArithmeticException} will be thrown.
|
||||
*
|
||||
* @throws ArithmeticException If <code>tileWidth == 0</code>.
|
||||
* @throws ArithmeticException If {@code tileWidth == 0}.
|
||||
*/
|
||||
public static int XToTileX(int x, int tileGridXOffset, int tileWidth) {
|
||||
x -= tileGridXOffset;
|
||||
@ -240,11 +240,11 @@ public class TIFFImageWriter extends ImageWriter {
|
||||
* relative to a given tile grid layout specified by its Y offset
|
||||
* and tile height.
|
||||
*
|
||||
* <p> If <code>tileHeight < 0</code>, the results of this method
|
||||
* are undefined. If <code>tileHeight == 0</code>, an
|
||||
* <code>ArithmeticException</code> will be thrown.
|
||||
* <p> If {@code tileHeight < 0}, the results of this method
|
||||
* are undefined. If {@code tileHeight == 0}, an
|
||||
* {@code ArithmeticException} will be thrown.
|
||||
*
|
||||
* @throws ArithmeticException If <code>tileHeight == 0</code>.
|
||||
* @throws ArithmeticException If {@code tileHeight == 0}.
|
||||
*/
|
||||
public static int YToTileY(int y, int tileGridYOffset, int tileHeight) {
|
||||
y -= tileGridYOffset;
|
||||
@ -424,17 +424,17 @@ public class TIFFImageWriter extends ImageWriter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a standard <code>javax_imageio_1.0</code> tree to a
|
||||
* <code>TIFFImageMetadata</code> object.
|
||||
* Converts a standard {@code javax_imageio_1.0} tree to a
|
||||
* {@code TIFFImageMetadata} object.
|
||||
*
|
||||
* @param inData The metadata object.
|
||||
* @return a <code>TIFFImageMetadata</code> or <code>null</code> if
|
||||
* the standard tree derived from the input object is <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>inData</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>inData</code> does not support
|
||||
* @return a {@code TIFFImageMetadata} or {@code null} if
|
||||
* the standard tree derived from the input object is {@code null}.
|
||||
* @throws IllegalArgumentException if {@code inData} is
|
||||
* {@code null}.
|
||||
* @throws IllegalArgumentException if {@code inData} does not support
|
||||
* the standard metadata format.
|
||||
* @throws IIOInvalidTreeException if <code>inData</code> generates an
|
||||
* @throws IIOInvalidTreeException if {@code inData} generates an
|
||||
* invalid standard metadata tree.
|
||||
*/
|
||||
private TIFFImageMetadata convertStandardImageMetadata(IIOMetadata inData)
|
||||
@ -463,15 +463,15 @@ public class TIFFImageWriter extends ImageWriter {
|
||||
|
||||
/**
|
||||
* Converts a native
|
||||
* <code>javax_imageio_tiff_image_1.0</code> tree to a
|
||||
* <code>TIFFImageMetadata</code> object.
|
||||
* {@code javax_imageio_tiff_image_1.0} tree to a
|
||||
* {@code TIFFImageMetadata} object.
|
||||
*
|
||||
* @param inData The metadata object.
|
||||
* @return a <code>TIFFImageMetadata</code> or <code>null</code> if
|
||||
* the native tree derived from the input object is <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>inData</code> is
|
||||
* <code>null</code> or does not support the native metadata format.
|
||||
* @throws IIOInvalidTreeException if <code>inData</code> generates an
|
||||
* @return a {@code TIFFImageMetadata} or {@code null} if
|
||||
* the native tree derived from the input object is {@code null}.
|
||||
* @throws IllegalArgumentException if {@code inData} is
|
||||
* {@code null} or does not support the native metadata format.
|
||||
* @throws IIOInvalidTreeException if {@code inData} generates an
|
||||
* invalid native metadata tree.
|
||||
*/
|
||||
private TIFFImageMetadata convertNativeImageMetadata(IIOMetadata inData)
|
||||
@ -504,8 +504,8 @@ public class TIFFImageWriter extends ImageWriter {
|
||||
* as needed. The destination image dimensions are provided as parameters
|
||||
* because these might differ from those of the source due to subsampling.
|
||||
*
|
||||
* @param cm The <code>ColorModel</code> of the image being written.
|
||||
* @param sm The <code>SampleModel</code> of the image being written.
|
||||
* @param cm The {@code ColorModel} of the image being written.
|
||||
* @param sm The {@code SampleModel} of the image being written.
|
||||
* @param destWidth The width of the written image after subsampling.
|
||||
* @param destHeight The height of the written image after subsampling.
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -102,14 +102,14 @@ public class TIFFJPEGCompressor extends TIFFBaseJPEGCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the <code>metadata</code> field.
|
||||
* Sets the value of the {@code metadata} field.
|
||||
*
|
||||
* <p>The implementation in this class also adds the TIFF fields
|
||||
* JPEGTables, YCbCrSubSampling, YCbCrPositioning, and
|
||||
* ReferenceBlackWhite superseding any prior settings of those
|
||||
* fields.</p>
|
||||
*
|
||||
* @param metadata the <code>IIOMetadata</code> object for the
|
||||
* @param metadata the {@code IIOMetadata} object for the
|
||||
* image being written.
|
||||
*
|
||||
* @see #getMetadata()
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -245,7 +245,7 @@ class TIFFLZWDecompressor extends TIFFDecompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Append <code>newString</code> to the end of <code>oldString</code>.
|
||||
* Append {@code newString} to the end of {@code oldString}.
|
||||
*/
|
||||
public byte[] composeString(byte oldString[], byte newString) {
|
||||
int length = oldString.length;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -188,7 +188,7 @@ class TIFFLZWUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* Append <code>newString</code> to the end of <code>oldString</code>.
|
||||
* Append {@code newString} to the end of {@code oldString}.
|
||||
*/
|
||||
public byte[] composeString(byte oldString[], byte newString) {
|
||||
int length = oldString.length;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -34,16 +34,16 @@ public class TIFFNullDecompressor extends TIFFDecompressor {
|
||||
*/
|
||||
private boolean isReadActiveOnly = false;
|
||||
|
||||
/** The original value of <code>srcMinX</code>. */
|
||||
/** The original value of {@code srcMinX}. */
|
||||
private int originalSrcMinX;
|
||||
|
||||
/** The original value of <code>srcMinY</code>. */
|
||||
/** The original value of {@code srcMinY}. */
|
||||
private int originalSrcMinY;
|
||||
|
||||
/** The original value of <code>srcWidth</code>. */
|
||||
/** The original value of {@code srcWidth}. */
|
||||
private int originalSrcWidth;
|
||||
|
||||
/** The original value of <code>srcHeight</code>. */
|
||||
/** The original value of {@code srcHeight}. */
|
||||
private int originalSrcHeight;
|
||||
|
||||
public TIFFNullDecompressor() {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -34,7 +34,7 @@ import javax.imageio.plugins.tiff.BaselineTIFFTagSet;
|
||||
import javax.imageio.plugins.tiff.TIFFField;
|
||||
|
||||
/**
|
||||
* <code>TIFFDecompressor</code> for "Old JPEG" compression.
|
||||
* {@code TIFFDecompressor} for "Old JPEG" compression.
|
||||
*/
|
||||
public class TIFFOldJPEGDecompressor extends TIFFJPEGDecompressor {
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -42,8 +42,8 @@ public class TIFFRLECompressor extends TIFFFaxCompressor {
|
||||
* CCITT RLE (Run Lenth Encoding).
|
||||
*
|
||||
* @param data The row of data to compress.
|
||||
* @param rowOffset Starting index in <code>data</code>.
|
||||
* @param colOffset Bit offset within first <code>data[rowOffset]</code>.
|
||||
* @param rowOffset Starting index in {@code data}.
|
||||
* @param colOffset Bit offset within first {@code data[rowOffset]}.
|
||||
* @param rowLength Number of bits in the row.
|
||||
* @param compData The compressed data.
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -85,15 +85,15 @@ public class TIFFRenderedImage implements RenderedImage {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a copy of <code>param</code>. The source subsampling and
|
||||
* Creates a copy of {@code param}. The source subsampling and
|
||||
* and bands settings and the destination bands and offset settings
|
||||
* are copied. If <code>param</code> is a <code>TIFFImageReadParam</code>
|
||||
* then the <code>TIFFDecompressor</code> and
|
||||
* <code>TIFFColorConverter</code> settings are also copied; otherwise
|
||||
* they are explicitly set to <code>null</code>.
|
||||
* are copied. If {@code param} is a {@code TIFFImageReadParam}
|
||||
* then the {@code TIFFDecompressor} and
|
||||
* {@code TIFFColorConverter} settings are also copied; otherwise
|
||||
* they are explicitly set to {@code null}.
|
||||
*
|
||||
* @param param the parameters to be copied.
|
||||
* @param copyTagSets whether the <code>TIFFTagSet</code> settings
|
||||
* @param copyTagSets whether the {@code TIFFTagSet} settings
|
||||
* should be copied if set.
|
||||
* @return copied parameters.
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -41,13 +41,13 @@ public class TIFFT4Compressor extends TIFFFaxCompressor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the <code>metadata</code> field.
|
||||
* Sets the value of the {@code metadata} field.
|
||||
*
|
||||
* <p> The implementation in this class also sets local options
|
||||
* from the T4_OPTIONS field if it exists, and if it doesn't, adds
|
||||
* it with default values.</p>
|
||||
*
|
||||
* @param metadata the <code>IIOMetadata</code> object for the
|
||||
* @param metadata the {@code IIOMetadata} object for the
|
||||
* image being written.
|
||||
*
|
||||
* @see #getMetadata()
|
||||
@ -86,7 +86,7 @@ public class TIFFT4Compressor extends TIFFFaxCompressor {
|
||||
* @param isEOLAligned Whether EOL bit sequences should be padded.
|
||||
* @param data The row of data to compress.
|
||||
* @param lineStride Byte step between the same sample in different rows.
|
||||
* @param colOffset Bit offset within first <code>data[rowOffset]</code>.
|
||||
* @param colOffset Bit offset within first {@code data[rowOffset]}.
|
||||
* @param width Number of bits in the row.
|
||||
* @param height Number of rows in the buffer.
|
||||
* @param compData The compressed data.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -42,7 +42,7 @@ public class TIFFT6Compressor extends TIFFFaxCompressor {
|
||||
*
|
||||
* @param data The row of data to compress.
|
||||
* @param lineStride Byte step between the same sample in different rows.
|
||||
* @param colOffset Bit offset within first <code>data[rowOffset]</code>.
|
||||
* @param colOffset Bit offset within first {@code data[rowOffset]}.
|
||||
* @param width Number of bits in the row.
|
||||
* @param height Number of rows in the buffer.
|
||||
* @param compData The compressed data.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,11 +26,11 @@
|
||||
package com.sun.media.sound;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFileFormat.Type;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.UnsupportedAudioFileException;
|
||||
@ -49,11 +49,6 @@ public final class AiffFileReader extends SunFileReader {
|
||||
throws UnsupportedAudioFileException, IOException {
|
||||
DataInputStream dis = new DataInputStream(stream);
|
||||
|
||||
// assumes a stream at the beginning of the file which has already
|
||||
// passed the magic number test...
|
||||
// leaves the input stream at the beginning of the audio data
|
||||
int fileRead = 0;
|
||||
int dataLength = 0;
|
||||
AudioFormat format = null;
|
||||
|
||||
// Read the magic number
|
||||
@ -65,9 +60,9 @@ public final class AiffFileReader extends SunFileReader {
|
||||
throw new UnsupportedAudioFileException("not an AIFF file");
|
||||
}
|
||||
|
||||
int frameLength = 0;
|
||||
int length = dis.readInt();
|
||||
int iffType = dis.readInt();
|
||||
fileRead += 12;
|
||||
|
||||
int totallength;
|
||||
if(length <= 0 ) {
|
||||
@ -91,7 +86,6 @@ public final class AiffFileReader extends SunFileReader {
|
||||
// Read the chunk name
|
||||
int chunkName = dis.readInt();
|
||||
int chunkLen = dis.readInt();
|
||||
fileRead += 8;
|
||||
|
||||
int chunkRead = 0;
|
||||
|
||||
@ -112,7 +106,13 @@ public final class AiffFileReader extends SunFileReader {
|
||||
if (channels <= 0) {
|
||||
throw new UnsupportedAudioFileException("Invalid number of channels");
|
||||
}
|
||||
dis.readInt(); // numSampleFrames
|
||||
frameLength = dis.readInt(); // numSampleFrames
|
||||
if (frameLength < 0) {
|
||||
// AiffFileFormat uses int, unlike AIS which uses long
|
||||
//TODO this (negative) value should be passed as long to AIS
|
||||
frameLength = AudioSystem.NOT_SPECIFIED;
|
||||
}
|
||||
|
||||
int sampleSizeInBits = dis.readUnsignedShort();
|
||||
if (sampleSizeInBits < 1 || sampleSizeInBits > 32) {
|
||||
throw new UnsupportedAudioFileException("Invalid AIFF/COMM sampleSize");
|
||||
@ -149,38 +149,17 @@ public final class AiffFileReader extends SunFileReader {
|
||||
break;
|
||||
case AiffFileFormat.SSND_MAGIC:
|
||||
// Data chunk.
|
||||
// we are getting *weird* numbers for chunkLen sometimes;
|
||||
// this really should be the size of the data chunk....
|
||||
int dataOffset = dis.readInt();
|
||||
int blocksize = dis.readInt();
|
||||
int dataOffset = dis.readInt(); // for now unused in javasound
|
||||
int blocksize = dis.readInt(); // for now unused in javasound
|
||||
chunkRead += 8;
|
||||
|
||||
// okay, now we are done reading the header. we need to set the size
|
||||
// of the data segment. we know that sometimes the value we get for
|
||||
// the chunksize is absurd. this is the best i can think of:if the
|
||||
// value seems okay, use it. otherwise, we get our value of
|
||||
// length by assuming that everything left is the data segment;
|
||||
// its length should be our original length (for all AIFF data chunks)
|
||||
// minus what we've read so far.
|
||||
// $$kk: we should be able to get length for the data chunk right after
|
||||
// we find "SSND." however, some aiff files give *weird* numbers. what
|
||||
// is going on??
|
||||
|
||||
if (chunkLen < length) {
|
||||
dataLength = chunkLen - chunkRead;
|
||||
} else {
|
||||
// $$kk: 11.03.98: this seems dangerous!
|
||||
dataLength = length - (fileRead + chunkRead);
|
||||
}
|
||||
ssndFound = true;
|
||||
break;
|
||||
} // switch
|
||||
fileRead += chunkRead;
|
||||
// skip the remainder of this chunk
|
||||
if (!ssndFound) {
|
||||
int toSkip = chunkLen - chunkRead;
|
||||
if (toSkip > 0) {
|
||||
fileRead += dis.skipBytes(toSkip);
|
||||
dis.skipBytes(toSkip);
|
||||
}
|
||||
}
|
||||
} // while
|
||||
@ -188,36 +167,12 @@ public final class AiffFileReader extends SunFileReader {
|
||||
if (format == null) {
|
||||
throw new UnsupportedAudioFileException("missing COMM chunk");
|
||||
}
|
||||
AudioFileFormat.Type type = aifc?AudioFileFormat.Type.AIFC:AudioFileFormat.Type.AIFF;
|
||||
Type type = aifc ? Type.AIFC : Type.AIFF;
|
||||
|
||||
return new AiffFileFormat(type, totallength, format, dataLength / format.getFrameSize());
|
||||
return new AiffFileFormat(type, totallength, format, frameLength);
|
||||
}
|
||||
|
||||
// HELPER METHODS
|
||||
/** write_ieee_extended(DataOutputStream dos, double f) throws IOException {
|
||||
* Extended precision IEEE floating-point conversion routine.
|
||||
* @argument DataOutputStream
|
||||
* @argument double
|
||||
* @return void
|
||||
* @exception IOException
|
||||
*/
|
||||
private void write_ieee_extended(DataOutputStream dos, double f) throws IOException {
|
||||
|
||||
int exponent = 16398;
|
||||
double highMantissa = f;
|
||||
|
||||
// For now write the integer portion of f
|
||||
// $$jb: 03.30.99: stay in synch with JMF on this!!!!
|
||||
while (highMantissa < 44000) {
|
||||
highMantissa *= 2;
|
||||
exponent--;
|
||||
}
|
||||
dos.writeShort(exponent);
|
||||
dos.writeInt( ((int) highMantissa) << 16);
|
||||
dos.writeInt(0); // low Mantissa
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* read_ieee_extended
|
||||
* Extended precision IEEE floating-point conversion routine.
|
||||
|
@ -59,7 +59,6 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
super(new AudioFileFormat.Type[]{AudioFileFormat.Type.AIFF});
|
||||
}
|
||||
|
||||
|
||||
// METHODS TO IMPLEMENT AudioFileWriter
|
||||
|
||||
@Override
|
||||
@ -83,7 +82,6 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
return new AudioFileFormat.Type[0];
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out) throws IOException {
|
||||
Objects.requireNonNull(stream);
|
||||
@ -102,11 +100,9 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
throw new IOException("stream length not specified");
|
||||
}
|
||||
|
||||
int bytesWritten = writeAiffFile(stream, aiffFileFormat, out);
|
||||
return bytesWritten;
|
||||
return writeAiffFile(stream, aiffFileFormat, out);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, File out) throws IOException {
|
||||
Objects.requireNonNull(stream);
|
||||
@ -129,12 +125,15 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
|
||||
// $$kk: 10.22.99: jan: please either implement this or throw an exception!
|
||||
// $$fb: 2001-07-13: done. Fixes Bug 4479981
|
||||
int ssndBlockSize = (aiffFileFormat.getFormat().getChannels() * aiffFileFormat.getFormat().getSampleSizeInBits());
|
||||
int channels = aiffFileFormat.getFormat().getChannels();
|
||||
int sampleSize = aiffFileFormat.getFormat().getSampleSizeInBits();
|
||||
int ssndBlockSize = channels * ((sampleSize + 7) / 8);
|
||||
|
||||
int aiffLength=bytesWritten;
|
||||
int ssndChunkSize=aiffLength-aiffFileFormat.getHeaderSize()+16;
|
||||
long dataSize=ssndChunkSize-16;
|
||||
int numFrames=(int) (dataSize*8/ssndBlockSize);
|
||||
//TODO possibly incorrect round
|
||||
int numFrames = (int) (dataSize / ssndBlockSize);
|
||||
|
||||
RandomAccessFile raf=new RandomAccessFile(out, "rw");
|
||||
// skip FORM magic
|
||||
@ -173,12 +172,7 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
AudioFormat streamFormat = stream.getFormat();
|
||||
AudioFormat.Encoding streamEncoding = streamFormat.getEncoding();
|
||||
|
||||
|
||||
float sampleRate;
|
||||
int sampleSizeInBits;
|
||||
int channels;
|
||||
int frameSize;
|
||||
float frameRate;
|
||||
int fileSize;
|
||||
boolean convert8to16 = false;
|
||||
|
||||
@ -235,7 +229,6 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
return fileFormat;
|
||||
}
|
||||
|
||||
|
||||
private int writeAiffFile(InputStream in, AiffFileFormat aiffFileFormat, OutputStream out) throws IOException {
|
||||
|
||||
int bytesRead = 0;
|
||||
@ -275,25 +268,20 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
AudioFormat.Encoding encoding = null;
|
||||
|
||||
//$$fb a little bit nicer handling of constants
|
||||
|
||||
//int headerSize = 54;
|
||||
int headerSize = aiffFileFormat.getHeaderSize();
|
||||
|
||||
//int fverChunkSize = 0;
|
||||
int fverChunkSize = aiffFileFormat.getFverChunkSize();
|
||||
//int commChunkSize = 26;
|
||||
int commChunkSize = aiffFileFormat.getCommChunkSize();
|
||||
int aiffLength = -1;
|
||||
int ssndChunkSize = -1;
|
||||
//int ssndOffset = headerSize - 16;
|
||||
int ssndOffset = aiffFileFormat.getSsndChunkOffset();
|
||||
short channels = (short) format.getChannels();
|
||||
short sampleSize = (short) format.getSampleSizeInBits();
|
||||
int ssndBlockSize = (channels * sampleSize);
|
||||
int numFrames = aiffFileFormat.getFrameLength();
|
||||
long dataSize = -1;
|
||||
int ssndBlockSize = channels * ((sampleSize + 7) / 8);
|
||||
int numFrames = aiffFileFormat.getFrameLength();
|
||||
long dataSize = -1;
|
||||
if( numFrames != AudioSystem.NOT_SPECIFIED) {
|
||||
dataSize = (long) numFrames * ssndBlockSize / 8;
|
||||
dataSize = (long) numFrames * ssndBlockSize;
|
||||
ssndChunkSize = (int)dataSize + 16;
|
||||
aiffLength = (int)dataSize+headerSize;
|
||||
}
|
||||
@ -403,9 +391,6 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// HELPER METHODS
|
||||
|
||||
private static final int DOUBLE_MANTISSA_LENGTH = 52;
|
||||
@ -452,6 +437,4 @@ public final class AiffFileWriter extends SunFileWriter {
|
||||
dos.writeShort(extendedBits79To64);
|
||||
dos.writeLong(extendedBits63To0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -255,16 +255,17 @@ public final class WaveExtensibleFileReader extends SunFileReader {
|
||||
public AudioInputStream getAudioInputStream(final InputStream stream)
|
||||
throws UnsupportedAudioFileException, IOException {
|
||||
|
||||
AudioFileFormat format = getAudioFileFormat(stream);
|
||||
final AudioFileFormat format = getAudioFileFormat(stream);
|
||||
// we've got everything, the stream is supported and it is at the
|
||||
// beginning of the header, so find the data chunk again and return an
|
||||
// AudioInputStream
|
||||
RIFFReader riffiterator = new RIFFReader(stream);
|
||||
final RIFFReader riffiterator = new RIFFReader(stream);
|
||||
while (riffiterator.hasNextChunk()) {
|
||||
RIFFReader chunk = riffiterator.nextChunk();
|
||||
if (chunk.getFormat().equals("data")) {
|
||||
return new AudioInputStream(chunk, format.getFormat(), chunk
|
||||
.getSize());
|
||||
final AudioFormat af = format.getFormat();
|
||||
final long length = chunk.getSize() / af.getFrameSize();
|
||||
return new AudioInputStream(chunk, af, length);
|
||||
}
|
||||
}
|
||||
throw new UnsupportedAudioFileException();
|
||||
|
@ -95,16 +95,17 @@ public final class WaveFloatFileReader extends SunFileReader {
|
||||
public AudioInputStream getAudioInputStream(final InputStream stream)
|
||||
throws UnsupportedAudioFileException, IOException {
|
||||
|
||||
AudioFileFormat format = getAudioFileFormat(stream);
|
||||
final AudioFileFormat format = getAudioFileFormat(stream);
|
||||
// we've got everything, the stream is supported and it is at the
|
||||
// beginning of the header, so find the data chunk again and return an
|
||||
// AudioInputStream
|
||||
RIFFReader riffiterator = new RIFFReader(stream);
|
||||
final RIFFReader riffiterator = new RIFFReader(stream);
|
||||
while (riffiterator.hasNextChunk()) {
|
||||
RIFFReader chunk = riffiterator.nextChunk();
|
||||
if (chunk.getFormat().equals("data")) {
|
||||
return new AudioInputStream(chunk, format.getFormat(),
|
||||
chunk.getSize());
|
||||
final AudioFormat af = format.getFormat();
|
||||
final long length = chunk.getSize() / af.getFrameSize();
|
||||
return new AudioInputStream(chunk, af, length);
|
||||
}
|
||||
}
|
||||
throw new UnsupportedAudioFileException();
|
||||
|
@ -231,7 +231,9 @@ public class ContainerOrderFocusTraversalPolicy extends FocusTraversalPolicy
|
||||
// Before all the checks below we first see if it's an FTP provider or a focus cycle root.
|
||||
// If it's the case just go down cycle (if it's set to "implicit").
|
||||
Component comp = getComponentDownCycle(aComponent, FORWARD_TRAVERSAL);
|
||||
if (comp != null) {
|
||||
// Check if aComponent is focus-cycle-root's default Component, i.e.
|
||||
// focus cycle root & focus-cycle-root's default Component is same.
|
||||
if (comp != null && comp != aComponent) {
|
||||
return comp;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -526,8 +526,11 @@ public class EventHandler implements InvocationHandler {
|
||||
* @throws NullPointerException if {@code listenerInterface} is null
|
||||
* @throws NullPointerException if {@code target} is null
|
||||
* @throws NullPointerException if {@code action} is null
|
||||
*
|
||||
* @throws IllegalArgumentException if creating a Proxy for
|
||||
* {@code listenerInterface} fails for any of the restrictions
|
||||
* specified by {@link Proxy#newProxyInstance}
|
||||
* @see #create(Class, Object, String, String)
|
||||
* @see Proxy#newProxyInstance
|
||||
*/
|
||||
public static <T> T create(Class<T> listenerInterface,
|
||||
Object target, String action)
|
||||
@ -584,8 +587,11 @@ public class EventHandler implements InvocationHandler {
|
||||
* @throws NullPointerException if {@code listenerInterface} is null
|
||||
* @throws NullPointerException if {@code target} is null
|
||||
* @throws NullPointerException if {@code action} is null
|
||||
*
|
||||
* @throws IllegalArgumentException if creating a Proxy for
|
||||
* {@code listenerInterface} fails for any of the restrictions
|
||||
* specified by {@link Proxy#newProxyInstance}
|
||||
* @see #create(Class, Object, String, String, String)
|
||||
* @see Proxy#newProxyInstance
|
||||
*/
|
||||
public static <T> T create(Class<T> listenerInterface,
|
||||
Object target, String action,
|
||||
@ -675,8 +681,11 @@ public class EventHandler implements InvocationHandler {
|
||||
* @throws NullPointerException if {@code listenerInterface} is null
|
||||
* @throws NullPointerException if {@code target} is null
|
||||
* @throws NullPointerException if {@code action} is null
|
||||
*
|
||||
* @throws IllegalArgumentException if creating a Proxy for
|
||||
* {@code listenerInterface} fails for any of the restrictions
|
||||
* specified by {@link Proxy#newProxyInstance}
|
||||
* @see EventHandler
|
||||
* @see Proxy#newProxyInstance
|
||||
*/
|
||||
public static <T> T create(Class<T> listenerInterface,
|
||||
Object target, String action,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,7 +27,8 @@ package java.beans;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.Toolkit;
|
||||
import java.io.InputStream;
|
||||
import java.awt.image.ImageProducer;
|
||||
import java.net.URL;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
@ -171,19 +172,24 @@ public class SimpleBeanInfo implements BeanInfo {
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a utility method to help in loading icon images.
|
||||
* It takes the name of a resource file associated with the
|
||||
* current object's class file and loads an image object
|
||||
* from that file. Typically images will be GIFs.
|
||||
* This is a utility method to help in loading icon images. It takes the
|
||||
* name of a resource file associated with the current object's class file
|
||||
* and loads an image object from that file. Typically images will be GIFs.
|
||||
*
|
||||
* @param resourceName A pathname relative to the directory
|
||||
* holding the class file of the current class. For example,
|
||||
* "wombat.gif".
|
||||
* @return an image object. May be null if the load failed.
|
||||
* @param resourceName A pathname relative to the directory holding the
|
||||
* class file of the current class. For example, "wombat.gif".
|
||||
* @return an image object or null if the resource is not found or the
|
||||
* resource could not be loaded as an Image
|
||||
*/
|
||||
public Image loadImage(final String resourceName) {
|
||||
try (InputStream in = getClass().getResourceAsStream(resourceName)) {
|
||||
return Toolkit.getDefaultToolkit().createImage(in.readAllBytes());
|
||||
try {
|
||||
final URL url = getClass().getResource(resourceName);
|
||||
if (url != null) {
|
||||
final ImageProducer ip = (ImageProducer) url.getContent();
|
||||
if (ip != null) {
|
||||
return Toolkit.getDefaultToolkit().createImage(ip);
|
||||
}
|
||||
}
|
||||
} catch (final Exception ignored) {
|
||||
}
|
||||
return null;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2175,9 +2175,9 @@ public class BaselineTIFFTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of a <code>BaselineTIFFTagSet</code>.
|
||||
* Returns a shared instance of a {@code BaselineTIFFTagSet}.
|
||||
*
|
||||
* @return a <code>BaselineTIFFTagSet</code> instance.
|
||||
* @return a {@code BaselineTIFFTagSet} instance.
|
||||
*/
|
||||
public synchronized static BaselineTIFFTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -51,7 +51,7 @@ public class ExifGPSTagSet extends TIFFTagSet {
|
||||
/**
|
||||
* A value to be used with the "GPSVersionID" tag to indicate GPS version
|
||||
* 2.2. The value equals the US-ASCII encoding of the byte array
|
||||
* <code>{'2', '2', '0', '0'}</code>.
|
||||
* {@code {'2', '2', '0', '0'}}.
|
||||
*
|
||||
* @see #TAG_GPS_VERSION_ID
|
||||
*/
|
||||
@ -711,9 +711,9 @@ public class ExifGPSTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of an <code>ExifGPSTagSet</code>.
|
||||
* Returns a shared instance of an {@code ExifGPSTagSet}.
|
||||
*
|
||||
* @return an <code>ExifGPSTagSet</code> instance.
|
||||
* @return an {@code ExifGPSTagSet} instance.
|
||||
*/
|
||||
public synchronized static ExifGPSTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -88,9 +88,9 @@ public class ExifInteroperabilityTagSet extends TIFFTagSet {
|
||||
|
||||
/**
|
||||
* Returns the shared instance of
|
||||
* <code>ExifInteroperabilityTagSet</code>.
|
||||
* {@code ExifInteroperabilityTagSet}.
|
||||
*
|
||||
* @return the <code>ExifInteroperabilityTagSet</code> instance.
|
||||
* @return the {@code ExifInteroperabilityTagSet} instance.
|
||||
*/
|
||||
public synchronized static ExifInteroperabilityTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -80,9 +80,9 @@ public class ExifParentTIFFTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of an <code>ExifParentTIFFTagSet</code>.
|
||||
* Returns a shared instance of an {@code ExifParentTIFFTagSet}.
|
||||
*
|
||||
* @return an <code>ExifParentTIFFTagSet</code> instance.
|
||||
* @return an {@code ExifParentTIFFTagSet} instance.
|
||||
*/
|
||||
public synchronized static ExifParentTIFFTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,7 +33,7 @@ import java.util.List;
|
||||
* standard for annotating images used by most digital camera
|
||||
* manufacturers. The Exif specification may be found at
|
||||
* <a href="http://www.exif.org/Exif2-2.PDF">
|
||||
* <code>http://www.exif.org/Exif2-2.PDF</code>
|
||||
* {@code http://www.exif.org/Exif2-2.PDF}
|
||||
* </a>.
|
||||
*
|
||||
* <p> The definitions of the data types referenced by the field
|
||||
@ -67,7 +67,7 @@ public class ExifTIFFTagSet extends TIFFTagSet {
|
||||
/**
|
||||
* A value to be used with the "ExifVersion" tag to indicate Exif version
|
||||
* 2.1. The value equals the US-ASCII encoding of the byte array
|
||||
* <code>{'0', '2', '1', '0'}</code>.
|
||||
* {@code {'0', '2', '1', '0'}}.
|
||||
*
|
||||
* @see #TAG_EXIF_VERSION
|
||||
*/
|
||||
@ -78,7 +78,7 @@ public class ExifTIFFTagSet extends TIFFTagSet {
|
||||
/**
|
||||
* A value to be used with the "ExifVersion" tag to indicate Exif version
|
||||
* 2.2. The value equals the US-ASCII encoding of the byte array
|
||||
* <code>{'0', '2', '2', '0'}</code>.
|
||||
* {@code {'0', '2', '2', '0'}}.
|
||||
*
|
||||
* @see #TAG_EXIF_VERSION
|
||||
*/
|
||||
@ -94,7 +94,7 @@ public class ExifTIFFTagSet extends TIFFTagSet {
|
||||
|
||||
/**
|
||||
* A tag indicating the color space information (type SHORT). The
|
||||
* legal values are given by the <code>COLOR_SPACE_*</code>
|
||||
* legal values are given by the {@code COLOR_SPACE_*}
|
||||
* constants.
|
||||
*
|
||||
* @see #COLOR_SPACE_SRGB
|
||||
@ -1256,7 +1256,7 @@ public class ExifTIFFTagSet extends TIFFTagSet {
|
||||
static class ExifVersion extends TIFFTag {
|
||||
|
||||
public ExifVersion() {
|
||||
super("Exifversion",
|
||||
super("ExifVersion",
|
||||
TAG_EXIF_VERSION,
|
||||
1 << TIFFTag.TIFF_UNDEFINED,
|
||||
4);
|
||||
@ -1992,9 +1992,9 @@ public class ExifTIFFTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of an <code>ExifTIFFTagSet</code>.
|
||||
* Returns a shared instance of an {@code ExifTIFFTagSet}.
|
||||
*
|
||||
* @return an <code>ExifTIFFTagSet</code> instance.
|
||||
* @return an {@code ExifTIFFTagSet} instance.
|
||||
*/
|
||||
public synchronized static ExifTIFFTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -131,9 +131,9 @@ public class FaxTIFFTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of a <code>FaxTIFFTagSet</code>.
|
||||
* Returns a shared instance of a {@code FaxTIFFTagSet}.
|
||||
*
|
||||
* @return a <code>FaxTIFFTagSet</code> instance.
|
||||
* @return a {@code FaxTIFFTagSet} instance.
|
||||
*/
|
||||
public synchronized static FaxTIFFTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,7 +32,7 @@ import java.util.List;
|
||||
* standard for annotating georeferenced or geocoded raster imagery.
|
||||
* The GeoTIFF specification may be found at <a
|
||||
* href="http://www.remotesensing.org/geotiff/spec/geotiffhome.html">
|
||||
* <code>http://www.remotesensing.org/geotiff/spec/geotiffhome.html</code>
|
||||
* {@code http://www.remotesensing.org/geotiff/spec/geotiffhome.html}
|
||||
* </a>. This class does <i>not</i> handle the <i>GeoKey</i>s referenced
|
||||
* from a <i>GeoKeyDirectoryTag</i> as those are not TIFF tags per se.
|
||||
*
|
||||
@ -63,7 +63,7 @@ public class GeoTIFFTagSet extends TIFFTagSet {
|
||||
/** A tag used to store the <i>GeoKey</i> directory. */
|
||||
public static final int TAG_GEO_KEY_DIRECTORY = 34735;
|
||||
|
||||
/** A tag used to store all <code>double</code>-values <i>GeoKey</i>s. */
|
||||
/** A tag used to store all {@code double}-values <i>GeoKey</i>s. */
|
||||
public static final int TAG_GEO_DOUBLE_PARAMS = 34736;
|
||||
|
||||
/** A tag used to store all ASCII-values <i>GeoKey</i>s. */
|
||||
@ -97,7 +97,7 @@ public class GeoTIFFTagSet extends TIFFTagSet {
|
||||
|
||||
static class GeoKeyDirectory extends TIFFTag {
|
||||
public GeoKeyDirectory() {
|
||||
super("GeoKeyDirectory",
|
||||
super("GeoKeyDirectoryTag",
|
||||
TAG_GEO_KEY_DIRECTORY,
|
||||
1 << TIFFTag.TIFF_SHORT);
|
||||
}
|
||||
@ -105,7 +105,7 @@ public class GeoTIFFTagSet extends TIFFTagSet {
|
||||
|
||||
static class GeoDoubleParams extends TIFFTag {
|
||||
public GeoDoubleParams() {
|
||||
super("GeoDoubleParams",
|
||||
super("GeoDoubleParamsTag",
|
||||
TAG_GEO_DOUBLE_PARAMS,
|
||||
1 << TIFFTag.TIFF_DOUBLE);
|
||||
}
|
||||
@ -113,7 +113,7 @@ public class GeoTIFFTagSet extends TIFFTagSet {
|
||||
|
||||
static class GeoAsciiParams extends TIFFTag {
|
||||
public GeoAsciiParams() {
|
||||
super("GeoAsciiParams",
|
||||
super("GeoAsciiParamsTag",
|
||||
TAG_GEO_ASCII_PARAMS,
|
||||
1 << TIFFTag.TIFF_ASCII);
|
||||
}
|
||||
@ -137,9 +137,9 @@ public class GeoTIFFTagSet extends TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shared instance of a <code>GeoTIFFTagSet</code>.
|
||||
* Returns a shared instance of a {@code GeoTIFFTagSet}.
|
||||
*
|
||||
* @return a <code>GeoTIFFTagSet</code> instance.
|
||||
* @return a {@code GeoTIFFTagSet} instance.
|
||||
*/
|
||||
public synchronized static GeoTIFFTagSet getInstance() {
|
||||
if (theInstance == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -41,58 +41,58 @@ import com.sun.imageio.plugins.tiff.TIFFImageMetadata;
|
||||
* image metadata. A TIFF image metadata tree represents an Image File
|
||||
* Directory (IFD) from a TIFF 6.0 stream. An IFD consists of a number of
|
||||
* IFD Entries each of which associates an identifying tag number with
|
||||
* a compatible value. A <code>TIFFDirectory</code> instance corresponds
|
||||
* a compatible value. A {@code TIFFDirectory} instance corresponds
|
||||
* to an IFD and contains a set of {@link TIFFField}s each of which
|
||||
* corresponds to an IFD Entry in the IFD.
|
||||
*
|
||||
* <p>When reading, a <code>TIFFDirectory</code> may be created by passing
|
||||
* <p>When reading, a {@code TIFFDirectory} may be created by passing
|
||||
* the value returned by {@link javax.imageio.ImageReader#getImageMetadata
|
||||
* ImageReader.getImageMetadata()} to {@link #createFromMetadata
|
||||
* createFromMetadata()}. The {@link TIFFField}s in the directory may then
|
||||
* be obtained using the accessor methods provided in this class.</p>
|
||||
*
|
||||
* <p>When writing, an {@link IIOMetadata} object for use by one of the
|
||||
* <code>write()</code> methods of {@link javax.imageio.ImageWriter} may be
|
||||
* created from a <code>TIFFDirectory</code> by {@link #getAsMetadata()}.
|
||||
* The <code>TIFFDirectory</code> itself may be created by construction or
|
||||
* from the <code>IIOMetadata</code> object returned by
|
||||
* {@code write()} methods of {@link javax.imageio.ImageWriter} may be
|
||||
* created from a {@code TIFFDirectory} by {@link #getAsMetadata()}.
|
||||
* The {@code TIFFDirectory} itself may be created by construction or
|
||||
* from the {@code IIOMetadata} object returned by
|
||||
* {@link javax.imageio.ImageWriter#getDefaultImageMetadata
|
||||
* ImageWriter.getDefaultImageMetadata()}. The <code>TIFFField</code>s in the
|
||||
* ImageWriter.getDefaultImageMetadata()}. The {@code TIFFField}s in the
|
||||
* directory may be set using the mutator methods provided in this class.</p>
|
||||
*
|
||||
* <p>A <code>TIFFDirectory</code> is aware of the tag numbers in the
|
||||
* <p>A {@code TIFFDirectory} is aware of the tag numbers in the
|
||||
* group of {@link TIFFTagSet}s associated with it. When
|
||||
* a <code>TIFFDirectory</code> is created from a native image metadata
|
||||
* a {@code TIFFDirectory} is created from a native image metadata
|
||||
* object, these tag sets are derived from the <tt>tagSets</tt> attribute
|
||||
* of the <tt>TIFFIFD</tt> node.</p>
|
||||
*
|
||||
* <p>A <code>TIFFDirectory</code> might also have a parent {@link TIFFTag}.
|
||||
* <p>A {@code TIFFDirectory} might also have a parent {@link TIFFTag}.
|
||||
* This will occur if the directory represents an IFD other than the root
|
||||
* IFD of the image. The parent tag is the tag of the IFD Entry which is a
|
||||
* pointer to the IFD represented by this <code>TIFFDirectory</code>. The
|
||||
* {@link TIFFTag#isIFDPointer} method of this parent <code>TIFFTag</code>
|
||||
* must return <code>true</code>. When a <code>TIFFDirectory</code> is
|
||||
* pointer to the IFD represented by this {@code TIFFDirectory}. The
|
||||
* {@link TIFFTag#isIFDPointer} method of this parent {@code TIFFTag}
|
||||
* must return {@code true}. When a {@code TIFFDirectory} is
|
||||
* created from a native image metadata object, the parent tag set is set
|
||||
* from the <tt>parentTagName</tt> attribute of the corresponding
|
||||
* <tt>TIFFIFD</tt> node. Note that a <code>TIFFDirectory</code> instance
|
||||
* which has a non-<code>null</code> parent tag will be contained in the
|
||||
* data field of a <code>TIFFField</code> instance which has a tag field
|
||||
* <tt>TIFFIFD</tt> node. Note that a {@code TIFFDirectory} instance
|
||||
* which has a non-{@code null} parent tag will be contained in the
|
||||
* data field of a {@code TIFFField} instance which has a tag field
|
||||
* equal to the contained directory's parent tag.</p>
|
||||
*
|
||||
* <p>As an example consider an Exif image. The <code>TIFFDirectory</code>
|
||||
* <p>As an example consider an Exif image. The {@code TIFFDirectory}
|
||||
* instance corresponding to the Exif IFD in the Exif stream would have parent
|
||||
* tag {@link ExifParentTIFFTagSet#TAG_EXIF_IFD_POINTER TAG_EXIF_IFD_POINTER}
|
||||
* and would include {@link ExifTIFFTagSet} in its group of known tag sets.
|
||||
* The <code>TIFFDirectory</code> corresponding to this Exif IFD will be
|
||||
* contained in the data field of a <code>TIFFField</code> which will in turn
|
||||
* be contained in the <code>TIFFDirectory</code> corresponding to the primary
|
||||
* IFD of the Exif image which will itself have a <code>null</code>-valued
|
||||
* The {@code TIFFDirectory} corresponding to this Exif IFD will be
|
||||
* contained in the data field of a {@code TIFFField} which will in turn
|
||||
* be contained in the {@code TIFFDirectory} corresponding to the primary
|
||||
* IFD of the Exif image which will itself have a {@code null}-valued
|
||||
* parent tag.</p>
|
||||
*
|
||||
* <p><b>Note that this implementation is not synchronized. </b>If multiple
|
||||
* threads use a <code>TIFFDirectory</code> instance concurrently, and at
|
||||
* threads use a {@code TIFFDirectory} instance concurrently, and at
|
||||
* least one of the threads modifies the directory, for example, by adding
|
||||
* or removing <code>TIFFField</code>s or <code>TIFFTagSet</code>s, it
|
||||
* or removing {@code TIFFField}s or {@code TIFFTagSet}s, it
|
||||
* <i>must</i> be synchronized externally.</p>
|
||||
*
|
||||
* @since 9
|
||||
@ -107,10 +107,10 @@ public class TIFFDirectory implements Cloneable {
|
||||
private static final int MAX_LOW_FIELD_TAG_NUM =
|
||||
BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE;
|
||||
|
||||
/** The <code>TIFFTagSets</code> associated with this directory. */
|
||||
/** The {@code TIFFTagSets} associated with this directory. */
|
||||
private List<TIFFTagSet> tagSets;
|
||||
|
||||
/** The parent <code>TIFFTag</code> of this directory. */
|
||||
/** The parent {@code TIFFTag} of this directory. */
|
||||
private TIFFTag parentTag;
|
||||
|
||||
/**
|
||||
@ -123,13 +123,13 @@ public class TIFFDirectory implements Cloneable {
|
||||
private int numLowFields = 0;
|
||||
|
||||
/**
|
||||
* A mapping of <code>Integer</code> tag numbers to <code>TIFFField</code>s
|
||||
* A mapping of {@code Integer} tag numbers to {@code TIFFField}s
|
||||
* for fields which are not low tag numbered.
|
||||
*/
|
||||
private Map<Integer,TIFFField> highFields = new TreeMap<Integer,TIFFField>();
|
||||
|
||||
/**
|
||||
* Creates a <code>TIFFDirectory</code> instance from the contents of
|
||||
* Creates a {@code TIFFDirectory} instance from the contents of
|
||||
* an image metadata object. The supplied object must support an image
|
||||
* metadata format supported by the TIFF {@link javax.imageio.ImageWriter}
|
||||
* plug-in. This will usually be either the TIFF native image metadata
|
||||
@ -139,12 +139,12 @@ public class TIFFDirectory implements Cloneable {
|
||||
* @param tiffImageMetadata A metadata object which supports a compatible
|
||||
* image metadata format.
|
||||
*
|
||||
* @return A <code>TIFFDirectory</code> populated from the contents of
|
||||
* @return A {@code TIFFDirectory} populated from the contents of
|
||||
* the supplied metadata object.
|
||||
*
|
||||
* @throws NullPointerException if <code>tiffImageMetadata</code>
|
||||
* is <code>null</code>.
|
||||
* @throws IllegalArgumentException if <code>tiffImageMetadata</code>
|
||||
* @throws NullPointerException if {@code tiffImageMetadata}
|
||||
* is {@code null}.
|
||||
* @throws IllegalArgumentException if {@code tiffImageMetadata}
|
||||
* does not support a compatible image metadata format.
|
||||
* @throws IIOInvalidTreeException if the supplied metadata object
|
||||
* cannot be parsed.
|
||||
@ -204,7 +204,7 @@ public class TIFFDirectory implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a <code>TIFFDirectory</code> to a <code>TIFFIFD</code>.
|
||||
* Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
|
||||
*/
|
||||
private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
|
||||
if(dir instanceof TIFFIFD) {
|
||||
@ -219,27 +219,39 @@ public class TIFFDirectory implements Cloneable {
|
||||
TIFFField f = fields[i];
|
||||
TIFFTag tag = f.getTag();
|
||||
if(tag.isIFDPointer()) {
|
||||
TIFFDirectory subIFD =
|
||||
getDirectoryAsIFD((TIFFDirectory)f.getData());
|
||||
f = new TIFFField(tag, f.getType(), (long)f.getCount(), subIFD);
|
||||
TIFFDirectory subDir = null;
|
||||
if (f.hasDirectory()) {
|
||||
subDir = f.getDirectory();
|
||||
} else if (f.getData() instanceof TIFFDirectory) {
|
||||
subDir = (TIFFDirectory)f.getData();
|
||||
}
|
||||
if (subDir != null) {
|
||||
TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
|
||||
f = new TIFFField(tag, f.getType(), (long)f.getCount(),
|
||||
subIFD);
|
||||
} else {
|
||||
f = null;
|
||||
}
|
||||
}
|
||||
if (f != null) {
|
||||
ifd.addTIFFField(f);
|
||||
}
|
||||
ifd.addTIFFField(f);
|
||||
}
|
||||
|
||||
return ifd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFDirectory</code> which is aware of a given
|
||||
* Constructs a {@code TIFFDirectory} which is aware of a given
|
||||
* group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
|
||||
* may also be specified.
|
||||
*
|
||||
* @param tagSets The <code>TIFFTagSets</code> associated with this
|
||||
* @param tagSets The {@code TIFFTagSets} associated with this
|
||||
* directory.
|
||||
* @param parentTag The parent <code>TIFFTag</code> of this directory;
|
||||
* may be <code>null</code>.
|
||||
* @throws NullPointerException if <code>tagSets</code> is
|
||||
* <code>null</code>.
|
||||
* @param parentTag The parent {@code TIFFTag} of this directory;
|
||||
* may be {@code null}.
|
||||
* @throws NullPointerException if {@code tagSets} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public TIFFDirectory(TIFFTagSet[] tagSets, TIFFTag parentTag) {
|
||||
if(tagSets == null) {
|
||||
@ -256,8 +268,8 @@ public class TIFFDirectory implements Cloneable {
|
||||
/**
|
||||
* Returns the {@link TIFFTagSet}s of which this directory is aware.
|
||||
*
|
||||
* @return The <code>TIFFTagSet</code>s associated with this
|
||||
* <code>TIFFDirectory</code>.
|
||||
* @return The {@code TIFFTagSet}s associated with this
|
||||
* {@code TIFFDirectory}.
|
||||
*/
|
||||
public TIFFTagSet[] getTagSets() {
|
||||
return tagSets.toArray(new TIFFTagSet[tagSets.size()]);
|
||||
@ -267,9 +279,9 @@ public class TIFFDirectory implements Cloneable {
|
||||
* Adds an element to the group of {@link TIFFTagSet}s of which this
|
||||
* directory is aware.
|
||||
*
|
||||
* @param tagSet The <code>TIFFTagSet</code> to add.
|
||||
* @throws NullPointerException if <code>tagSet</code> is
|
||||
* <code>null</code>.
|
||||
* @param tagSet The {@code TIFFTagSet} to add.
|
||||
* @throws NullPointerException if {@code tagSet} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public void addTagSet(TIFFTagSet tagSet) {
|
||||
if(tagSet == null) {
|
||||
@ -285,9 +297,9 @@ public class TIFFDirectory implements Cloneable {
|
||||
* Removes an element from the group of {@link TIFFTagSet}s of which this
|
||||
* directory is aware.
|
||||
*
|
||||
* @param tagSet The <code>TIFFTagSet</code> to remove.
|
||||
* @throws NullPointerException if <code>tagSet</code> is
|
||||
* <code>null</code>.
|
||||
* @param tagSet The {@code TIFFTagSet} to remove.
|
||||
* @throws NullPointerException if {@code tagSet} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public void removeTagSet(TIFFTagSet tagSet) {
|
||||
if(tagSet == null) {
|
||||
@ -301,10 +313,10 @@ public class TIFFDirectory implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the parent {@link TIFFTag} of this directory if one
|
||||
* has been defined or <code>null</code> otherwise.
|
||||
* has been defined or {@code null} otherwise.
|
||||
*
|
||||
* @return The parent <code>TIFFTag</code> of this
|
||||
* <code>TIFFDiectory</code> or <code>null</code>.
|
||||
* @return The parent {@code TIFFTag} of this
|
||||
* {@code TIFFDiectory} or {@code null}.
|
||||
*/
|
||||
public TIFFTag getParentTag() {
|
||||
return parentTag;
|
||||
@ -312,12 +324,12 @@ public class TIFFDirectory implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the {@link TIFFTag} which has tag number equal to
|
||||
* <code>tagNumber</code> or <code>null</code> if no such tag
|
||||
* {@code tagNumber} or {@code null} if no such tag
|
||||
* exists in the {@link TIFFTagSet}s associated with this
|
||||
* directory.
|
||||
*
|
||||
* @param tagNumber The tag number of interest.
|
||||
* @return The corresponding <code>TIFFTag</code> or <code>null</code>.
|
||||
* @return The corresponding {@code TIFFTag} or {@code null}.
|
||||
*/
|
||||
public TIFFTag getTag(int tagNumber) {
|
||||
return TIFFIFD.getTag(tagNumber, tagSets);
|
||||
@ -326,8 +338,8 @@ public class TIFFDirectory implements Cloneable {
|
||||
/**
|
||||
* Returns the number of {@link TIFFField}s in this directory.
|
||||
*
|
||||
* @return The number of <code>TIFFField</code>s in this
|
||||
* <code>TIFFDirectory</code>.
|
||||
* @return The number of {@code TIFFField}s in this
|
||||
* {@code TIFFDirectory}.
|
||||
*/
|
||||
public int getNumTIFFFields() {
|
||||
return numLowFields + highFields.size();
|
||||
@ -339,7 +351,7 @@ public class TIFFDirectory implements Cloneable {
|
||||
*
|
||||
* @param tagNumber The tag number.
|
||||
* @return Whether a {@link TIFFTag} with tag number equal to
|
||||
* <code>tagNumber</code> is present in this <code>TIFFDirectory</code>.
|
||||
* {@code tagNumber} is present in this {@code TIFFDirectory}.
|
||||
*/
|
||||
public boolean containsTIFFField(int tagNumber) {
|
||||
return (tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM &&
|
||||
@ -351,7 +363,7 @@ public class TIFFDirectory implements Cloneable {
|
||||
* Adds a TIFF field to the directory.
|
||||
*
|
||||
* @param f The field to add.
|
||||
* @throws NullPointerException if <code>f</code> is <code>null</code>.
|
||||
* @throws NullPointerException if {@code f} is {@code null}.
|
||||
*/
|
||||
public void addTIFFField(TIFFField f) {
|
||||
if(f == null) {
|
||||
@ -372,8 +384,8 @@ public class TIFFDirectory implements Cloneable {
|
||||
* Retrieves a TIFF field from the directory.
|
||||
*
|
||||
* @param tagNumber The tag number of the tag associated with the field.
|
||||
* @return A <code>TIFFField</code> with the requested tag number of
|
||||
* <code>null</code> if no such field is present.
|
||||
* @return A {@code TIFFField} with the requested tag number of
|
||||
* {@code null} if no such field is present.
|
||||
*/
|
||||
public TIFFField getTIFFField(int tagNumber) {
|
||||
TIFFField f;
|
||||
@ -444,7 +456,7 @@ public class TIFFDirectory implements Cloneable {
|
||||
* Converts the directory to a metadata object.
|
||||
*
|
||||
* @return A metadata instance initialized from the contents of this
|
||||
* <code>TIFFDirectory</code>.
|
||||
* {@code TIFFDirectory}.
|
||||
*/
|
||||
public IIOMetadata getAsMetadata() {
|
||||
return new TIFFImageMetadata(getDirectoryAsIFD(this));
|
||||
@ -453,7 +465,7 @@ public class TIFFDirectory implements Cloneable {
|
||||
/**
|
||||
* Clones the directory and all the fields contained therein.
|
||||
*
|
||||
* @return A clone of this <code>TIFFDirectory</code>.
|
||||
* @return A clone of this {@code TIFFDirectory}.
|
||||
* @throws CloneNotSupportedException if the instance cannot be cloned.
|
||||
*/
|
||||
@Override
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -35,7 +35,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
*
|
||||
* <p> A field in a TIFF Image File Directory (IFD) is defined as a
|
||||
* tag number accompanied by a sequence of values of identical data type.
|
||||
* TIFF 6.0 defines 12 data types; a 13th type <code>IFD</code> is
|
||||
* TIFF 6.0 defines 12 data types; a 13th type {@code IFD} is
|
||||
* defined in TIFF Tech Note 1 of TIFF Specification Supplement 1. These
|
||||
* TIFF data types are referred to by Java constants and mapped internally
|
||||
* onto Java language data types and type names as follows:
|
||||
@ -68,10 +68,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_BYTE}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>byte</code>
|
||||
* {@code byte}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Byte"</code>
|
||||
* {@code "Byte"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -83,10 +83,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_ASCII}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>String</code>
|
||||
* {@code String}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Ascii"</code>
|
||||
* {@code "Ascii"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -98,10 +98,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_SHORT}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>char</code>
|
||||
* {@code char}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Short"</code>
|
||||
* {@code "Short"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -113,10 +113,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_LONG}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>long</code>
|
||||
* {@code long}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Long"</code>
|
||||
* {@code "Long"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -128,10 +128,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_RATIONAL}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>long[2]</code> {numerator, denominator}
|
||||
* {@code long[2]} {numerator, denominator}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Rational"</code>
|
||||
* {@code "Rational"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -143,10 +143,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_SBYTE}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>byte</code>
|
||||
* {@code byte}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"SByte"</code>
|
||||
* {@code "SByte"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -158,10 +158,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_UNDEFINED}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>byte</code>
|
||||
* {@code byte}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Undefined"</code>
|
||||
* {@code "Undefined"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -173,10 +173,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_SSHORT}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>short</code>
|
||||
* {@code short}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"SShort"</code>
|
||||
* {@code "SShort"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -188,10 +188,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_SLONG}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>int</code>
|
||||
* {@code int}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"SLong"</code>
|
||||
* {@code "SLong"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -203,10 +203,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_SRATIONAL}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>int[2]</code> {numerator, denominator}
|
||||
* {@code int[2]} {numerator, denominator}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"SRational"</code>
|
||||
* {@code "SRational"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -218,10 +218,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_FLOAT}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>float</code>
|
||||
* {@code float}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Float"</code>
|
||||
* {@code "Float"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -233,10 +233,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_DOUBLE}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>double</code>
|
||||
* {@code double}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"Double"</code>
|
||||
* {@code "Double"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -248,10 +248,10 @@ import com.sun.imageio.plugins.tiff.TIFFIFD;
|
||||
* {@link TIFFTag#TIFF_IFD_POINTER}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>long</code>
|
||||
* {@code long}
|
||||
* </td>
|
||||
* <td>
|
||||
* <code>"IFDPointer"</code>
|
||||
* {@code "IFDPointer"}
|
||||
* </td>
|
||||
* </tr>
|
||||
*
|
||||
@ -411,19 +411,19 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a <code>TIFFField</code> from a TIFF native image
|
||||
* Creates a {@code TIFFField} from a TIFF native image
|
||||
* metadata node. If the value of the <tt>"tagNumber"</tt> attribute
|
||||
* of the node is not found in <code>tagSet</code> then a new
|
||||
* <code>TIFFTag</code> with name <code>TIFFTag.UNKNOWN_TAG_NAME</code>
|
||||
* of the node is not found in {@code tagSet} then a new
|
||||
* {@code TIFFTag} with name {@code TIFFTag.UNKNOWN_TAG_NAME}
|
||||
* will be created and assigned to the field.
|
||||
*
|
||||
* @param tagSet The <code>TIFFTagSet</code> to which the
|
||||
* <code>TIFFTag</code> of the field belongs.
|
||||
* @param node A native TIFF image metadata <code>TIFFField</code> node.
|
||||
* @throws NullPointerException if <code>node</code> is
|
||||
* <code>null</code>.
|
||||
* @param tagSet The {@code TIFFTagSet} to which the
|
||||
* {@code TIFFTag} of the field belongs.
|
||||
* @param node A native TIFF image metadata {@code TIFFField} node.
|
||||
* @throws NullPointerException if {@code node} is
|
||||
* {@code null}.
|
||||
* @throws IllegalArgumentException if the name of the node is not
|
||||
* <code>"TIFFField"</code>.
|
||||
* {@code "TIFFField"}.
|
||||
* @return A new {@code TIFFField}.
|
||||
*/
|
||||
public static TIFFField createFromMetadataNode(TIFFTagSet tagSet,
|
||||
@ -487,14 +487,14 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFField</code> with arbitrary data. The
|
||||
* <code>type</code> parameter must be a value for which
|
||||
* Constructs a {@code TIFFField} with arbitrary data. The
|
||||
* {@code type} parameter must be a value for which
|
||||
* {@link TIFFTag#isDataTypeOK tag.isDataTypeOK()}
|
||||
* returns <code>true</code>. The <code>data</code> parameter must
|
||||
* returns {@code true}. The {@code data} parameter must
|
||||
* be an array of a Java type appropriate for the type of the TIFF
|
||||
* field.
|
||||
*
|
||||
* <p>Note that the value (data) of the <code>TIFFField</code>
|
||||
* <p>Note that the value (data) of the {@code TIFFField}
|
||||
* will always be the actual field value regardless of the number of
|
||||
* bytes required for that value. This is the case despite the fact
|
||||
* that the TIFF <i>IFD Entry</i> corresponding to the field may
|
||||
@ -503,24 +503,29 @@ public class TIFFField implements Cloneable {
|
||||
* value fits into 4 bytes). In other words, the value of the
|
||||
* field will already have been read from the TIFF stream. (An exception
|
||||
* to this case may occur when the field represents the contents of a
|
||||
* non-baseline IFD. In that case the data will be a <code>long[]</code>
|
||||
* containing the offset to the IFD and the <code>TIFFDirectory</code>
|
||||
* non-baseline IFD. In that case the data will be a {@code long[]}
|
||||
* containing the offset to the IFD and the {@code TIFFDirectory}
|
||||
* returned by {@link #getDirectory()} will be its contents.)
|
||||
*
|
||||
* @param tag The tag to associated with this field.
|
||||
* @param type One of the <code>TIFFTag.TIFF_*</code> constants
|
||||
* @param type One of the {@code TIFFTag.TIFF_*} constants
|
||||
* indicating the data type of the field as written to the TIFF stream.
|
||||
* @param count The number of data values.
|
||||
* @param data The actual data content of the field.
|
||||
*
|
||||
* @throws NullPointerException if <code>tag == null</code>.
|
||||
* @throws IllegalArgumentException if <code>type</code> is not
|
||||
* one of the <code>TIFFTag.TIFF_*</code> data type constants.
|
||||
* @throws IllegalArgumentException if <code>type</code> is an unacceptable
|
||||
* data type for the supplied <code>TIFFTag</code>.
|
||||
* @throws IllegalArgumentException if <code>count < 0</code>.
|
||||
* @throws NullPointerException if <code>data == null</code>.
|
||||
* @throws IllegalArgumentException if <code>data</code> is an instance of
|
||||
* @throws NullPointerException if {@code tag == null}.
|
||||
* @throws IllegalArgumentException if {@code type} is not
|
||||
* one of the {@code TIFFTag.TIFF_*} data type constants.
|
||||
* @throws IllegalArgumentException if {@code type} is an unacceptable
|
||||
* data type for the supplied {@code TIFFTag}.
|
||||
* @throws IllegalArgumentException if {@code count < 0}.
|
||||
* @throws IllegalArgumentException if {@code count < 1}
|
||||
* and {@code type} is {@code TIFF_RATIONAL} or
|
||||
* {@code TIFF_SRATIONAL}.
|
||||
* @throws IllegalArgumentException if {@code count ≠ 1}
|
||||
* and {@code type} is {@code TIFF_IFD_POINTER}.
|
||||
* @throws NullPointerException if {@code data == null}.
|
||||
* @throws IllegalArgumentException if {@code data} is an instance of
|
||||
* a class incompatible with the specified type.
|
||||
* @throws IllegalArgumentException if the size of the data array is wrong.
|
||||
*/
|
||||
@ -534,6 +539,14 @@ public class TIFFField implements Cloneable {
|
||||
+ " for " + tag.getName() + " tag");
|
||||
} else if(count < 0) {
|
||||
throw new IllegalArgumentException("count < 0!");
|
||||
} else if((type == TIFFTag.TIFF_RATIONAL
|
||||
|| type == TIFFTag.TIFF_SRATIONAL)
|
||||
&& count < 1) {
|
||||
throw new IllegalArgumentException
|
||||
("Type is TIFF_RATIONAL or TIFF_SRATIONAL and count < 1");
|
||||
} else if (type == TIFFTag.TIFF_IFD_POINTER && count != 1) {
|
||||
throw new IllegalArgumentException
|
||||
("Type is TIFF_IFD_POINTER count != 1");
|
||||
} else if(data == null) {
|
||||
throw new NullPointerException("data == null!");
|
||||
}
|
||||
@ -612,15 +625,15 @@ public class TIFFField implements Cloneable {
|
||||
* parameters and the created array.
|
||||
*
|
||||
* @param tag The tag to associated with this field.
|
||||
* @param type One of the <code>TIFFTag.TIFF_*</code> constants
|
||||
* @param type One of the {@code TIFFTag.TIFF_*} constants
|
||||
* indicating the data type of the field as written to the TIFF stream.
|
||||
* @param count The number of data values.
|
||||
* @throws NullPointerException if <code>tag == null</code>.
|
||||
* @throws IllegalArgumentException if <code>type</code> is not
|
||||
* one of the <code>TIFFTag.TIFF_*</code> data type constants.
|
||||
* @throws IllegalArgumentException if <code>type</code> is an unacceptable
|
||||
* data type for the supplied <code>TIFFTag</code>.
|
||||
* @throws IllegalArgumentException if <code>count < 0</code>.
|
||||
* @throws NullPointerException if {@code tag == null}.
|
||||
* @throws IllegalArgumentException if {@code type} is not
|
||||
* one of the {@code TIFFTag.TIFF_*} data type constants.
|
||||
* @throws IllegalArgumentException if {@code type} is an unacceptable
|
||||
* data type for the supplied {@code TIFFTag}.
|
||||
* @throws IllegalArgumentException if {@code count < 0}.
|
||||
* @see #TIFFField(TIFFTag,int,int,Object)
|
||||
*/
|
||||
public TIFFField(TIFFTag tag, int type, int count) {
|
||||
@ -628,20 +641,20 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFField</code> with a single non-negative integral
|
||||
* Constructs a {@code TIFFField} with a single non-negative integral
|
||||
* value.
|
||||
* The field will have type
|
||||
* {@link TIFFTag#TIFF_SHORT TIFF_SHORT} if
|
||||
* <code>val < 65536</code> and type
|
||||
* {@code val < 65536} and type
|
||||
* {@link TIFFTag#TIFF_LONG TIFF_LONG} otherwise. The count
|
||||
* of the field will be unity.
|
||||
*
|
||||
* @param tag The tag to associate with this field.
|
||||
* @param value The value to associate with this field.
|
||||
* @throws NullPointerException if <code>tag == null</code>.
|
||||
* @throws NullPointerException if {@code tag == null}.
|
||||
* @throws IllegalArgumentException if the derived type is unacceptable
|
||||
* for the supplied <code>TIFFTag</code>.
|
||||
* @throws IllegalArgumentException if <code>value < 0</code>.
|
||||
* for the supplied {@code TIFFTag}.
|
||||
* @throws IllegalArgumentException if {@code value < 0}.
|
||||
*/
|
||||
public TIFFField(TIFFTag tag, int value) {
|
||||
if(tag == null) {
|
||||
@ -677,24 +690,24 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFField</code> with an IFD offset and contents.
|
||||
* Constructs a {@code TIFFField} with an IFD offset and contents.
|
||||
* The offset will be stored as the data of this field as
|
||||
* <code>long[] {offset}</code>. The directory will not be cloned. The count
|
||||
* {@code long[] {offset}}. The directory will not be cloned. The count
|
||||
* of the field will be unity.
|
||||
*
|
||||
* @param tag The tag to associated with this field.
|
||||
* @param type One of the constants <code>TIFFTag.TIFF_LONG</code> or
|
||||
* <code>TIFFTag.TIFF_IFD_POINTER</code>.
|
||||
* @param type One of the constants {@code TIFFTag.TIFF_LONG} or
|
||||
* {@code TIFFTag.TIFF_IFD_POINTER}.
|
||||
* @param offset The IFD offset.
|
||||
* @param dir The directory.
|
||||
*
|
||||
* @throws NullPointerException if <code>tag == null</code>.
|
||||
* @throws IllegalArgumentException if <code>type</code> is neither
|
||||
* <code>TIFFTag.TIFF_LONG</code> nor <code>TIFFTag.TIFF_IFD_POINTER</code>.
|
||||
* @throws IllegalArgumentException if <code>type</code> is an unacceptable
|
||||
* data type for the supplied <code>TIFFTag</code>.
|
||||
* @throws IllegalArgumentException if <code>offset</code> is non-positive.
|
||||
* @throws NullPointerException if <code>dir == null</code>.
|
||||
* @throws NullPointerException if {@code tag == null}.
|
||||
* @throws IllegalArgumentException if {@code type} is neither
|
||||
* {@code TIFFTag.TIFF_LONG} nor {@code TIFFTag.TIFF_IFD_POINTER}.
|
||||
* @throws IllegalArgumentException if {@code type} is an unacceptable
|
||||
* data type for the supplied {@code TIFFTag}.
|
||||
* @throws IllegalArgumentException if {@code offset} is non-positive.
|
||||
* @throws NullPointerException if {@code dir == null}.
|
||||
*
|
||||
* @see #TIFFField(TIFFTag,int,int,Object)
|
||||
*/
|
||||
@ -715,14 +728,14 @@ public class TIFFField implements Cloneable {
|
||||
/**
|
||||
* Retrieves the tag associated with this field.
|
||||
*
|
||||
* @return The associated <code>TIFFTag</code>.
|
||||
* @return The associated {@code TIFFTag}.
|
||||
*/
|
||||
public TIFFTag getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the tag number in the range <code>[0, 65535]</code>.
|
||||
* Retrieves the tag number in the range {@code [0, 65535]}.
|
||||
*
|
||||
* @return The tag number.
|
||||
*/
|
||||
@ -732,7 +745,7 @@ public class TIFFField implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the type of the data stored in the field. For a TIFF 6.0
|
||||
* stream, the value will equal one of the <code>TIFFTag.TIFF_*</code>
|
||||
* stream, the value will equal one of the {@code TIFFTag.TIFF_*}
|
||||
* constants. For future revisions of TIFF, higher values are possible.
|
||||
*
|
||||
* @return The data type of the field value.
|
||||
@ -744,11 +757,11 @@ public class TIFFField implements Cloneable {
|
||||
/**
|
||||
* Returns the name of the supplied data type constant.
|
||||
*
|
||||
* @param dataType One of the <code>TIFFTag.TIFF_*</code> constants
|
||||
* @param dataType One of the {@code TIFFTag.TIFF_*} constants
|
||||
* indicating the data type of the field as written to the TIFF stream.
|
||||
* @return The type name corresponding to the supplied type constant.
|
||||
* @throws IllegalArgumentException if <code>dataType</code> is not
|
||||
* one of the <code>TIFFTag.TIFF_*</code> data type constants.
|
||||
* @throws IllegalArgumentException if {@code dataType} is not
|
||||
* one of the {@code TIFFTag.TIFF_*} data type constants.
|
||||
*/
|
||||
public static String getTypeName(int dataType) {
|
||||
if (dataType < TIFFTag.MIN_DATATYPE ||
|
||||
@ -761,11 +774,11 @@ public class TIFFField implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the data type constant corresponding to the supplied data
|
||||
* type name. If the name is unknown <code>-1</code> will be returned.
|
||||
* type name. If the name is unknown {@code -1} will be returned.
|
||||
*
|
||||
* @param typeName The type name.
|
||||
* @return One of the <code>TIFFTag.TIFF_*</code> constants or
|
||||
* <code>-1</code> if the name is not recognized.
|
||||
* @return One of the {@code TIFFTag.TIFF_*} constants or
|
||||
* {@code -1} if the name is not recognized.
|
||||
*/
|
||||
public static int getTypeByName(String typeName) {
|
||||
for (int i = TIFFTag.MIN_DATATYPE; i <= TIFFTag.MAX_DATATYPE; i++) {
|
||||
@ -780,14 +793,14 @@ public class TIFFField implements Cloneable {
|
||||
/**
|
||||
* Creates an array appropriate for the indicated data type.
|
||||
*
|
||||
* @param dataType One of the <code>TIFFTag.TIFF_*</code> data type
|
||||
* @param dataType One of the {@code TIFFTag.TIFF_*} data type
|
||||
* constants.
|
||||
* @param count The number of values in the array.
|
||||
* @return An array appropriate for the specified data type.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>dataType</code> is not
|
||||
* one of the <code>TIFFTag.TIFF_*</code> data type constants.
|
||||
* @throws IllegalArgumentException if <code>count < 0</code>.
|
||||
* @throws IllegalArgumentException if {@code dataType} is not
|
||||
* one of the {@code TIFFTag.TIFF_*} data type constants.
|
||||
* @throws IllegalArgumentException if {@code count < 0}.
|
||||
*/
|
||||
public static Object createArrayForType(int dataType, int count) {
|
||||
if(count < 0) {
|
||||
@ -823,15 +836,15 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <code>TIFFField</code> as a node named either
|
||||
* Returns the {@code TIFFField} as a node named either
|
||||
* <tt>"TIFFField"</tt> or <tt>"TIFFIFD"</tt> as described in the
|
||||
* TIFF native image metadata specification. The node will be named
|
||||
* <tt>"TIFFIFD"</tt> if and only if the field's data object is an
|
||||
* instance of {@link TIFFDirectory} or equivalently
|
||||
* {@link TIFFTag#isIFDPointer getTag.isIFDPointer()} returns
|
||||
* <code>true</code>.
|
||||
* {@code true}.
|
||||
*
|
||||
* @return a <code>Node</code> named <tt>"TIFFField"</tt> or
|
||||
* @return a {@code Node} named <tt>"TIFFField"</tt> or
|
||||
* <tt>"TIFFIFD"</tt>.
|
||||
*/
|
||||
public Node getAsNativeNode() {
|
||||
@ -850,8 +863,8 @@ public class TIFFField implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the number of data items present in the field. For
|
||||
* <code>TIFFTag.TIFF_ASCII</code> fields, the value returned is the
|
||||
* number of <code>String</code>s, not the total length of the
|
||||
* {@code TIFFTag.TIFF_ASCII} fields, the value returned is the
|
||||
* number of {@code String}s, not the total length of the
|
||||
* data as in the file representation.
|
||||
*
|
||||
* @return The number of data items present in the field.
|
||||
@ -871,17 +884,17 @@ public class TIFFField implements Cloneable {
|
||||
|
||||
/**
|
||||
* Returns the data as an uninterpreted array of
|
||||
* <code>byte</code>s. The type of the field must be one of
|
||||
* <code>TIFFTag.TIFF_BYTE</code>, <code>TIFF_SBYTE</code>, or
|
||||
* <code>TIFF_UNDEFINED</code>.
|
||||
* {@code byte}s. The type of the field must be one of
|
||||
* {@code TIFFTag.TIFF_BYTE}, {@code TIFF_SBYTE}, or
|
||||
* {@code TIFF_UNDEFINED}.
|
||||
*
|
||||
* <p> For data in <code>TIFFTag.TIFF_BYTE</code> format, the application
|
||||
* <p> For data in {@code TIFFTag.TIFF_BYTE} format, the application
|
||||
* must take care when promoting the data to longer integral types
|
||||
* to avoid sign extension.
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_BYTE</code>, <code>TIFF_SBYTE</code>, or
|
||||
* <code>TIFF_UNDEFINED</code>.
|
||||
* {@code TIFF_BYTE}, {@code TIFF_SBYTE}, or
|
||||
* {@code TIFF_UNDEFINED}.
|
||||
* @return The data as an uninterpreted array of bytes.
|
||||
*/
|
||||
public byte[] getAsBytes() {
|
||||
@ -889,11 +902,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_SHORT</code> data as an array of
|
||||
* <code>char</code>s (unsigned 16-bit integers).
|
||||
* Returns {@code TIFFTag.TIFF_SHORT} data as an array of
|
||||
* {@code char}s (unsigned 16-bit integers).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_SHORT</code>.
|
||||
* {@code TIFF_SHORT}.
|
||||
* @return The data as an array of {@code char}s.
|
||||
*/
|
||||
public char[] getAsChars() {
|
||||
@ -901,11 +914,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_SSHORT</code> data as an array of
|
||||
* <code>short</code>s (signed 16-bit integers).
|
||||
* Returns {@code TIFFTag.TIFF_SSHORT} data as an array of
|
||||
* {@code short}s (signed 16-bit integers).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_SSHORT</code>.
|
||||
* {@code TIFF_SSHORT}.
|
||||
* @return The data as an array of {@code short}s.
|
||||
*/
|
||||
public short[] getAsShorts() {
|
||||
@ -913,12 +926,12 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_SLONG</code> data as an array of
|
||||
* <code>int</code>s (signed 32-bit integers).
|
||||
* Returns {@code TIFFTag.TIFF_SLONG} data as an array of
|
||||
* {@code int}s (signed 32-bit integers).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_SHORT</code>, <code>TIFF_SSHORT</code>, or
|
||||
* <code>TIFF_SLONG</code>.
|
||||
* {@code TIFF_SHORT}, {@code TIFF_SSHORT}, or
|
||||
* {@code TIFF_SLONG}.
|
||||
* @return The data as an array of {@code int}s.
|
||||
*/
|
||||
public int[] getAsInts() {
|
||||
@ -944,12 +957,12 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_LONG</code> or
|
||||
* <code>TIFF_IFD_POINTER</code> data as an array of
|
||||
* <code>long</code>s (signed 64-bit integers).
|
||||
* Returns {@code TIFFTag.TIFF_LONG} or
|
||||
* {@code TIFF_IFD_POINTER} data as an array of
|
||||
* {@code long}s (signed 64-bit integers).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_LONG</code> or <code>TIFF_IFD_POINTER</code>.
|
||||
* {@code TIFF_LONG} or {@code TIFF_IFD_POINTER}.
|
||||
* @return The data as an array of {@code long}s.
|
||||
*/
|
||||
public long[] getAsLongs() {
|
||||
@ -957,11 +970,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_FLOAT</code> data as an array of
|
||||
* <code>float</code>s (32-bit floating-point values).
|
||||
* Returns {@code TIFFTag.TIFF_FLOAT} data as an array of
|
||||
* {@code float}s (32-bit floating-point values).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_FLOAT</code>.
|
||||
* {@code TIFF_FLOAT}.
|
||||
* @return The data as an array of {@code float}s.
|
||||
*/
|
||||
public float[] getAsFloats() {
|
||||
@ -969,11 +982,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_DOUBLE</code> data as an array of
|
||||
* <code>double</code>s (64-bit floating-point values).
|
||||
* Returns {@code TIFFTag.TIFF_DOUBLE} data as an array of
|
||||
* {@code double}s (64-bit floating-point values).
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_DOUBLE</code>.
|
||||
* {@code TIFF_DOUBLE}.
|
||||
* @return The data as an array of {@code double}s.
|
||||
*/
|
||||
public double[] getAsDoubles() {
|
||||
@ -981,11 +994,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_SRATIONAL</code> data as an array of
|
||||
* 2-element arrays of <code>int</code>s.
|
||||
* Returns {@code TIFFTag.TIFF_SRATIONAL} data as an array of
|
||||
* 2-element arrays of {@code int}s.
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_SRATIONAL</code>.
|
||||
* {@code TIFF_SRATIONAL}.
|
||||
* @return The data as an array of signed rationals.
|
||||
*/
|
||||
public int[][] getAsSRationals() {
|
||||
@ -993,11 +1006,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>TIFFTag.TIFF_RATIONAL</code> data as an array of
|
||||
* 2-element arrays of <code>long</code>s.
|
||||
* Returns {@code TIFFTag.TIFF_RATIONAL} data as an array of
|
||||
* 2-element arrays of {@code long}s.
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_RATIONAL</code>.
|
||||
* {@code TIFF_RATIONAL}.
|
||||
* @return The data as an array of unsigned rationals.
|
||||
*/
|
||||
public long[][] getAsRationals() {
|
||||
@ -1005,30 +1018,30 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data in any format as an <code>int</code>.
|
||||
* Returns data in any format as an {@code int}.
|
||||
*
|
||||
* <p> <code>TIFFTag.TIFF_BYTE</code> values are treated as unsigned; that
|
||||
* <p> {@code TIFFTag.TIFF_BYTE} values are treated as unsigned; that
|
||||
* is, no sign extension will take place and the returned value
|
||||
* will be in the range [0, 255]. <code>TIFF_SBYTE</code> data
|
||||
* will be in the range [0, 255]. {@code TIFF_SBYTE} data
|
||||
* will be returned in the range [-128, 127].
|
||||
*
|
||||
* <p> A <code>TIFF_UNDEFINED</code> value is treated as though
|
||||
* it were a <code>TIFF_BYTE</code>.
|
||||
* <p> A {@code TIFF_UNDEFINED} value is treated as though
|
||||
* it were a {@code TIFF_BYTE}.
|
||||
*
|
||||
* <p> Data in <code>TIFF_SLONG</code>, <code>TIFF_LONG</code>,
|
||||
* <code>TIFF_FLOAT</code>, <code>TIFF_DOUBLE</code> or
|
||||
* <code>TIFF_IFD_POINTER</code> format are simply cast to
|
||||
* <code>int</code> and may suffer from truncation.
|
||||
* <p> Data in {@code TIFF_SLONG}, {@code TIFF_LONG},
|
||||
* {@code TIFF_FLOAT}, {@code TIFF_DOUBLE} or
|
||||
* {@code TIFF_IFD_POINTER} format are simply cast to
|
||||
* {@code int} and may suffer from truncation.
|
||||
*
|
||||
* <p> Data in <code>TIFF_SRATIONAL</code> or
|
||||
* <code>TIFF_RATIONAL</code> format are evaluated by dividing the
|
||||
* <p> Data in {@code TIFF_SRATIONAL} or
|
||||
* {@code TIFF_RATIONAL} format are evaluated by dividing the
|
||||
* numerator into the denominator using double-precision
|
||||
* arithmetic and then casting to <code>int</code>. Loss of
|
||||
* arithmetic and then casting to {@code int}. Loss of
|
||||
* precision and truncation may occur.
|
||||
*
|
||||
* <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
|
||||
* the <code>Double.parseDouble</code> method, with the result
|
||||
* case to <code>int</code>.
|
||||
* <p> Data in {@code TIFF_ASCII} format will be parsed as by
|
||||
* the {@code Double.parseDouble} method, with the result
|
||||
* case to {@code int}.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as an {@code int}.
|
||||
@ -1068,17 +1081,17 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data in any format as a <code>long</code>.
|
||||
* Returns data in any format as a {@code long}.
|
||||
*
|
||||
* <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
|
||||
* <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
|
||||
* are treated as unsigned; that is, no sign extension will take
|
||||
* place and the returned value will be in the range [0, 255].
|
||||
* <code>TIFF_SBYTE</code> data will be returned in the range
|
||||
* {@code TIFF_SBYTE} data will be returned in the range
|
||||
* [-128, 127].
|
||||
*
|
||||
* <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
|
||||
* the <code>Double.parseDouble</code> method, with the result
|
||||
* cast to <code>long</code>.
|
||||
* <p> Data in {@code TIFF_ASCII} format will be parsed as by
|
||||
* the {@code Double.parseDouble} method, with the result
|
||||
* cast to {@code long}.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a {@code long}.
|
||||
@ -1114,27 +1127,27 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data in any format as a <code>float</code>.
|
||||
* Returns data in any format as a {@code float}.
|
||||
*
|
||||
* <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
|
||||
* <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
|
||||
* are treated as unsigned; that is, no sign extension will take
|
||||
* place and the returned value will be in the range [0, 255].
|
||||
* <code>TIFF_SBYTE</code> data will be returned in the range
|
||||
* {@code TIFF_SBYTE} data will be returned in the range
|
||||
* [-128, 127].
|
||||
*
|
||||
* <p> Data in <code>TIFF_SLONG</code>, <code>TIFF_LONG</code>,
|
||||
* <code>TIFF_DOUBLE</code>, or <code>TIFF_IFD_POINTER</code> format are
|
||||
* simply cast to <code>float</code> and may suffer from
|
||||
* <p> Data in {@code TIFF_SLONG}, {@code TIFF_LONG},
|
||||
* {@code TIFF_DOUBLE}, or {@code TIFF_IFD_POINTER} format are
|
||||
* simply cast to {@code float} and may suffer from
|
||||
* truncation.
|
||||
*
|
||||
* <p> Data in <code>TIFF_SRATIONAL</code> or
|
||||
* <code>TIFF_RATIONAL</code> format are evaluated by dividing the
|
||||
* <p> Data in {@code TIFF_SRATIONAL} or
|
||||
* {@code TIFF_RATIONAL} format are evaluated by dividing the
|
||||
* numerator into the denominator using double-precision
|
||||
* arithmetic and then casting to <code>float</code>.
|
||||
* arithmetic and then casting to {@code float}.
|
||||
*
|
||||
* <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
|
||||
* the <code>Double.parseDouble</code> method, with the result
|
||||
* cast to <code>float</code>.
|
||||
* <p> Data in {@code TIFF_ASCII} format will be parsed as by
|
||||
* the {@code Double.parseDouble} method, with the result
|
||||
* cast to {@code float}.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a {@code float}.
|
||||
@ -1174,21 +1187,21 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data in any format as a <code>double</code>.
|
||||
* Returns data in any format as a {@code double}.
|
||||
*
|
||||
* <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
|
||||
* <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
|
||||
* are treated as unsigned; that is, no sign extension will take
|
||||
* place and the returned value will be in the range [0, 255].
|
||||
* <code>TIFF_SBYTE</code> data will be returned in the range
|
||||
* {@code TIFF_SBYTE} data will be returned in the range
|
||||
* [-128, 127].
|
||||
*
|
||||
* <p> Data in <code>TIFF_SRATIONAL</code> or
|
||||
* <code>TIFF_RATIONAL</code> format are evaluated by dividing the
|
||||
* <p> Data in {@code TIFF_SRATIONAL} or
|
||||
* {@code TIFF_RATIONAL} format are evaluated by dividing the
|
||||
* numerator into the denominator using double-precision
|
||||
* arithmetic.
|
||||
*
|
||||
* <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
|
||||
* the <code>Double.parseDouble</code> method.
|
||||
* <p> Data in {@code TIFF_ASCII} format will be parsed as by
|
||||
* the {@code Double.parseDouble} method.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a {@code double}.
|
||||
@ -1228,11 +1241,11 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>TIFFTag.TIFF_ASCII</code> value as a
|
||||
* <code>String</code>.
|
||||
* Returns a {@code TIFFTag.TIFF_ASCII} value as a
|
||||
* {@code String}.
|
||||
*
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_ASCII</code>.
|
||||
* {@code TIFF_ASCII}.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a {@code String}.
|
||||
@ -1242,13 +1255,13 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>TIFFTag.TIFF_SRATIONAL</code> data item as a
|
||||
* two-element array of <code>int</code>s.
|
||||
* Returns a {@code TIFFTag.TIFF_SRATIONAL} data item as a
|
||||
* two-element array of {@code int}s.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a signed rational.
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_SRATIONAL</code>.
|
||||
* {@code TIFF_SRATIONAL}.
|
||||
*/
|
||||
public int[] getAsSRational(int index) {
|
||||
return ((int[][])data)[index];
|
||||
@ -1261,7 +1274,7 @@ public class TIFFField implements Cloneable {
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as an unsigned rational.
|
||||
* @throws ClassCastException if the field is not of type
|
||||
* <code>TIFF_RATIONAL</code>.
|
||||
* {@code TIFF_RATIONAL}.
|
||||
*/
|
||||
public long[] getAsRational(int index) {
|
||||
return ((long[][])data)[index];
|
||||
@ -1269,11 +1282,11 @@ public class TIFFField implements Cloneable {
|
||||
|
||||
|
||||
/**
|
||||
* Returns a <code>String</code> containing a human-readable
|
||||
* Returns a {@code String} containing a human-readable
|
||||
* version of the data item. Data of type
|
||||
* <code>TIFFTag.TIFF_RATIONAL</code> or <code>TIFF_SRATIONAL</code> are
|
||||
* {@code TIFFTag.TIFF_RATIONAL} or {@code TIFF_SRATIONAL} are
|
||||
* represented as a pair of integers separated by a
|
||||
* <code>'/'</code> character.
|
||||
* {@code '/'} character.
|
||||
*
|
||||
* @param index The index of the data.
|
||||
* @return The data at the given index as a {@code String}.
|
||||
@ -1342,7 +1355,7 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the field has a <code>TIFFDirectory</code>.
|
||||
* Returns whether the field has a {@code TIFFDirectory}.
|
||||
*
|
||||
* @return true if and only if getDirectory() returns non-null.
|
||||
*/
|
||||
@ -1351,8 +1364,8 @@ public class TIFFField implements Cloneable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the associated <code>TIFFDirectory</code>, if available. If no
|
||||
* directory is set, then <code>null</code> will be returned.
|
||||
* Returns the associated {@code TIFFDirectory}, if available. If no
|
||||
* directory is set, then {@code null} will be returned.
|
||||
*
|
||||
* @return the TIFFDirectory instance or null.
|
||||
*/
|
||||
@ -1363,7 +1376,7 @@ public class TIFFField implements Cloneable {
|
||||
/**
|
||||
* Clones the field and all the information contained therein.
|
||||
*
|
||||
* @return A clone of this <code>TIFFField</code>.
|
||||
* @return A clone of this {@code TIFFField}.
|
||||
* @throws CloneNotSupportedException if the instance cannot be cloned.
|
||||
*/
|
||||
@Override
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -39,11 +39,11 @@ import javax.imageio.ImageReadParam;
|
||||
* be provided by this interface.
|
||||
*
|
||||
* <p> Additional TIFF tags must be organized into
|
||||
* <code>TIFFTagSet</code>s. A <code>TIFFTagSet</code> may be
|
||||
* {@code TIFFTagSet}s. A {@code TIFFTagSet} may be
|
||||
* provided to the reader by means of the
|
||||
* <code>addAllowedTagSet</code> method. By default, the tag sets
|
||||
* <code>BaselineTIFFTagSet</code>, <code>FaxTIFFTagSet</code>,
|
||||
* <code>ExifParentTIFFTagSet</code>, and <code>GeoTIFFTagSet</code>
|
||||
* {@code addAllowedTagSet} method. By default, the tag sets
|
||||
* {@code BaselineTIFFTagSet}, {@code FaxTIFFTagSet},
|
||||
* {@code ExifParentTIFFTagSet}, and {@code GeoTIFFTagSet}
|
||||
* are included.
|
||||
*
|
||||
* @since 9
|
||||
@ -53,10 +53,10 @@ public class TIFFImageReadParam extends ImageReadParam {
|
||||
private List<TIFFTagSet> allowedTagSets = new ArrayList<TIFFTagSet>(4);
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFImageReadParam</code>. Tags defined by
|
||||
* the <code>TIFFTagSet</code>s <code>BaselineTIFFTagSet</code>,
|
||||
* <code>FaxTIFFTagSet</code>, <code>ExifParentTIFFTagSet</code>, and
|
||||
* <code>GeoTIFFTagSet</code> will be supported.
|
||||
* Constructs a {@code TIFFImageReadParam}. Tags defined by
|
||||
* the {@code TIFFTagSet}s {@code BaselineTIFFTagSet},
|
||||
* {@code FaxTIFFTagSet}, {@code ExifParentTIFFTagSet}, and
|
||||
* {@code GeoTIFFTagSet} will be supported.
|
||||
*
|
||||
* @see BaselineTIFFTagSet
|
||||
* @see FaxTIFFTagSet
|
||||
@ -71,13 +71,13 @@ public class TIFFImageReadParam extends ImageReadParam {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a <code>TIFFTagSet</code> object to the list of allowed
|
||||
* Adds a {@code TIFFTagSet} object to the list of allowed
|
||||
* tag sets.
|
||||
*
|
||||
* @param tagSet a <code>TIFFTagSet</code>.
|
||||
* @param tagSet a {@code TIFFTagSet}.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>tagSet</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if {@code tagSet} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public void addAllowedTagSet(TIFFTagSet tagSet) {
|
||||
if (tagSet == null) {
|
||||
@ -87,15 +87,15 @@ public class TIFFImageReadParam extends ImageReadParam {
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a <code>TIFFTagSet</code> object from the list of
|
||||
* allowed tag sets. Removal is based on the <code>equals</code>
|
||||
* method of the <code>TIFFTagSet</code>, which is normally
|
||||
* Removes a {@code TIFFTagSet} object from the list of
|
||||
* allowed tag sets. Removal is based on the {@code equals}
|
||||
* method of the {@code TIFFTagSet}, which is normally
|
||||
* defined as reference equality.
|
||||
*
|
||||
* @param tagSet a <code>TIFFTagSet</code>.
|
||||
* @param tagSet a {@code TIFFTagSet}.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>tagSet</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if {@code tagSet} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public void removeAllowedTagSet(TIFFTagSet tagSet) {
|
||||
if (tagSet == null) {
|
||||
@ -105,10 +105,10 @@ public class TIFFImageReadParam extends ImageReadParam {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>List</code> containing the allowed
|
||||
* <code>TIFFTagSet</code> objects.
|
||||
* Returns a {@code List} containing the allowed
|
||||
* {@code TIFFTagSet} objects.
|
||||
*
|
||||
* @return a <code>List</code> of <code>TIFFTagSet</code>s.
|
||||
* @return a {@code List} of {@code TIFFTagSet}s.
|
||||
*/
|
||||
public List<TIFFTagSet> getAllowedTagSets() {
|
||||
return allowedTagSets;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -105,7 +105,7 @@ public class TIFFTag {
|
||||
* The name assigned to a tag with an unknown tag number. Such
|
||||
* a tag may be created for example when reading an IFD and a
|
||||
* tag number is encountered which is not in any of the
|
||||
* <code>TIFFTagSet</code>s known to the reader.
|
||||
* {@code TIFFTagSet}s known to the reader.
|
||||
*/
|
||||
public static final String UNKNOWN_TAG_NAME = "UnknownTag";
|
||||
|
||||
@ -141,12 +141,12 @@ public class TIFFTag {
|
||||
private SortedMap<Integer,String> valueNames = null;
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFTag</code> with a given name, tag number, set
|
||||
* Constructs a {@code TIFFTag} with a given name, tag number, set
|
||||
* of legal data types, and value count. A negative value count signifies
|
||||
* that either an arbitrary number of values is legal or the required count
|
||||
* is determined by the values of other fields in the IFD. A non-negative
|
||||
* count specifies the number of values which an associated field must
|
||||
* contain. The tag will have no associated <code>TIFFTagSet</code>.
|
||||
* contain. The tag will have no associated {@code TIFFTagSet}.
|
||||
*
|
||||
* <p> If there are mnemonic names to be associated with the legal
|
||||
* data values for the tag, {@link #addValueName(int, String)
|
||||
@ -183,18 +183,18 @@ public class TIFFTag {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFTag</code> with a given name, tag number and
|
||||
* <code>TIFFTagSet</code> to which it refers. The legal data types are
|
||||
* Constructs a {@code TIFFTag} with a given name, tag number and
|
||||
* {@code TIFFTagSet} to which it refers. The legal data types are
|
||||
* set to include {@link #TIFF_LONG} and {@link #TIFF_IFD_POINTER} and the
|
||||
* value count is unity. The <code>TIFFTagSet</code> will
|
||||
* represent the set of <code>TIFFTag</code>s which appear in the IFD
|
||||
* pointed to. A <code>TIFFTag</code> represents an IFD pointer if and
|
||||
* only if <code>tagSet</code> is non-<code>null</code> or the data
|
||||
* type <code>TIFF_IFD_POINTER</code> is legal.
|
||||
* value count is unity. The {@code TIFFTagSet} will
|
||||
* represent the set of {@code TIFFTag}s which appear in the IFD
|
||||
* pointed to. A {@code TIFFTag} represents an IFD pointer if and
|
||||
* only if {@code tagSet} is non-{@code null} or the data
|
||||
* type {@code TIFF_IFD_POINTER} is legal.
|
||||
*
|
||||
* @param name the name of the tag.
|
||||
* @param number the number used to represent the tag.
|
||||
* @param tagSet the <code>TIFFTagSet</code> to which this tag belongs.
|
||||
* @param tagSet the {@code TIFFTagSet} to which this tag belongs.
|
||||
* @throws NullPointerException if name or tagSet is null.
|
||||
* @throws IllegalArgumentException if number is negative.
|
||||
*
|
||||
@ -210,9 +210,9 @@ public class TIFFTag {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFTag</code> with a given name, tag number,
|
||||
* Constructs a {@code TIFFTag} with a given name, tag number,
|
||||
* and set of legal data types. The value count of the tag will be
|
||||
* undefined and it will have no associated <code>TIFFTagSet</code>.
|
||||
* undefined and it will have no associated {@code TIFFTagSet}.
|
||||
*
|
||||
* @param name the name of the tag.
|
||||
* @param number the number used to represent the tag.
|
||||
@ -236,9 +236,9 @@ public class TIFFTag {
|
||||
*
|
||||
* @return the number of bytes used to store the given data type.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>datatype</code> is
|
||||
* less than <code>MIN_DATATYPE</code> or greater than
|
||||
* <code>MAX_DATATYPE</code>.
|
||||
* @throws IllegalArgumentException if {@code datatype} is
|
||||
* less than {@code MIN_DATATYPE} or greater than
|
||||
* {@code MAX_DATATYPE}.
|
||||
*/
|
||||
public static int getSizeOfType(int dataType) {
|
||||
if (dataType < MIN_DATATYPE ||dataType > MAX_DATATYPE) {
|
||||
@ -251,7 +251,7 @@ public class TIFFTag {
|
||||
/**
|
||||
* Returns the name of the tag, as it will appear in image metadata.
|
||||
*
|
||||
* @return the tag name, as a <code>String</code>.
|
||||
* @return the tag name, as a {@code String}.
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
@ -260,7 +260,7 @@ public class TIFFTag {
|
||||
/**
|
||||
* Returns the integer used to represent the tag.
|
||||
*
|
||||
* @return the tag number, as an <code>int</code>.
|
||||
* @return the tag number, as an {@code int}.
|
||||
*/
|
||||
public int getNumber() {
|
||||
return number;
|
||||
@ -276,7 +276,7 @@ public class TIFFTag {
|
||||
* (1 << TIFFTag.TIFF_SHORT) | (1 << TIFFTag.TIFF_LONG)
|
||||
* </pre>
|
||||
*
|
||||
* @return an <code>int</code> containing a bitmask encoding the
|
||||
* @return an {@code int} containing a bitmask encoding the
|
||||
* set of valid data types.
|
||||
*/
|
||||
public int getDataTypes() {
|
||||
@ -285,11 +285,11 @@ public class TIFFTag {
|
||||
|
||||
/**
|
||||
* Returns the value count of this tag. If this value is positive, it
|
||||
* represents the required number of values for a <code>TIFFField</code>
|
||||
* represents the required number of values for a {@code TIFFField}
|
||||
* which has this tag. If the value is negative, the count is undefined.
|
||||
* In the latter case the count may be derived, e.g., the number of values
|
||||
* of the <code>BitsPerSample</code> field is <code>SamplesPerPixel</code>,
|
||||
* or it may be variable as in the case of most <code>US-ASCII</code>
|
||||
* of the {@code BitsPerSample} field is {@code SamplesPerPixel},
|
||||
* or it may be variable as in the case of most {@code US-ASCII}
|
||||
* fields.
|
||||
*
|
||||
* @return the value count of this tag.
|
||||
@ -299,18 +299,18 @@ public class TIFFTag {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if the given data type
|
||||
* Returns {@code true} if the given data type
|
||||
* may be used for the data associated with this tag.
|
||||
*
|
||||
* @param dataType the data type to be queried, one of
|
||||
* <code>TIFF_BYTE</code>, <code>TIFF_SHORT</code>, etc.
|
||||
* {@code TIFF_BYTE}, {@code TIFF_SHORT}, etc.
|
||||
*
|
||||
* @return a <code>boolean</code> indicating whether the given
|
||||
* @return a {@code boolean} indicating whether the given
|
||||
* data type may be used with this tag.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>datatype</code> is
|
||||
* less than <code>MIN_DATATYPE</code> or greater than
|
||||
* <code>MAX_DATATYPE</code>.
|
||||
* @throws IllegalArgumentException if {@code datatype} is
|
||||
* less than {@code MIN_DATATYPE} or greater than
|
||||
* {@code MAX_DATATYPE}.
|
||||
*/
|
||||
public boolean isDataTypeOK(int dataType) {
|
||||
if (dataType < MIN_DATATYPE || dataType > MAX_DATATYPE) {
|
||||
@ -320,38 +320,38 @@ public class TIFFTag {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <code>TIFFTagSet</code> of which this tag is a part.
|
||||
* Returns the {@code TIFFTagSet} of which this tag is a part.
|
||||
*
|
||||
* @return the containing <code>TIFFTagSet</code>.
|
||||
* @return the containing {@code TIFFTagSet}.
|
||||
*/
|
||||
public TIFFTagSet getTagSet() {
|
||||
return tagSet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if this tag is used to point to an IFD
|
||||
* structure containing additional tags. A <code>TIFFTag</code> represents
|
||||
* an IFD pointer if and only if its <code>TIFFTagSet</code> is
|
||||
* non-<code>null</code> or the data type <code>TIFF_IFD_POINTER</code> is
|
||||
* Returns {@code true} if this tag is used to point to an IFD
|
||||
* structure containing additional tags. A {@code TIFFTag} represents
|
||||
* an IFD pointer if and only if its {@code TIFFTagSet} is
|
||||
* non-{@code null} or the data type {@code TIFF_IFD_POINTER} is
|
||||
* legal. This condition will be satisfied if and only if either
|
||||
* <code>getTagSet() != null</code> or
|
||||
* <code>isDataTypeOK(TIFF_IFD_POINTER) == true</code>.
|
||||
* {@code getTagSet() != null} or
|
||||
* {@code isDataTypeOK(TIFF_IFD_POINTER) == true}.
|
||||
*
|
||||
* <p>Many TIFF extensions use the IFD mechanism in order to limit the
|
||||
* number of new tags that may appear in the root IFD.</p>
|
||||
*
|
||||
* @return <code>true</code> if this tag points to an IFD.
|
||||
* @return {@code true} if this tag points to an IFD.
|
||||
*/
|
||||
public boolean isIFDPointer() {
|
||||
return tagSet != null || isDataTypeOK(TIFF_IFD_POINTER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if there are mnemonic names associated with
|
||||
* Returns {@code true} if there are mnemonic names associated with
|
||||
* the set of legal values for the data associated with this tag. Mnemonic
|
||||
* names apply only to tags which have integral data type.
|
||||
*
|
||||
* @return <code>true</code> if mnemonic value names are available.
|
||||
* @return {@code true} if mnemonic value names are available.
|
||||
*/
|
||||
public boolean hasValueNames() {
|
||||
return valueNames != null;
|
||||
@ -373,14 +373,14 @@ public class TIFFTag {
|
||||
|
||||
/**
|
||||
* Returns the mnemonic name associated with a particular value
|
||||
* that this tag's data may take on, or <code>null</code> if
|
||||
* that this tag's data may take on, or {@code null} if
|
||||
* no name is present. Mnemonic names apply only to tags which have
|
||||
* integral data type.
|
||||
*
|
||||
* @param value the data value.
|
||||
*
|
||||
* @return the mnemonic name associated with the value, as a
|
||||
* <code>String</code>.
|
||||
* {@code String}.
|
||||
*/
|
||||
public String getValueName(int value) {
|
||||
if (valueNames == null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -39,7 +39,7 @@ import java.util.TreeSet;
|
||||
* specification itself).
|
||||
*
|
||||
* <p> This class and its subclasses are responsible for mapping
|
||||
* between raw tag numbers and <code>TIFFTag</code> objects, which
|
||||
* between raw tag numbers and {@code TIFFTag} objects, which
|
||||
* contain additional information about each tag, such as the tag's
|
||||
* name, legal data types, and mnemonic names for some or all of ts
|
||||
* data values.
|
||||
@ -59,15 +59,15 @@ public class TIFFTagSet {
|
||||
private TIFFTagSet() {}
|
||||
|
||||
/**
|
||||
* Constructs a <code>TIFFTagSet</code>, given a <code>List</code>
|
||||
* of <code>TIFFTag</code> objects.
|
||||
* Constructs a {@code TIFFTagSet}, given a {@code List}
|
||||
* of {@code TIFFTag} objects.
|
||||
*
|
||||
* @param tags a <code>List</code> object containing
|
||||
* <code>TIFFTag</code> objects to be added to this tag set.
|
||||
* @param tags a {@code List} object containing
|
||||
* {@code TIFFTag} objects to be added to this tag set.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>tags</code> is
|
||||
* <code>null</code>, or contains objects that are not instances
|
||||
* of the <code>TIFFTag</code> class.
|
||||
* @throws IllegalArgumentException if {@code tags} is
|
||||
* {@code null}, or contains objects that are not instances
|
||||
* of the {@code TIFFTag} class.
|
||||
*/
|
||||
public TIFFTagSet(List<TIFFTag> tags) {
|
||||
if (tags == null) {
|
||||
@ -88,29 +88,29 @@ public class TIFFTagSet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <code>TIFFTag</code> from this set that is
|
||||
* associated with the given tag number, or <code>null</code> if
|
||||
* Returns the {@code TIFFTag} from this set that is
|
||||
* associated with the given tag number, or {@code null} if
|
||||
* no tag exists for that number.
|
||||
*
|
||||
* @param tagNumber the number of the tag to be retrieved.
|
||||
*
|
||||
* @return the numbered <code>TIFFTag</code>, or <code>null</code>.
|
||||
* @return the numbered {@code TIFFTag}, or {@code null}.
|
||||
*/
|
||||
public TIFFTag getTag(int tagNumber) {
|
||||
return allowedTagsByNumber.get(Integer.valueOf(tagNumber));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <code>TIFFTag</code> having the given tag name, or
|
||||
* <code>null</code> if the named tag does not belong to this tag set.
|
||||
* Returns the {@code TIFFTag} having the given tag name, or
|
||||
* {@code null} if the named tag does not belong to this tag set.
|
||||
*
|
||||
* @param tagName the name of the tag to be retrieved, as a
|
||||
* <code>String</code>.
|
||||
* {@code String}.
|
||||
*
|
||||
* @return the named <code>TIFFTag</code>, or <code>null</code>.
|
||||
* @return the named {@code TIFFTag}, or {@code null}.
|
||||
*
|
||||
* @throws IllegalArgumentException if <code>tagName</code> is
|
||||
* <code>null</code>.
|
||||
* @throws IllegalArgumentException if {@code tagName} is
|
||||
* {@code null}.
|
||||
*/
|
||||
public TIFFTag getTag(String tagName) {
|
||||
if (tagName == null) {
|
||||
@ -123,7 +123,7 @@ public class TIFFTagSet {
|
||||
* Retrieves an unmodifiable numerically increasing set of tag numbers.
|
||||
*
|
||||
* <p>The returned object is unmodifiable and contains the tag
|
||||
* numbers of all <code>TIFFTag</code>s in this <code>TIFFTagSet</code>
|
||||
* numbers of all {@code TIFFTag}s in this {@code TIFFTagSet}
|
||||
* sorted into ascending order according to
|
||||
* {@link Integer#compareTo(Object)}.</p>
|
||||
*
|
||||
@ -145,7 +145,7 @@ public class TIFFTagSet {
|
||||
* Retrieves an unmodifiable lexicographically increasing set of tag names.
|
||||
*
|
||||
* <p>The returned object is unmodifiable and contains the tag
|
||||
* names of all <code>TIFFTag</code>s in this <code>TIFFTagSet</code>
|
||||
* names of all {@code TIFFTag}s in this {@code TIFFTagSet}
|
||||
* sorted into ascending order according to
|
||||
* {@link String#compareTo(Object)}.</p>
|
||||
*
|
||||
|
@ -193,36 +193,48 @@ public class ServiceUI {
|
||||
getLocalGraphicsEnvironment().getDefaultScreenDevice().
|
||||
getDefaultConfiguration().getBounds() : gc.getBounds();
|
||||
|
||||
x += gcBounds.x;
|
||||
y += gcBounds.y;
|
||||
ServiceDialog dialog;
|
||||
if (owner instanceof Frame) {
|
||||
dialog = new ServiceDialog(gc,
|
||||
x + gcBounds.x,
|
||||
y + gcBounds.y,
|
||||
x,
|
||||
y,
|
||||
services, defaultIndex,
|
||||
flavor, attributes,
|
||||
(Frame)owner);
|
||||
} else {
|
||||
dialog = new ServiceDialog(gc,
|
||||
x + gcBounds.x,
|
||||
y + gcBounds.y,
|
||||
x,
|
||||
y,
|
||||
services, defaultIndex,
|
||||
flavor, attributes,
|
||||
(Dialog)owner);
|
||||
}
|
||||
Rectangle dlgBounds = dialog.getBounds();
|
||||
|
||||
// get union of all GC bounds
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
GraphicsDevice[] gs = ge.getScreenDevices();
|
||||
for (int j=0; j<gs.length; j++) {
|
||||
gcBounds =
|
||||
gcBounds.union(gs[j].getDefaultConfiguration().getBounds());
|
||||
}
|
||||
|
||||
// if portion of dialog is not within the gc boundary
|
||||
if (!gcBounds.contains(dlgBounds)) {
|
||||
// put in the center relative to parent frame/dialog
|
||||
dialog.setLocationRelativeTo(owner);
|
||||
// check if dialog exceed window bounds at left or bottom
|
||||
// Then position the dialog by moving it by the amount it exceeds
|
||||
// the window bounds
|
||||
// If it results in dialog moving beyond the window bounds at top/left
|
||||
// then position it at window top/left
|
||||
if (dlgBounds.x + dlgBounds.width > gcBounds.x + gcBounds.width) {
|
||||
if ((gcBounds.x + gcBounds.width - dlgBounds.width) > gcBounds.x) {
|
||||
x = (gcBounds.x + gcBounds.width) - dlgBounds.width;
|
||||
} else {
|
||||
x = gcBounds.x;
|
||||
}
|
||||
}
|
||||
if (dlgBounds.y + dlgBounds.height > gcBounds.y + gcBounds.height) {
|
||||
if ((gcBounds.y + gcBounds.height - dlgBounds.height) > gcBounds.y) {
|
||||
y = (gcBounds.y + gcBounds.height) - dlgBounds.height;
|
||||
} else {
|
||||
y = gcBounds.y;
|
||||
}
|
||||
}
|
||||
dialog.setBounds(x, y, dlgBounds.width, dlgBounds.height);
|
||||
}
|
||||
dialog.show();
|
||||
|
||||
|
@ -191,12 +191,6 @@ public class DefaultDesktopManager implements DesktopManager, java.io.Serializab
|
||||
JLayeredPane.putLayer(desktopIcon, layer);
|
||||
}
|
||||
|
||||
// If we are maximized we already have the normal bounds recorded
|
||||
// don't try to re-record them, otherwise we incorrectly set the
|
||||
// normal bounds to maximized state.
|
||||
if (!f.isMaximum()) {
|
||||
f.setNormalBounds(f.getBounds());
|
||||
}
|
||||
if (findNext) {
|
||||
if (d.selectFrame(true) == null) {
|
||||
// The icon is the last frame.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -583,6 +583,69 @@ public abstract class FileSystemView {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of files representing the values to show by default in
|
||||
* the file chooser selector.
|
||||
*
|
||||
* @return an array of {@code File} objects.
|
||||
* @throws SecurityException if the caller does not have necessary
|
||||
* permissions
|
||||
* @since 9
|
||||
*/
|
||||
public File[] getChooserComboBoxFiles() {
|
||||
return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the specified file denotes a shell interpreted link which
|
||||
* can be obtained by the {@link #getLinkLocation(File)}.
|
||||
*
|
||||
* @param file a file
|
||||
* @return whether this is a link
|
||||
* @throws NullPointerException if {@code file} equals {@code null}
|
||||
* @throws SecurityException if the caller does not have necessary
|
||||
* permissions
|
||||
* @see #getLinkLocation(File)
|
||||
* @since 9
|
||||
*/
|
||||
public boolean isLink(File file) {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("file is null");
|
||||
}
|
||||
try {
|
||||
return ShellFolder.getShellFolder(file).isLink();
|
||||
} catch (FileNotFoundException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the regular file referenced by the specified link file if
|
||||
* the specified file is a shell interpreted link.
|
||||
* Returns {@code null} if the specified file is not
|
||||
* a shell interpreted link.
|
||||
*
|
||||
* @param file a file
|
||||
* @return the linked file or {@code null}.
|
||||
* @throws FileNotFoundException if the linked file does not exist
|
||||
* @throws NullPointerException if {@code file} equals {@code null}
|
||||
* @throws SecurityException if the caller does not have necessary
|
||||
* permissions
|
||||
* @since 9
|
||||
*/
|
||||
public File getLinkLocation(File file) throws FileNotFoundException {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("file is null");
|
||||
}
|
||||
ShellFolder shellFolder;
|
||||
try {
|
||||
shellFolder = ShellFolder.getShellFolder(file);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
return shellFolder.isLink() ? shellFolder.getLinkLocation() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws {@code FileNotFoundException} if file not found or current thread was interrupted
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -962,18 +962,13 @@ public class BasicScrollPaneUI
|
||||
int orientation = SwingConstants.VERTICAL;
|
||||
|
||||
// find which scrollbar to scroll, or return if none
|
||||
if (toScroll == null || !toScroll.isVisible()) {
|
||||
if (toScroll == null || !toScroll.isVisible()
|
||||
|| e.isShiftDown()) {
|
||||
toScroll = scrollpane.getHorizontalScrollBar();
|
||||
if (toScroll == null || !toScroll.isVisible()) {
|
||||
return;
|
||||
}
|
||||
orientation = SwingConstants.HORIZONTAL;
|
||||
} else if(e.isShiftDown()){
|
||||
JScrollBar hScroll = scrollpane.getHorizontalScrollBar();
|
||||
if (hScroll != null && hScroll.isVisible()) {
|
||||
toScroll = hScroll;
|
||||
orientation = SwingConstants.HORIZONTAL;
|
||||
}
|
||||
}
|
||||
|
||||
e.consume();
|
||||
|
@ -362,9 +362,6 @@ public class SynthDesktopPaneUI extends BasicDesktopPaneUI implements
|
||||
setWasIcon(f, Boolean.TRUE);
|
||||
}
|
||||
|
||||
if (!f.isMaximum()) {
|
||||
f.setNormalBounds(f.getBounds());
|
||||
}
|
||||
c.remove(f);
|
||||
c.repaint(f.getX(), f.getY(), f.getWidth(), f.getHeight());
|
||||
try {
|
||||
|
@ -230,9 +230,10 @@ public class SynthTableHeaderUI extends BasicTableHeaderUI
|
||||
|
||||
boolean hasRollover = (column == getRolloverColumn());
|
||||
if (isSelected || hasRollover || hasFocus) {
|
||||
boolean enabled = (table == null)? true : table.isEnabled();
|
||||
SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.
|
||||
getUIOfType(getUI(), SynthLabelUI.class),
|
||||
isSelected, hasFocus, table.isEnabled(),
|
||||
isSelected, hasFocus, enabled,
|
||||
hasRollover);
|
||||
} else {
|
||||
SynthLookAndFeel.resetSelectedUI();
|
||||
|
@ -30,8 +30,6 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URL;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.Enumeration;
|
||||
@ -75,7 +73,6 @@ public class Main {
|
||||
/**
|
||||
* Member variables set according to options passed in to AppletViewer.
|
||||
*/
|
||||
private boolean debugFlag = false;
|
||||
private boolean helpFlag = false;
|
||||
private String encoding = null;
|
||||
private boolean noSecurityFlag = false;
|
||||
@ -136,14 +133,6 @@ public class Main {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (debugFlag) {
|
||||
// START A DEBUG SESSION
|
||||
// Given the current architecture, we will end up decoding the
|
||||
// arguments again, but at least we are guaranteed to have
|
||||
// arguments which are valid.
|
||||
return invokeDebugger(args);
|
||||
}
|
||||
|
||||
// INSTALL THE SECURITY MANAGER (if necessary)
|
||||
if (!noSecurityFlag && (System.getSecurityManager() == null))
|
||||
init();
|
||||
@ -191,9 +180,6 @@ public class Main {
|
||||
throw new ParseException(lookup("main.err.dupoption", arg));
|
||||
encoding = args[++i];
|
||||
return 2;
|
||||
} else if ("-debug".equals(arg)) {
|
||||
debugFlag = true;
|
||||
return 1;
|
||||
} else if ("-Xnosecurity".equals(arg)) {
|
||||
// This is an undocumented (and, in the future, unsupported)
|
||||
// flag which prevents AppletViewer from installing its own
|
||||
@ -267,68 +253,6 @@ public class Main {
|
||||
return u;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke the debugger with the arguments passed in to appletviewer.
|
||||
*
|
||||
* @param args The arguments passed into the debugger.
|
||||
* @return {@code 0} if the debugger is invoked successfully,
|
||||
* {@code 1} otherwise.
|
||||
*/
|
||||
private int invokeDebugger(String [] args) {
|
||||
// CONSTRUCT THE COMMAND LINE
|
||||
String [] newArgs = new String[args.length + 1];
|
||||
int current = 0;
|
||||
|
||||
// Add a -classpath argument that prevents
|
||||
// the debugger from launching appletviewer with the default of
|
||||
// ".". appletviewer's classpath should never contain valid
|
||||
// classes since they will result in security exceptions.
|
||||
// Ideally, the classpath should be set to "", but the VM won't
|
||||
// allow an empty classpath, so a phony directory name is used.
|
||||
String phonyDir = System.getProperty("java.home") +
|
||||
File.separator + "phony";
|
||||
newArgs[current++] = "-Djava.class.path=" + phonyDir;
|
||||
|
||||
// Appletviewer's main class is the debuggee
|
||||
newArgs[current++] = "sun.applet.Main";
|
||||
|
||||
// Append all the of the original appletviewer arguments,
|
||||
// leaving out the "-debug" option.
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (!("-debug".equals(args[i]))) {
|
||||
newArgs[current++] = args[i];
|
||||
}
|
||||
}
|
||||
|
||||
// LAUNCH THE DEBUGGER
|
||||
// Reflection is used for two reasons:
|
||||
// 1) The debugger classes are on classpath and thus must be loaded
|
||||
// by the application class loader. (Currently, appletviewer are
|
||||
// loaded through the boot class path out of rt.jar.)
|
||||
// 2) Reflection removes any build dependency between appletviewer
|
||||
// and jdb.
|
||||
try {
|
||||
Class<?> c = Class.forName("com.sun.tools.example.debug.tty.TTY", true,
|
||||
ClassLoader.getSystemClassLoader());
|
||||
Method m = c.getDeclaredMethod("main",
|
||||
new Class<?>[] { String[].class });
|
||||
m.invoke(null, new Object[] { newArgs });
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
System.err.println(lookup("main.debug.cantfinddebug"));
|
||||
return 1;
|
||||
} catch (NoSuchMethodException nsme) {
|
||||
System.err.println(lookup("main.debug.cantfindmain"));
|
||||
return 1;
|
||||
} catch (InvocationTargetException ite) {
|
||||
System.err.println(lookup("main.debug.exceptionindebug"));
|
||||
return 1;
|
||||
} catch (IllegalAccessException iae) {
|
||||
System.err.println(lookup("main.debug.cantaccess"));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void init() {
|
||||
// GET APPLETVIEWER USER-SPECIFIC PROPERTIES
|
||||
Properties avProps = getAVProps();
|
||||
|
@ -74,7 +74,7 @@ public class MsgAppletViewer extends ListResourceBundle {
|
||||
{"appletviewer.parse.warning.embed.requireswidth", "Warning: <embed> tag requires width attribute."},
|
||||
{"appletviewer.parse.warning.appnotLongersupported", "Warning: <app> tag no longer supported, use <applet> instead:"},
|
||||
{"appletviewer.deprecated", "AppletViewer is deprecated."},
|
||||
{"appletviewer.usage", "Usage: appletviewer <options> url(s)\n\nwhere <options> include:\n -debug Start the applet viewer in the Java debugger\n -encoding <encoding> Specify character encoding used by HTML files\n -J<runtime flag> Pass argument to the java interpreter\n\nThe -J option is non-standard and subject to change without notice."},
|
||||
{"appletviewer.usage", "Usage: appletviewer <options> url(s)\n\nwhere <options> include:\n -encoding <encoding> Specify character encoding used by HTML files\n -J<runtime flag> Pass argument to the java interpreter\n\nThe -J option is non-standard and subject to change without notice."},
|
||||
{"appletviewer.main.err.unsupportedopt", "Unsupported option: {0}"},
|
||||
{"appletviewer.main.err.unrecognizedarg", "Unrecognized argument: {0}"},
|
||||
{"appletviewer.main.err.dupoption", "Duplicate use of option: {0}"},
|
||||
|
@ -1,3 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.awt;
|
||||
|
||||
import java.util.Collections;
|
||||
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.java2d;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
|
||||
/**
|
||||
* ReentrantContext is a base class to hold thread-local data supporting
|
||||
* reentrancy in either a ThreadLocal or a ConcurrentLinkedQueue
|
||||
*
|
||||
* @see ReentrantContextProvider
|
||||
*/
|
||||
public class ReentrantContext {
|
||||
// usage stored as a byte
|
||||
byte usage = ReentrantContextProvider.USAGE_TL_INACTIVE;
|
||||
/*
|
||||
* Reference to this instance (hard, soft or weak).
|
||||
* @see ReentrantContextProvider#refType
|
||||
*/
|
||||
Reference<? extends ReentrantContext> reference = null;
|
||||
}
|
@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.java2d;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
/**
|
||||
* This abstract ReentrantContextProvider helper class manages the creation,
|
||||
* storage, and retrieval of concrete ReentrantContext instances which can be
|
||||
* subclassed to hold cached contextual data.
|
||||
*
|
||||
* It supports reentrancy as every call to acquire() provides a new unique context
|
||||
* instance that must later be returned for reuse by a call to release(ctx)
|
||||
* (typically in a try/finally block).
|
||||
*
|
||||
* It has a couple of abstract implementations which store references in a queue
|
||||
* and/or thread-local storage.
|
||||
* The Providers can be configured to hold ReentrantContext instances in memory
|
||||
* using hard, soft or weak references.
|
||||
*
|
||||
* The acquire() and release() methods are used to retrieve and return the contexts.
|
||||
*
|
||||
* The {@code newContext()} method remains abstract in all implementations and
|
||||
* must be provided by the module to create a new subclass of ReentrantContext
|
||||
* with the appropriate contextual data in it.
|
||||
*
|
||||
* Sample Usage:
|
||||
* - create a subclass ReentrantContextImpl to hold the thread state:
|
||||
*
|
||||
* static final class ReentrantContextImpl extends ReentrantContext {
|
||||
* // specific cached data
|
||||
* }
|
||||
*
|
||||
* - create the appropriate ReentrantContextProvider:
|
||||
*
|
||||
* private static final ReentrantContextProvider<ReentrantContextImpl> contextProvider =
|
||||
* new ReentrantContextProviderTL<ReentrantContextImpl>(ReentrantContextProvider.REF_WEAK)
|
||||
* {
|
||||
* @Override
|
||||
* protected ReentrantContextImpl newContext() {
|
||||
* return new ReentrantContextImpl();
|
||||
* }
|
||||
* };
|
||||
* ...
|
||||
* void someMethod() {
|
||||
* ReentrantContextImpl ctx = contextProvider.acquire();
|
||||
* try {
|
||||
* // use the context
|
||||
* } finally {
|
||||
* contextProvider.release(ctx);
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* @param <K> ReentrantContext subclass
|
||||
*
|
||||
* @see ReentrantContext
|
||||
*/
|
||||
public abstract class ReentrantContextProvider<K extends ReentrantContext>
|
||||
{
|
||||
// thread-local storage: inactive
|
||||
static final byte USAGE_TL_INACTIVE = 0;
|
||||
// thread-local storage: in use
|
||||
static final byte USAGE_TL_IN_USE = 1;
|
||||
// CLQ storage
|
||||
static final byte USAGE_CLQ = 2;
|
||||
|
||||
// hard reference
|
||||
public static final int REF_HARD = 0;
|
||||
// soft reference
|
||||
public static final int REF_SOFT = 1;
|
||||
// weak reference
|
||||
public static final int REF_WEAK = 2;
|
||||
|
||||
/* members */
|
||||
// internal reference type
|
||||
private final int refType;
|
||||
|
||||
/**
|
||||
* Create a new ReentrantContext provider using the given reference type
|
||||
* among hard, soft or weak
|
||||
*
|
||||
* @param refType reference type
|
||||
*/
|
||||
protected ReentrantContextProvider(final int refType) {
|
||||
this.refType = refType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ReentrantContext instance
|
||||
*
|
||||
* @return new ReentrantContext instance
|
||||
*/
|
||||
protected abstract K newContext();
|
||||
|
||||
/**
|
||||
* Give a ReentrantContext instance for the current thread
|
||||
*
|
||||
* @return ReentrantContext instance
|
||||
*/
|
||||
public abstract K acquire();
|
||||
|
||||
/**
|
||||
* Restore the given ReentrantContext instance for reuse
|
||||
*
|
||||
* @param ctx ReentrantContext instance
|
||||
*/
|
||||
public abstract void release(K ctx);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected final Reference<K> getOrCreateReference(final K ctx) {
|
||||
if (ctx.reference == null) {
|
||||
// Create the reference:
|
||||
switch (refType) {
|
||||
case REF_HARD:
|
||||
ctx.reference = new HardReference<K>(ctx);
|
||||
break;
|
||||
case REF_SOFT:
|
||||
ctx.reference = new SoftReference<K>(ctx);
|
||||
break;
|
||||
default:
|
||||
case REF_WEAK:
|
||||
ctx.reference = new WeakReference<K>(ctx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (Reference<K>) ctx.reference;
|
||||
}
|
||||
|
||||
/* Missing HardReference implementation */
|
||||
static final class HardReference<V> extends WeakReference<V> {
|
||||
// kept strong reference:
|
||||
private final V strongRef;
|
||||
|
||||
HardReference(final V referent) {
|
||||
// no referent needed for the parent WeakReference:
|
||||
super(null);
|
||||
this.strongRef = referent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public V get() {
|
||||
return strongRef;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.java2d;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
/**
|
||||
* This ReentrantContextProvider implementation uses one ConcurrentLinkedQueue
|
||||
* to store all ReentrantContext instances (thread and its child contexts)
|
||||
*
|
||||
* Note: this implementation keeps less contexts in memory depending on the
|
||||
* concurrent active threads in contrary to a ThreadLocal provider. However,
|
||||
* it is slower in highly concurrent workloads.
|
||||
*
|
||||
* @param <K> ReentrantContext subclass
|
||||
*/
|
||||
public abstract class ReentrantContextProviderCLQ<K extends ReentrantContext>
|
||||
extends ReentrantContextProvider<K>
|
||||
{
|
||||
// ReentrantContext queue to store all contexts
|
||||
private final ConcurrentLinkedQueue<Reference<K>> ctxQueue
|
||||
= new ConcurrentLinkedQueue<Reference<K>>();
|
||||
|
||||
/**
|
||||
* Create a new ReentrantContext provider using the given reference type
|
||||
* among hard, soft or weak based using a ConcurrentLinkedQueue storage
|
||||
*
|
||||
* @param refType reference type
|
||||
*/
|
||||
public ReentrantContextProviderCLQ(final int refType) {
|
||||
super(refType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Give a ReentrantContext instance for the current thread
|
||||
*
|
||||
* @return ReentrantContext instance
|
||||
*/
|
||||
@Override
|
||||
public final K acquire() {
|
||||
K ctx = null;
|
||||
// Drain queue if all referent are null:
|
||||
Reference<K> ref = null;
|
||||
while ((ctx == null) && ((ref = ctxQueue.poll()) != null)) {
|
||||
ctx = ref.get();
|
||||
}
|
||||
if (ctx == null) {
|
||||
// create a new ReentrantContext if none is available
|
||||
ctx = newContext();
|
||||
ctx.usage = USAGE_CLQ;
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the given ReentrantContext instance for reuse
|
||||
*
|
||||
* @param ctx ReentrantContext instance
|
||||
*/
|
||||
@Override
|
||||
public final void release(final K ctx) {
|
||||
if (ctx.usage == USAGE_CLQ) {
|
||||
ctxQueue.offer(getOrCreateReference(ctx));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.java2d;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
|
||||
/**
|
||||
* This ReentrantContextProvider implementation uses a ThreadLocal to hold
|
||||
* the first ReentrantContext per thread and a ReentrantContextProviderCLQ to
|
||||
* store child ReentrantContext instances needed during recursion.
|
||||
*
|
||||
* Note: this implementation may keep up to one context in memory per thread.
|
||||
* Child contexts for recursive uses are stored in the queue using a WEAK
|
||||
* reference by default unless specified in the 2 argument constructor.
|
||||
*
|
||||
* @param <K> ReentrantContext subclass
|
||||
*/
|
||||
public abstract class ReentrantContextProviderTL<K extends ReentrantContext>
|
||||
extends ReentrantContextProvider<K>
|
||||
{
|
||||
// Thread-local storage:
|
||||
private final ThreadLocal<Reference<K>> ctxTL
|
||||
= new ThreadLocal<Reference<K>>();
|
||||
|
||||
// ReentrantContext CLQ provider for child contexts:
|
||||
private final ReentrantContextProviderCLQ<K> ctxProviderCLQ;
|
||||
|
||||
/**
|
||||
* Create a new ReentrantContext provider using the given reference type
|
||||
* among hard, soft or weak.
|
||||
* It uses weak reference for the child contexts.
|
||||
*
|
||||
* @param refType reference type
|
||||
*/
|
||||
public ReentrantContextProviderTL(final int refType) {
|
||||
this(refType, REF_WEAK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ReentrantContext provider using the given reference types
|
||||
* among hard, soft or weak
|
||||
*
|
||||
* @param refTypeTL reference type used by ThreadLocal
|
||||
* @param refTypeCLQ reference type used by ReentrantContextProviderCLQ
|
||||
*/
|
||||
public ReentrantContextProviderTL(final int refTypeTL, final int refTypeCLQ)
|
||||
{
|
||||
super(refTypeTL);
|
||||
|
||||
final ReentrantContextProviderTL<K> parent = this;
|
||||
|
||||
this.ctxProviderCLQ = new ReentrantContextProviderCLQ<K>(refTypeCLQ) {
|
||||
@Override
|
||||
protected K newContext() {
|
||||
return parent.newContext();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Give a ReentrantContext instance for the current thread
|
||||
*
|
||||
* @return ReentrantContext instance
|
||||
*/
|
||||
@Override
|
||||
public final K acquire() {
|
||||
K ctx = null;
|
||||
final Reference<K> ref = ctxTL.get();
|
||||
if (ref != null) {
|
||||
ctx = ref.get();
|
||||
}
|
||||
if (ctx == null) {
|
||||
// create a new ReentrantContext if none is available
|
||||
ctx = newContext();
|
||||
// update thread local reference:
|
||||
ctxTL.set(getOrCreateReference(ctx));
|
||||
}
|
||||
// Check reentrance:
|
||||
if (ctx.usage == USAGE_TL_INACTIVE) {
|
||||
ctx.usage = USAGE_TL_IN_USE;
|
||||
} else {
|
||||
// get or create another ReentrantContext from CLQ provider:
|
||||
ctx = ctxProviderCLQ.acquire();
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the given ReentrantContext instance for reuse
|
||||
*
|
||||
* @param ctx ReentrantContext instance
|
||||
*/
|
||||
@Override
|
||||
public final void release(final K ctx) {
|
||||
if (ctx.usage == USAGE_TL_IN_USE) {
|
||||
ctx.usage = USAGE_TL_INACTIVE;
|
||||
} else {
|
||||
ctxProviderCLQ.release(ctx);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -126,7 +126,7 @@ final class ByteArrayCache implements MarlinConst {
|
||||
}
|
||||
|
||||
if (doChecks) {
|
||||
check(array, 0, array.length, value);
|
||||
check(array, fromIndex, toIndex, value);
|
||||
}
|
||||
}
|
||||
|
||||
@ -135,9 +135,10 @@ final class ByteArrayCache implements MarlinConst {
|
||||
{
|
||||
if (doChecks) {
|
||||
// check zero on full array:
|
||||
for (int i = fromIndex; i < toIndex; i++) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i] != value) {
|
||||
logException("Invalid array value at " + i + "\n"
|
||||
logException("Invalid value at: " + i + " = " + array[i]
|
||||
+ " from: " + fromIndex + " to: " + toIndex + "\n"
|
||||
+ Arrays.toString(array), new Throwable());
|
||||
|
||||
// ensure array is correctly filled:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -127,7 +127,7 @@ final class FloatArrayCache implements MarlinConst {
|
||||
}
|
||||
|
||||
if (doChecks) {
|
||||
check(array, 0, array.length, value);
|
||||
check(array, fromIndex, toIndex, value);
|
||||
}
|
||||
}
|
||||
|
||||
@ -136,9 +136,10 @@ final class FloatArrayCache implements MarlinConst {
|
||||
{
|
||||
if (doChecks) {
|
||||
// check zero on full array:
|
||||
for (int i = fromIndex; i < toIndex; i++) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i] != value) {
|
||||
logException("Invalid array value at " + i + "\n"
|
||||
logException("Invalid value at: " + i + " = " + array[i]
|
||||
+ " from: " + fromIndex + " to: " + toIndex + "\n"
|
||||
+ Arrays.toString(array), new Throwable());
|
||||
|
||||
// ensure array is correctly filled:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -126,7 +126,7 @@ final class IntArrayCache implements MarlinConst {
|
||||
}
|
||||
|
||||
if (doChecks) {
|
||||
check(array, 0, array.length, value);
|
||||
check(array, fromIndex, toIndex, value);
|
||||
}
|
||||
}
|
||||
|
||||
@ -135,9 +135,10 @@ final class IntArrayCache implements MarlinConst {
|
||||
{
|
||||
if (doChecks) {
|
||||
// check zero on full array:
|
||||
for (int i = fromIndex; i < toIndex; i++) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i] != value) {
|
||||
logException("Invalid array value at " + i + "\n"
|
||||
logException("Invalid value at: " + i + " = " + array[i]
|
||||
+ " from: " + fromIndex + " to: " + toIndex + "\n"
|
||||
+ Arrays.toString(array), new Throwable());
|
||||
|
||||
// ensure array is correctly filled:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -590,8 +590,8 @@ public final class MarlinCache implements MarlinConst {
|
||||
alphaRow[to + 1] = 0;
|
||||
}
|
||||
if (doChecks) {
|
||||
IntArrayCache.check(blkFlags, 0, blkFlags.length, 0);
|
||||
IntArrayCache.check(alphaRow, 0, alphaRow.length, 0);
|
||||
IntArrayCache.check(blkFlags, blkW, blkE, 0);
|
||||
IntArrayCache.check(alphaRow, from, px1 - bboxX0, 0);
|
||||
}
|
||||
|
||||
if (doMonitors) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -30,11 +30,12 @@ import java.awt.Shape;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Path2D;
|
||||
import java.awt.geom.PathIterator;
|
||||
import java.lang.ref.Reference;
|
||||
import java.security.AccessController;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import static sun.java2d.marlin.MarlinUtils.logInfo;
|
||||
import sun.awt.geom.PathConsumer2D;
|
||||
import sun.java2d.ReentrantContextProvider;
|
||||
import sun.java2d.ReentrantContextProviderCLQ;
|
||||
import sun.java2d.ReentrantContextProviderTL;
|
||||
import sun.java2d.pipe.AATileGenerator;
|
||||
import sun.java2d.pipe.Region;
|
||||
import sun.java2d.pipe.RenderingEngine;
|
||||
@ -882,46 +883,50 @@ public class MarlinRenderingEngine extends RenderingEngine
|
||||
// use ThreadLocal or ConcurrentLinkedQueue to get one RendererContext
|
||||
private static final boolean useThreadLocal;
|
||||
|
||||
// hard reference
|
||||
static final int REF_HARD = 0;
|
||||
// soft reference
|
||||
static final int REF_SOFT = 1;
|
||||
// weak reference
|
||||
static final int REF_WEAK = 2;
|
||||
|
||||
// reference type stored in either TL or CLQ
|
||||
static final int REF_TYPE;
|
||||
|
||||
// Per-thread RendererContext
|
||||
private static final ThreadLocal<Object> rdrCtxThreadLocal;
|
||||
// RendererContext queue when ThreadLocal is disabled
|
||||
private static final ConcurrentLinkedQueue<Object> rdrCtxQueue;
|
||||
private static final ReentrantContextProvider<RendererContext> rdrCtxProvider;
|
||||
|
||||
// Static initializer to use TL or CLQ mode
|
||||
static {
|
||||
// CLQ mode by default:
|
||||
useThreadLocal = MarlinProperties.isUseThreadLocal();
|
||||
rdrCtxThreadLocal = (useThreadLocal) ? new ThreadLocal<Object>()
|
||||
: null;
|
||||
rdrCtxQueue = (!useThreadLocal) ? new ConcurrentLinkedQueue<Object>()
|
||||
: null;
|
||||
|
||||
// Soft reference by default:
|
||||
String refType = AccessController.doPrivileged(
|
||||
final String refType = AccessController.doPrivileged(
|
||||
new GetPropertyAction("sun.java2d.renderer.useRef",
|
||||
"soft"));
|
||||
switch (refType) {
|
||||
default:
|
||||
case "soft":
|
||||
REF_TYPE = REF_SOFT;
|
||||
REF_TYPE = ReentrantContextProvider.REF_SOFT;
|
||||
break;
|
||||
case "weak":
|
||||
REF_TYPE = REF_WEAK;
|
||||
REF_TYPE = ReentrantContextProvider.REF_WEAK;
|
||||
break;
|
||||
case "hard":
|
||||
REF_TYPE = REF_HARD;
|
||||
REF_TYPE = ReentrantContextProvider.REF_HARD;
|
||||
break;
|
||||
}
|
||||
|
||||
if (useThreadLocal) {
|
||||
rdrCtxProvider = new ReentrantContextProviderTL<RendererContext>(REF_TYPE)
|
||||
{
|
||||
@Override
|
||||
protected RendererContext newContext() {
|
||||
return RendererContext.createContext();
|
||||
}
|
||||
};
|
||||
} else {
|
||||
rdrCtxProvider = new ReentrantContextProviderCLQ<RendererContext>(REF_TYPE)
|
||||
{
|
||||
@Override
|
||||
protected RendererContext newContext() {
|
||||
return RendererContext.createContext();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean settingsLogged = !enableLogs;
|
||||
@ -936,13 +941,13 @@ public class MarlinRenderingEngine extends RenderingEngine
|
||||
String refType;
|
||||
switch (REF_TYPE) {
|
||||
default:
|
||||
case REF_HARD:
|
||||
case ReentrantContextProvider.REF_HARD:
|
||||
refType = "hard";
|
||||
break;
|
||||
case REF_SOFT:
|
||||
case ReentrantContextProvider.REF_SOFT:
|
||||
refType = "soft";
|
||||
break;
|
||||
case REF_WEAK:
|
||||
case ReentrantContextProvider.REF_WEAK:
|
||||
refType = "weak";
|
||||
break;
|
||||
}
|
||||
@ -1025,22 +1030,7 @@ public class MarlinRenderingEngine extends RenderingEngine
|
||||
*/
|
||||
@SuppressWarnings({"unchecked"})
|
||||
static RendererContext getRendererContext() {
|
||||
RendererContext rdrCtx = null;
|
||||
final Object ref = (useThreadLocal) ? rdrCtxThreadLocal.get()
|
||||
: rdrCtxQueue.poll();
|
||||
if (ref != null) {
|
||||
// resolve reference:
|
||||
rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref)
|
||||
: ((Reference<RendererContext>) ref).get();
|
||||
}
|
||||
// create a new RendererContext if none is available
|
||||
if (rdrCtx == null) {
|
||||
rdrCtx = RendererContext.createContext();
|
||||
if (useThreadLocal) {
|
||||
// update thread local reference:
|
||||
rdrCtxThreadLocal.set(rdrCtx.reference);
|
||||
}
|
||||
}
|
||||
final RendererContext rdrCtx = rdrCtxProvider.acquire();
|
||||
if (doMonitors) {
|
||||
RendererContext.stats.mon_pre_getAATileGenerator.start();
|
||||
}
|
||||
@ -1057,8 +1047,6 @@ public class MarlinRenderingEngine extends RenderingEngine
|
||||
if (doMonitors) {
|
||||
RendererContext.stats.mon_pre_getAATileGenerator.stop();
|
||||
}
|
||||
if (!useThreadLocal) {
|
||||
rdrCtxQueue.offer(rdrCtx.reference);
|
||||
}
|
||||
rdrCtxProvider.release(rdrCtx);
|
||||
}
|
||||
}
|
||||
|
@ -148,8 +148,8 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// EDGE LIST
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
private float edgeMinY = Float.POSITIVE_INFINITY;
|
||||
private float edgeMaxY = Float.NEGATIVE_INFINITY;
|
||||
private int edgeMinY = Integer.MAX_VALUE;
|
||||
private int edgeMaxY = Integer.MIN_VALUE;
|
||||
private float edgeMinX = Float.POSITIVE_INFINITY;
|
||||
private float edgeMaxX = Float.NEGATIVE_INFINITY;
|
||||
|
||||
@ -357,18 +357,21 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
}
|
||||
return;
|
||||
}
|
||||
// edge min/max X/Y are in subpixel space (inclusive)
|
||||
if (y1 < edgeMinY) {
|
||||
edgeMinY = y1;
|
||||
|
||||
// edge min/max X/Y are in subpixel space (inclusive) within bounds:
|
||||
// note: Use integer crossings to ensure consistent range within
|
||||
// edgeBuckets / edgeBucketCounts arrays in case of NaN values (int = 0)
|
||||
if (firstCrossing < edgeMinY) {
|
||||
edgeMinY = firstCrossing;
|
||||
}
|
||||
if (y2 > edgeMaxY) {
|
||||
edgeMaxY = y2;
|
||||
if (lastCrossing > edgeMaxY) {
|
||||
edgeMaxY = lastCrossing;
|
||||
}
|
||||
|
||||
// Use double-precision for improved accuracy:
|
||||
final double x1d = x1;
|
||||
final double y1d = y1;
|
||||
final double slope = (x2 - x1d) / (y2 - y1d);
|
||||
final double slope = (x1d - x2) / (y1d - y2);
|
||||
|
||||
if (slope >= 0.0) { // <==> x1 < x2
|
||||
if (x1 < edgeMinX) {
|
||||
@ -504,7 +507,7 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
private float x0, y0;
|
||||
|
||||
// Position of most recent 'moveTo' command
|
||||
private float pix_sx0, pix_sy0;
|
||||
private float sx0, sy0;
|
||||
|
||||
// per-thread renderer context
|
||||
final RendererContext rdrCtx;
|
||||
@ -570,8 +573,8 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
edgeBucketCounts = rdrCtx.getIntArray(edgeBucketsLength);
|
||||
}
|
||||
|
||||
edgeMinY = Float.POSITIVE_INFINITY;
|
||||
edgeMaxY = Float.NEGATIVE_INFINITY;
|
||||
edgeMinY = Integer.MAX_VALUE;
|
||||
edgeMaxY = Integer.MIN_VALUE;
|
||||
edgeMinX = Float.POSITIVE_INFINITY;
|
||||
edgeMaxX = Float.NEGATIVE_INFINITY;
|
||||
|
||||
@ -628,7 +631,7 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
blkFlags = blkFlags_initial;
|
||||
}
|
||||
|
||||
if (edgeMinY != Float.POSITIVE_INFINITY) {
|
||||
if (edgeMinY != Integer.MAX_VALUE) {
|
||||
// if context is maked as DIRTY:
|
||||
if (rdrCtx.dirty) {
|
||||
// may happen if an exception if thrown in the pipeline processing:
|
||||
@ -688,16 +691,18 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
@Override
|
||||
public void moveTo(float pix_x0, float pix_y0) {
|
||||
closePath();
|
||||
this.pix_sx0 = pix_x0;
|
||||
this.pix_sy0 = pix_y0;
|
||||
this.y0 = tosubpixy(pix_y0);
|
||||
this.x0 = tosubpixx(pix_x0);
|
||||
final float sx = tosubpixx(pix_x0);
|
||||
final float sy = tosubpixy(pix_y0);
|
||||
this.sx0 = sx;
|
||||
this.sy0 = sy;
|
||||
this.x0 = sx;
|
||||
this.y0 = sy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lineTo(float pix_x1, float pix_y1) {
|
||||
float x1 = tosubpixx(pix_x1);
|
||||
float y1 = tosubpixy(pix_y1);
|
||||
final float x1 = tosubpixx(pix_x1);
|
||||
final float y1 = tosubpixy(pix_y1);
|
||||
addLine(x0, y0, x1, y1);
|
||||
x0 = x1;
|
||||
y0 = y1;
|
||||
@ -729,8 +734,9 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
|
||||
@Override
|
||||
public void closePath() {
|
||||
// lineTo expects its input in pixel coordinates.
|
||||
lineTo(pix_sx0, pix_sy0);
|
||||
addLine(x0, y0, sx0, sy0);
|
||||
x0 = sx0;
|
||||
y0 = sy0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1396,7 +1402,7 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
if (doMonitors) {
|
||||
RendererContext.stats.mon_rdr_endRendering.start();
|
||||
}
|
||||
if (edgeMinY == Float.POSITIVE_INFINITY) {
|
||||
if (edgeMinY == Integer.MAX_VALUE) {
|
||||
return false; // undefined edges bounds
|
||||
}
|
||||
|
||||
@ -1407,11 +1413,10 @@ final class Renderer implements PathConsumer2D, MarlinConst {
|
||||
final int spminX = FloatMath.max(FloatMath.ceil_int(edgeMinX - 0.5f), boundsMinX);
|
||||
final int spmaxX = FloatMath.min(FloatMath.ceil_int(edgeMaxX - 0.5f), boundsMaxX - 1);
|
||||
|
||||
// y1 (and y2) are already biased by -0.5 in tosubpixy():
|
||||
final int spminY = FloatMath.max(FloatMath.ceil_int(edgeMinY), _boundsMinY);
|
||||
int maxY = FloatMath.ceil_int(edgeMaxY);
|
||||
|
||||
// edge Min/Max Y are already rounded to subpixels within bounds:
|
||||
final int spminY = edgeMinY;
|
||||
final int spmaxY;
|
||||
int maxY = edgeMaxY;
|
||||
|
||||
if (maxY <= _boundsMaxY - 1) {
|
||||
spmaxY = maxY;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,9 +26,10 @@
|
||||
package sun.java2d.marlin;
|
||||
|
||||
import java.awt.geom.Path2D;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import sun.java2d.ReentrantContext;
|
||||
import sun.java2d.ReentrantContextProvider;
|
||||
import static sun.java2d.marlin.ArrayCache.*;
|
||||
import sun.java2d.marlin.MarlinRenderingEngine.NormalizingPathIterator;
|
||||
import static sun.java2d.marlin.MarlinUtils.logInfo;
|
||||
@ -36,7 +37,7 @@ import static sun.java2d.marlin.MarlinUtils.logInfo;
|
||||
/**
|
||||
* This class is a renderer context dedicated to a single thread
|
||||
*/
|
||||
final class RendererContext implements MarlinConst {
|
||||
final class RendererContext extends ReentrantContext implements MarlinConst {
|
||||
|
||||
// RendererContext creation counter
|
||||
private static final AtomicInteger contextCount = new AtomicInteger(1);
|
||||
@ -45,7 +46,7 @@ final class RendererContext implements MarlinConst {
|
||||
? RendererStats.getInstance(): null;
|
||||
|
||||
private static final boolean USE_CACHE_HARD_REF = doStats
|
||||
|| (MarlinRenderingEngine.REF_TYPE == MarlinRenderingEngine.REF_WEAK);
|
||||
|| (MarlinRenderingEngine.REF_TYPE == ReentrantContextProvider.REF_WEAK);
|
||||
|
||||
/**
|
||||
* Create a new renderer context
|
||||
@ -55,6 +56,7 @@ final class RendererContext implements MarlinConst {
|
||||
static RendererContext createContext() {
|
||||
final RendererContext newCtx = new RendererContext("ctx"
|
||||
+ Integer.toString(contextCount.getAndIncrement()));
|
||||
|
||||
if (RendererContext.stats != null) {
|
||||
RendererContext.stats.allContexts.add(newCtx);
|
||||
}
|
||||
@ -63,11 +65,6 @@ final class RendererContext implements MarlinConst {
|
||||
|
||||
// context name (debugging purposes)
|
||||
final String name;
|
||||
/*
|
||||
* Reference to this instance (hard, soft or weak).
|
||||
* @see MarlinRenderingEngine#REF_TYPE
|
||||
*/
|
||||
final Object reference;
|
||||
// Smallest object used as Cleaner's parent reference
|
||||
final Object cleanerObj = new Object();
|
||||
// dirty flag indicating an exception occured during pipeline in pathTo()
|
||||
@ -101,7 +98,7 @@ final class RendererContext implements MarlinConst {
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param name
|
||||
* @param name context name (debugging)
|
||||
*/
|
||||
RendererContext(final String name) {
|
||||
if (logCreateContext) {
|
||||
@ -124,20 +121,6 @@ final class RendererContext implements MarlinConst {
|
||||
|
||||
stroker = new Stroker(this);
|
||||
dasher = new Dasher(this);
|
||||
|
||||
// Create the reference to this instance (hard, soft or weak):
|
||||
switch (MarlinRenderingEngine.REF_TYPE) {
|
||||
default:
|
||||
case MarlinRenderingEngine.REF_HARD:
|
||||
reference = this;
|
||||
break;
|
||||
case MarlinRenderingEngine.REF_SOFT:
|
||||
reference = new SoftReference<RendererContext>(this);
|
||||
break;
|
||||
case MarlinRenderingEngine.REF_WEAK:
|
||||
reference = new WeakReference<RendererContext>(this);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,7 +27,7 @@ package sun.java2d.marlin;
|
||||
|
||||
public final class Version {
|
||||
|
||||
private static final String version = "marlin-0.7.3-Unsafe-OpenJDK";
|
||||
private static final String version = "marlin-0.7.3.2-Unsafe-OpenJDK";
|
||||
|
||||
public static String getVersion() {
|
||||
return version;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -28,7 +28,11 @@ import java.awt.BasicStroke;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import sun.awt.SunHints;
|
||||
import sun.java2d.ReentrantContext;
|
||||
import sun.java2d.ReentrantContextProvider;
|
||||
import sun.java2d.ReentrantContextProviderTL;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
|
||||
/**
|
||||
@ -38,28 +42,31 @@ import sun.java2d.SunGraphics2D;
|
||||
* This class sets up the Generator and computes the alpha tiles
|
||||
* and then passes them on to a CompositePipe object for painting.
|
||||
*/
|
||||
public class AAShapePipe
|
||||
public final class AAShapePipe
|
||||
implements ShapeDrawPipe, ParallelogramPipe
|
||||
{
|
||||
static RenderingEngine renderengine = RenderingEngine.getInstance();
|
||||
static final RenderingEngine renderengine = RenderingEngine.getInstance();
|
||||
|
||||
// Per-thread TileState (~1K very small so do not use any Weak Reference)
|
||||
private static final ThreadLocal<TileState> tileStateThreadLocal =
|
||||
new ThreadLocal<TileState>() {
|
||||
@Override
|
||||
protected TileState initialValue() {
|
||||
return new TileState();
|
||||
}
|
||||
};
|
||||
private static final ReentrantContextProvider<TileState> tileStateProvider =
|
||||
new ReentrantContextProviderTL<TileState>(
|
||||
ReentrantContextProvider.REF_HARD)
|
||||
{
|
||||
@Override
|
||||
protected TileState newContext() {
|
||||
return new TileState();
|
||||
}
|
||||
};
|
||||
|
||||
CompositePipe outpipe;
|
||||
final CompositePipe outpipe;
|
||||
|
||||
public AAShapePipe(CompositePipe pipe) {
|
||||
outpipe = pipe;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(SunGraphics2D sg, Shape s) {
|
||||
BasicStroke bs;
|
||||
final BasicStroke bs;
|
||||
|
||||
if (sg.stroke instanceof BasicStroke) {
|
||||
bs = (BasicStroke) sg.stroke;
|
||||
@ -71,10 +78,12 @@ public class AAShapePipe
|
||||
renderPath(sg, s, bs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fill(SunGraphics2D sg, Shape s) {
|
||||
renderPath(sg, s, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillParallelogram(SunGraphics2D sg,
|
||||
double ux1, double uy1,
|
||||
double ux2, double uy2,
|
||||
@ -82,21 +91,23 @@ public class AAShapePipe
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2)
|
||||
{
|
||||
Region clip = sg.getCompClip();
|
||||
final TileState ts = tileStateThreadLocal.get();
|
||||
final int[] abox = ts.abox;
|
||||
final TileState ts = tileStateProvider.acquire();
|
||||
try {
|
||||
final int[] abox = ts.abox;
|
||||
|
||||
AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0,
|
||||
clip, abox);
|
||||
if (aatg == null) {
|
||||
// Nothing to render
|
||||
return;
|
||||
final AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0,
|
||||
sg.getCompClip(), abox);
|
||||
if (aatg != null) {
|
||||
renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2),
|
||||
aatg, abox, ts);
|
||||
}
|
||||
} finally {
|
||||
tileStateProvider.release(ts);
|
||||
}
|
||||
|
||||
renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2), aatg, abox, ts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawParallelogram(SunGraphics2D sg,
|
||||
double ux1, double uy1,
|
||||
double ux2, double uy2,
|
||||
@ -105,52 +116,61 @@ public class AAShapePipe
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
Region clip = sg.getCompClip();
|
||||
final TileState ts = tileStateThreadLocal.get();
|
||||
final int[] abox = ts.abox;
|
||||
final TileState ts = tileStateProvider.acquire();
|
||||
try {
|
||||
final int[] abox = ts.abox;
|
||||
|
||||
AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, lw1, lw2,
|
||||
clip, abox);
|
||||
if (aatg == null) {
|
||||
// Nothing to render
|
||||
return;
|
||||
final AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, lw1,
|
||||
lw2, sg.getCompClip(), abox);
|
||||
if (aatg != null) {
|
||||
// Note that bbox is of the original shape, not the wide path.
|
||||
// This is appropriate for handing to Paint methods...
|
||||
renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2),
|
||||
aatg, abox, ts);
|
||||
}
|
||||
} finally {
|
||||
tileStateProvider.release(ts);
|
||||
}
|
||||
|
||||
// Note that bbox is of the original shape, not the wide path.
|
||||
// This is appropriate for handing to Paint methods...
|
||||
renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2), aatg, abox, ts);
|
||||
}
|
||||
|
||||
public void renderPath(SunGraphics2D sg, Shape s, BasicStroke bs) {
|
||||
boolean adjust = (bs != null &&
|
||||
final boolean adjust = (bs != null &&
|
||||
sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
|
||||
boolean thin = (sg.strokeState <= SunGraphics2D.STROKE_THINDASHED);
|
||||
final boolean thin = (sg.strokeState <= SunGraphics2D.STROKE_THINDASHED);
|
||||
|
||||
Region clip = sg.getCompClip();
|
||||
final TileState ts = tileStateThreadLocal.get();
|
||||
final int[] abox = ts.abox;
|
||||
final TileState ts = tileStateProvider.acquire();
|
||||
try {
|
||||
final int[] abox = ts.abox;
|
||||
|
||||
AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(s, sg.transform, clip,
|
||||
bs, thin, adjust, abox);
|
||||
if (aatg == null) {
|
||||
// Nothing to render
|
||||
return;
|
||||
final AATileGenerator aatg =
|
||||
renderengine.getAATileGenerator(s, sg.transform, sg.getCompClip(),
|
||||
bs, thin, adjust, abox);
|
||||
if (aatg != null) {
|
||||
renderTiles(sg, s, aatg, abox, ts);
|
||||
}
|
||||
} finally {
|
||||
tileStateProvider.release(ts);
|
||||
}
|
||||
|
||||
renderTiles(sg, s, aatg, abox, ts);
|
||||
}
|
||||
|
||||
public void renderTiles(SunGraphics2D sg, Shape s,
|
||||
AATileGenerator aatg, int abox[], TileState ts)
|
||||
final AATileGenerator aatg,
|
||||
final int[] abox, final TileState ts)
|
||||
{
|
||||
Object context = null;
|
||||
try {
|
||||
// reentrance: outpipe may also use AAShapePipe:
|
||||
context = outpipe.startSequence(sg, s,
|
||||
ts.computeDevBox(abox),
|
||||
abox);
|
||||
|
||||
// copy of int[] abox as local variables for performance:
|
||||
final int x0 = abox[0];
|
||||
final int y0 = abox[1];
|
||||
final int x1 = abox[2];
|
||||
final int y1 = abox[3];
|
||||
|
||||
final int tw = aatg.getTileWidth();
|
||||
final int th = aatg.getTileHeight();
|
||||
|
||||
@ -158,16 +178,15 @@ public class AAShapePipe
|
||||
final byte[] alpha = ts.getAlphaTile(tw * th);
|
||||
byte[] atile;
|
||||
|
||||
for (int y = abox[1]; y < abox[3]; y += th) {
|
||||
int h = Math.min(th, abox[3] - y);
|
||||
for (int y = y0; y < y1; y += th) {
|
||||
final int h = Math.min(th, y1 - y);
|
||||
|
||||
for (int x = abox[0]; x < abox[2]; x += tw) {
|
||||
int w = Math.min(tw, abox[2] - x);
|
||||
for (int x = x0; x < x1; x += tw) {
|
||||
final int w = Math.min(tw, x1 - x);
|
||||
|
||||
int a = aatg.getTypicalAlpha();
|
||||
if (a == 0x00 ||
|
||||
outpipe.needTile(context, x, y, w, h) == false)
|
||||
{
|
||||
final int a = aatg.getTypicalAlpha();
|
||||
|
||||
if (a == 0x00 || !outpipe.needTile(context, x, y, w, h)) {
|
||||
aatg.nextTile();
|
||||
outpipe.skipTile(context, x, y);
|
||||
continue;
|
||||
@ -180,8 +199,7 @@ public class AAShapePipe
|
||||
aatg.getAlpha(alpha, 0, tw);
|
||||
}
|
||||
|
||||
outpipe.renderPathTile(context, atile, 0, tw,
|
||||
x, y, w, h);
|
||||
outpipe.renderPathTile(context, atile, 0, tw, x, y, w, h);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@ -193,7 +211,7 @@ public class AAShapePipe
|
||||
}
|
||||
|
||||
// Tile state used by AAShapePipe
|
||||
static final class TileState {
|
||||
static final class TileState extends ReentrantContext {
|
||||
// cached tile (32 x 32 tile by default)
|
||||
private byte[] theTile = new byte[32 * 32];
|
||||
// dirty aabox array
|
||||
@ -240,5 +258,4 @@ public class AAShapePipe
|
||||
return box;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -791,12 +791,15 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
return page;
|
||||
}
|
||||
|
||||
final GraphicsConfiguration gc =
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getDefaultScreenDevice().getDefaultConfiguration();
|
||||
Rectangle bounds = gc.getBounds();
|
||||
int x = bounds.x+bounds.width/3;
|
||||
int y = bounds.y+bounds.height/3;
|
||||
GraphicsConfiguration grCfg = null;
|
||||
Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
|
||||
if (w != null) {
|
||||
grCfg = w.getGraphicsConfiguration();
|
||||
} else {
|
||||
grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getDefaultScreenDevice().getDefaultConfiguration();
|
||||
}
|
||||
final GraphicsConfiguration gc = grCfg;
|
||||
|
||||
PrintService service = java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<PrintService>() {
|
||||
@ -814,9 +817,39 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
return null;
|
||||
}
|
||||
|
||||
// we position the dialog a little beyond the upper-left corner of the window
|
||||
// which is consistent with the NATIVE page dialog
|
||||
Rectangle gcBounds = gc.getBounds();
|
||||
int x = gcBounds.x+50;
|
||||
int y = gcBounds.y+50;
|
||||
ServiceDialog pageDialog = new ServiceDialog(gc, x, y, service,
|
||||
DocFlavor.SERVICE_FORMATTED.PAGEABLE,
|
||||
attributes, (Frame)null);
|
||||
Rectangle dlgBounds = pageDialog.getBounds();
|
||||
|
||||
// if portion of dialog is not within the gc boundary
|
||||
if (!gcBounds.contains(dlgBounds)) {
|
||||
// check if dialog exceed window bounds at left or bottom
|
||||
// Then position the dialog by moving it by the amount it exceeds
|
||||
// the window bounds
|
||||
// If it results in dialog moving beyond the window bounds at top/left
|
||||
// then position it at window top/left
|
||||
if (dlgBounds.x + dlgBounds.width > gcBounds.x + gcBounds.width) {
|
||||
if ((gcBounds.x + gcBounds.width - dlgBounds.width) > gcBounds.x) {
|
||||
x = (gcBounds.x + gcBounds.width) - dlgBounds.width;
|
||||
} else {
|
||||
x = gcBounds.x;
|
||||
}
|
||||
}
|
||||
if (dlgBounds.y + dlgBounds.height > gcBounds.y + gcBounds.height) {
|
||||
if ((gcBounds.y + gcBounds.height - dlgBounds.height) > gcBounds.y) {
|
||||
y = (gcBounds.y + gcBounds.height) - dlgBounds.height;
|
||||
} else {
|
||||
y = gcBounds.y;
|
||||
}
|
||||
}
|
||||
pageDialog.setBounds(x, y, dlgBounds.width, dlgBounds.height);
|
||||
}
|
||||
pageDialog.show();
|
||||
|
||||
if (pageDialog.getStatus() == ServiceDialog.APPROVE) {
|
||||
@ -893,9 +926,15 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
* We raise privilege when we put up the dialog, to avoid
|
||||
* the "warning applet window" banner.
|
||||
*/
|
||||
final GraphicsConfiguration gc =
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getDefaultScreenDevice().getDefaultConfiguration();
|
||||
GraphicsConfiguration grCfg = null;
|
||||
Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
|
||||
if (w != null) {
|
||||
grCfg = w.getGraphicsConfiguration();
|
||||
} else {
|
||||
grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getDefaultScreenDevice().getDefaultConfiguration();
|
||||
}
|
||||
final GraphicsConfiguration gc = grCfg;
|
||||
|
||||
PrintService service = java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<PrintService>() {
|
||||
@ -940,9 +979,10 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle bounds = gc.getBounds();
|
||||
int x = bounds.x+bounds.width/3;
|
||||
int y = bounds.y+bounds.height/3;
|
||||
// we position the dialog a little beyond the upper-left corner of the window
|
||||
// which is consistent with the NATIVE print dialog
|
||||
int x = 50;
|
||||
int y = 50;
|
||||
PrintService newService;
|
||||
// temporarily add an attribute pointing back to this job.
|
||||
PrinterJobWrapper jobWrapper = new PrinterJobWrapper(this);
|
||||
|
@ -1,3 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.java2d.x11;
|
||||
|
||||
import java.awt.image.*;
|
||||
|
@ -52,6 +52,7 @@ public class CUPSPrinter {
|
||||
private boolean initialized;
|
||||
private static native String getCupsServer();
|
||||
private static native int getCupsPort();
|
||||
private static native String getCupsDefaultPrinter();
|
||||
private static native boolean canConnect(String server, int port);
|
||||
private static native boolean initIDs();
|
||||
// These functions need to be synchronized as
|
||||
@ -266,6 +267,15 @@ public class CUPSPrinter {
|
||||
* Returns 2 values - index 0 is printer name, index 1 is the uri.
|
||||
*/
|
||||
static String[] getDefaultPrinter() {
|
||||
// Try to get user/lpoptions-defined printer name from CUPS
|
||||
// if not user-set, then go for server default destination
|
||||
String printerInfo[] = new String[2];
|
||||
printerInfo[0] = getCupsDefaultPrinter();
|
||||
|
||||
if (printerInfo[0] != null) {
|
||||
printerInfo[1] = null;
|
||||
return printerInfo.clone();
|
||||
}
|
||||
try {
|
||||
URL url = new URL("http", getServer(), getPort(), "");
|
||||
final HttpURLConnection urlConnection =
|
||||
@ -301,7 +311,7 @@ public class CUPSPrinter {
|
||||
attCl)) {
|
||||
|
||||
HashMap<String, AttributeClass> defaultMap = null;
|
||||
String[] printerInfo = new String[2];
|
||||
|
||||
InputStream is = urlConnection.getInputStream();
|
||||
HashMap<String, AttributeClass>[] responseMap = IPPPrintService.readIPPResponse(
|
||||
is);
|
||||
|
@ -43,6 +43,10 @@ typedef int (*fn_ippPort)(void);
|
||||
typedef http_t* (*fn_httpConnect)(const char *, int);
|
||||
typedef void (*fn_httpClose)(http_t *);
|
||||
typedef char* (*fn_cupsGetPPD)(const char *);
|
||||
typedef cups_dest_t* (*fn_cupsGetDest)(const char *name,
|
||||
const char *instance, int num_dests, cups_dest_t *dests);
|
||||
typedef int (*fn_cupsGetDests)(cups_dest_t **dests);
|
||||
typedef void (*fn_cupsFreeDests)(int num_dests, cups_dest_t *dests);
|
||||
typedef ppd_file_t* (*fn_ppdOpenFile)(const char *);
|
||||
typedef void (*fn_ppdClose)(ppd_file_t *);
|
||||
typedef ppd_option_t* (*fn_ppdFindOption)(ppd_file_t *, const char *);
|
||||
@ -53,6 +57,9 @@ fn_ippPort j2d_ippPort;
|
||||
fn_httpConnect j2d_httpConnect;
|
||||
fn_httpClose j2d_httpClose;
|
||||
fn_cupsGetPPD j2d_cupsGetPPD;
|
||||
fn_cupsGetDest j2d_cupsGetDest;
|
||||
fn_cupsGetDests j2d_cupsGetDests;
|
||||
fn_cupsFreeDests j2d_cupsFreeDests;
|
||||
fn_ppdOpenFile j2d_ppdOpenFile;
|
||||
fn_ppdClose j2d_ppdClose;
|
||||
fn_ppdFindOption j2d_ppdFindOption;
|
||||
@ -106,6 +113,24 @@ Java_sun_print_CUPSPrinter_initIDs(JNIEnv *env,
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
j2d_cupsGetDest = (fn_cupsGetDest)dlsym(handle, "cupsGetDest");
|
||||
if (j2d_cupsGetDest == NULL) {
|
||||
dlclose(handle);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
j2d_cupsGetDests = (fn_cupsGetDests)dlsym(handle, "cupsGetDests");
|
||||
if (j2d_cupsGetDests == NULL) {
|
||||
dlclose(handle);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
j2d_cupsFreeDests = (fn_cupsFreeDests)dlsym(handle, "cupsFreeDests");
|
||||
if (j2d_cupsFreeDests == NULL) {
|
||||
dlclose(handle);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
j2d_ppdOpenFile = (fn_ppdOpenFile)dlsym(handle, "ppdOpenFile");
|
||||
if (j2d_ppdOpenFile == NULL) {
|
||||
dlclose(handle);
|
||||
@ -169,6 +194,30 @@ Java_sun_print_CUPSPrinter_getCupsPort(JNIEnv *env,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets CUPS default printer name.
|
||||
*
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_sun_print_CUPSPrinter_getCupsDefaultPrinter(JNIEnv *env,
|
||||
jobject printObj)
|
||||
{
|
||||
jstring cDefPrinter = NULL;
|
||||
cups_dest_t *dests;
|
||||
char *defaultPrinter = NULL;
|
||||
int num_dests = j2d_cupsGetDests(&dests);
|
||||
int i = 0;
|
||||
cups_dest_t *dest = j2d_cupsGetDest(NULL, NULL, num_dests, dests);
|
||||
if (dest != NULL) {
|
||||
defaultPrinter = dest->name;
|
||||
if (defaultPrinter != NULL) {
|
||||
cDefPrinter = JNU_NewStringPlatform(env, defaultPrinter);
|
||||
}
|
||||
}
|
||||
j2d_cupsFreeDests(num_dests, dests);
|
||||
return cDefPrinter;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if connection can be made to the server.
|
||||
*
|
||||
|
@ -500,6 +500,7 @@ class D3DRTTSurfaceToSurfaceTransform extends TransformBlit {
|
||||
class D3DSurfaceToSwBlit extends Blit {
|
||||
|
||||
private int typeval;
|
||||
private WeakReference<SurfaceData> srcTmp;
|
||||
|
||||
// REMIND: destination will actually be opaque/premultiplied...
|
||||
D3DSurfaceToSwBlit(SurfaceType dstType, int typeval) {
|
||||
@ -509,11 +510,97 @@ class D3DSurfaceToSwBlit extends Blit {
|
||||
this.typeval = typeval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clip value is ignored in D3D SurfaceToSw blit.
|
||||
* Root Cause: The native interfaces to D3D use StretchRect API followed
|
||||
* by custom copy of pixels from Surface to Sysmem. As a result, clipping
|
||||
* in D3DSurfaceToSw works 'only' for Rect clips, provided, proper srcX,
|
||||
* srcY, dstX, dstY, width and height are passed to native interfaces.
|
||||
* Non rect clips (For example: Shape clips) are ignored completely.
|
||||
*
|
||||
* Solution: There are three solutions possible to fix this issue.
|
||||
* 1. Convert the entire Surface to Sysmem and perform regular Blit.
|
||||
* An optimized version of this is to take up the conversion only
|
||||
* when Shape clips are needed. Existing native interface will suffice
|
||||
* for supporting Rect clips.
|
||||
* 2. With help of existing classes we could perform SwToSurface,
|
||||
* SurfaceToSurface (implements clip) and SurfaceToSw (complete copy)
|
||||
* in order.
|
||||
* 3. Modify the native D3D interface to accept clip and perform same logic
|
||||
* as the second approach but at native side.
|
||||
*
|
||||
* Upon multiple experiments, the first approach has been found to be
|
||||
* faster than the others as it deploys 1-draw/copy operation for rect clip
|
||||
* and 2-draw/copy operations for shape clip compared to 3-draws/copy
|
||||
* operations deployed by the remaining approaches.
|
||||
*
|
||||
* complexClipBlit method helps to convert or copy the contents from
|
||||
* D3DSurface onto Sysmem and perform a regular Blit with the clip
|
||||
* information as required. This method is used when non-rectangular
|
||||
* clip is needed.
|
||||
*/
|
||||
private synchronized void complexClipBlit(SurfaceData src, SurfaceData dst,
|
||||
Composite comp, Region clip,
|
||||
int sx, int sy, int dx, int dy,
|
||||
int w, int h) {
|
||||
SurfaceData cachedSrc = null;
|
||||
if (srcTmp != null) {
|
||||
// use cached intermediate surface, if available
|
||||
cachedSrc = srcTmp.get();
|
||||
}
|
||||
|
||||
// Type- indicates the pixel format of Sysmem based BufferedImage.
|
||||
// Native d3d interfaces support on the fly conversion of pixels from
|
||||
// d3d surface to destination sysmem memory of type IntARGB only.
|
||||
final int type = BufferedImage.TYPE_INT_ARGB;
|
||||
src = convertFrom(this, src, sx, sy, w, h, cachedSrc, type);
|
||||
|
||||
// copy intermediate SW to destination SW using complex clip
|
||||
final Blit performop = Blit.getFromCache(src.getSurfaceType(),
|
||||
CompositeType.SrcNoEa,
|
||||
dst.getSurfaceType());
|
||||
performop.Blit(src, dst, comp, clip, 0, 0, dx, dy, w, h);
|
||||
|
||||
if (src != cachedSrc) {
|
||||
// cache the intermediate surface
|
||||
srcTmp = new WeakReference<>(src);
|
||||
}
|
||||
}
|
||||
|
||||
public void Blit(SurfaceData src, SurfaceData dst,
|
||||
Composite comp, Region clip,
|
||||
int sx, int sy, int dx, int dy,
|
||||
int w, int h)
|
||||
{
|
||||
if (clip != null) {
|
||||
clip = clip.getIntersectionXYWH(dx, dy, w, h);
|
||||
// At the end this method will flush the RenderQueue, we should exit
|
||||
// from it as soon as possible.
|
||||
if (clip.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Adjust final dst(x,y) and src(x,y) based on the clip. The
|
||||
// logic is that, when clip limits drawing on the destination,
|
||||
// corresponding pixels from the src should be skipped.
|
||||
sx += clip.getLoX() - dx;
|
||||
sy += clip.getLoY() - dy;
|
||||
dx = clip.getLoX();
|
||||
dy = clip.getLoY();
|
||||
w = clip.getWidth();
|
||||
h = clip.getHeight();
|
||||
|
||||
// Check if the clip is Rectangular. For non-rectangular clips
|
||||
// complexClipBlit will convert Surface To Sysmem and perform
|
||||
// regular Blit.
|
||||
if (!clip.isRectangular()) {
|
||||
complexClipBlit(src, dst, comp, clip,
|
||||
sx, sy, dx, dy,
|
||||
w, h);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
D3DRenderQueue rq = D3DRenderQueue.getInstance();
|
||||
rq.lock();
|
||||
try {
|
||||
|
@ -32,6 +32,7 @@ import java.util.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import java.security.AccessControlException;
|
||||
// Do not import Swing classes. This module is intended to work
|
||||
// with both Swing and AWT.
|
||||
// import javax.swing.*;
|
||||
@ -77,7 +78,7 @@ public class Translator extends AccessibleContext
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
t = Class.forName("com.sun.java.accessibility.util.internal"
|
||||
t = Class.forName("com.sun.java.accessibility.util.internal."
|
||||
+ c.getSimpleName()
|
||||
+ "Translator");
|
||||
return t;
|
||||
@ -105,6 +106,10 @@ public class Translator extends AccessibleContext
|
||||
if (o instanceof Accessible) {
|
||||
a = (Accessible)o;
|
||||
} else {
|
||||
// About to "newInstance" an object of a class of a restricted package
|
||||
// so ensure the caller is allowed access to that package.
|
||||
String pkg = "com.sun.java.accessibility.util.internal";
|
||||
System.getSecurityManager().checkPackageAccess(pkg);
|
||||
Class<?> translatorClass = getTranslatorClass(o.getClass());
|
||||
if (translatorClass != null) {
|
||||
try {
|
||||
|
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 8025001
|
||||
@summary Tests java.awt.ContainerOrderFocusTraversalPolicy functionality.
|
||||
@run main ContainerOrderFTPTest
|
||||
*/
|
||||
|
||||
import java.awt.Frame;
|
||||
import java.awt.Button;
|
||||
import java.awt.Component;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.ContainerOrderFocusTraversalPolicy;
|
||||
|
||||
public class ContainerOrderFTPTest {
|
||||
|
||||
private final ContainerOrderFocusTraversalPolicy coftp;
|
||||
private final Frame frame;
|
||||
private final Button b1;
|
||||
private final Button b2;
|
||||
private final String expectedTraversal;
|
||||
|
||||
public ContainerOrderFTPTest() {
|
||||
expectedTraversal = "B1B2F1";
|
||||
b1 = new Button("B1");
|
||||
b2 = new Button("B2");
|
||||
frame = new Frame("F1");
|
||||
|
||||
frame.setLayout(new FlowLayout());
|
||||
frame.setSize(200, 200);
|
||||
coftp = new ContainerOrderFocusTraversalPolicy();
|
||||
frame.setFocusTraversalPolicy(coftp);
|
||||
frame.add(b1);
|
||||
frame.add(b2);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
ContainerOrderFTPTest test = new ContainerOrderFTPTest();
|
||||
test.performTest();
|
||||
test.dispose();
|
||||
}
|
||||
|
||||
public void performTest() {
|
||||
int count = 0;
|
||||
Component comp = coftp.getFirstComponent(frame);
|
||||
String traversal = "";
|
||||
do {
|
||||
comp = coftp.getComponentAfter(frame, comp);
|
||||
if (comp instanceof Button) {
|
||||
traversal += ((Button)comp).getLabel();
|
||||
} else if (comp instanceof Frame) {
|
||||
traversal += ((Frame)comp).getTitle();
|
||||
}
|
||||
count++;
|
||||
} while(count < 3);
|
||||
|
||||
if (!expectedTraversal.equals(traversal)) {
|
||||
dispose();
|
||||
throw new RuntimeException("Incorrect Traversal. Expected : "
|
||||
+ expectedTraversal + "Actual : " + traversal);
|
||||
}
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
frame.dispose();
|
||||
}
|
||||
}
|
@ -42,11 +42,11 @@ import static java.awt.geom.Rectangle2D.Double;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8041644
|
||||
* @bug 8041644 8044788
|
||||
* @summary Tests drawing volatile image to BI using different clip.
|
||||
* Results of the blit compatibleImage to BI used for comparison.
|
||||
* @author Sergey Bylokhov
|
||||
* @run main/othervm -Dsun.java2d.d3d=false IncorrectClipSurface2SW
|
||||
* @run main/othervm IncorrectClipSurface2SW
|
||||
*/
|
||||
public final class IncorrectClipSurface2SW {
|
||||
|
||||
|
@ -0,0 +1,185 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8150258
|
||||
* @author a.stepanov
|
||||
* @summary Check that correct resolution variants are chosen for menu icons
|
||||
* when multiresolution image is used for their construction.
|
||||
*
|
||||
* @library ../../../../lib/testlibrary/
|
||||
* @build ExtendedRobot
|
||||
* @run main/othervm -Dsun.java2d.uiScale=1 MenuMultiresolutionIconTest
|
||||
* @run main/othervm -Dsun.java2d.uiScale=2 MenuMultiresolutionIconTest
|
||||
*/
|
||||
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import javax.swing.*;
|
||||
|
||||
public class MenuMultiresolutionIconTest extends JPanel {
|
||||
|
||||
private final static int DELAY = 1000;
|
||||
private final static int SZ = 50;
|
||||
private final static String SCALE = "sun.java2d.uiScale";
|
||||
private final static Color C1X = Color.RED, C2X = Color.BLUE;
|
||||
private final ExtendedRobot r;
|
||||
|
||||
private static BufferedImage generateImage(int scale, Color c) {
|
||||
|
||||
int x = SZ * scale;
|
||||
BufferedImage img = new BufferedImage(x, x, BufferedImage.TYPE_INT_RGB);
|
||||
Graphics g = img.getGraphics();
|
||||
g.setColor(c);
|
||||
g.fillRect(0, 0, x, x);
|
||||
return img;
|
||||
}
|
||||
|
||||
private static BaseMultiResolutionImage createIcon() {
|
||||
|
||||
return new BaseMultiResolutionImage(new BufferedImage[] {
|
||||
generateImage(1, C1X), generateImage(2, C2X)});
|
||||
}
|
||||
|
||||
private JFrame frame;
|
||||
private JPopupMenu popup;
|
||||
private JMenuItem popupItem;
|
||||
private JMenu menu;
|
||||
|
||||
public MenuMultiresolutionIconTest() throws Exception {
|
||||
|
||||
r = new ExtendedRobot();
|
||||
SwingUtilities.invokeAndWait(this::createUI);
|
||||
}
|
||||
|
||||
private void createUI() {
|
||||
|
||||
ImageIcon ii = new ImageIcon(createIcon());
|
||||
|
||||
popup = new JPopupMenu();
|
||||
popupItem = new JMenuItem("test", ii);
|
||||
popup.add(popupItem);
|
||||
popupItem.setHorizontalTextPosition(JMenuItem.RIGHT);
|
||||
addMouseListener(new MousePopupListener());
|
||||
|
||||
frame = new JFrame();
|
||||
JMenuBar menuBar = new JMenuBar();
|
||||
menu = new JMenu("test");
|
||||
menuBar.add(menu);
|
||||
menu.add(new JMenuItem("test", ii));
|
||||
menu.add(new JRadioButtonMenuItem("test", ii, true));
|
||||
menu.add(new JCheckBoxMenuItem("test", ii, true));
|
||||
|
||||
frame.setJMenuBar(menuBar);
|
||||
frame.setContentPane(this);
|
||||
frame.setSize(300, 300);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
private class MousePopupListener extends MouseAdapter {
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) { showPopup(e); }
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) { showPopup(e); }
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) { showPopup(e); }
|
||||
|
||||
private void showPopup(MouseEvent e) {
|
||||
if (e.isPopupTrigger()) {
|
||||
popup.show(MenuMultiresolutionIconTest.this, e.getX(), e.getY());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean is2x() {
|
||||
|
||||
return GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getDefaultScreenDevice().getDefaultConfiguration().
|
||||
getDefaultTransform().getScaleX() > 1.001;
|
||||
}
|
||||
|
||||
private boolean eqColors(Color c1, Color c2) {
|
||||
|
||||
int tol = 15;
|
||||
return (
|
||||
Math.abs(c2.getRed() - c1.getRed() ) < tol &&
|
||||
Math.abs(c2.getGreen() - c1.getGreen()) < tol &&
|
||||
Math.abs(c2.getBlue() - c1.getBlue() ) < tol);
|
||||
}
|
||||
|
||||
private void checkIconColor(Point p, String what) {
|
||||
|
||||
Color expected = is2x() ? C2X : C1X;
|
||||
Color c = r.getPixelColor(p.x + SZ / 2, p.y + SZ / 2);
|
||||
if (!eqColors(c, expected)) {
|
||||
frame.dispose();
|
||||
throw new RuntimeException("invalid " + what + "menu item icon " +
|
||||
"color, expected: " + expected + ", got: " + c);
|
||||
}
|
||||
System.out.println(what + "item icon check passed");
|
||||
}
|
||||
|
||||
private void doTest() {
|
||||
|
||||
r.waitForIdle(2 * DELAY);
|
||||
|
||||
Point p = getLocationOnScreen();
|
||||
r.mouseMove(p.x + getWidth() / 4, p.y + getHeight() / 4);
|
||||
r.waitForIdle(DELAY);
|
||||
r.click(InputEvent.BUTTON3_DOWN_MASK);
|
||||
r.waitForIdle(DELAY);
|
||||
p = popupItem.getLocationOnScreen();
|
||||
checkIconColor(p, "popup ");
|
||||
r.waitForIdle(DELAY);
|
||||
|
||||
p = menu.getLocationOnScreen();
|
||||
r.mouseMove(p.x + menu.getWidth() / 2, p.y + menu.getHeight() / 2);
|
||||
r.waitForIdle(DELAY);
|
||||
r.click();
|
||||
p = menu.getItem(0).getLocationOnScreen();
|
||||
checkIconColor(p, "");
|
||||
r.waitForIdle(DELAY);
|
||||
|
||||
p = menu.getItem(1).getLocationOnScreen();
|
||||
checkIconColor(p, "radiobutton ");
|
||||
r.waitForIdle(DELAY);
|
||||
|
||||
p = menu.getItem(2).getLocationOnScreen();
|
||||
checkIconColor(p, "checkbox ");
|
||||
r.waitForIdle(DELAY);
|
||||
|
||||
frame.dispose();
|
||||
}
|
||||
|
||||
public static void main(String s[]) throws Exception {
|
||||
|
||||
// TODO: remove is2x() after JDK-8150844 fix
|
||||
if (is2x() == "2".equals(System.getProperty(SCALE))) {
|
||||
(new MenuMultiresolutionIconTest()).doTest();
|
||||
}
|
||||
}
|
||||
}
|
41
jdk/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.html
Normal file
41
jdk/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.html
Normal file
@ -0,0 +1,41 @@
|
||||
<!--
|
||||
Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title> MultiResolutionTrayIconTest </title>
|
||||
</head>
|
||||
<body>
|
||||
<applet code="MultiResolutionTrayIconTest.class" width=100 height=30></applet>
|
||||
|
||||
To run test please push "Start" (if system tray is not supported, push "Pass").
|
||||
|
||||
Two tray icons will appear (note: sometimes they can go to the tray icons pool).
|
||||
|
||||
Please check if both of them have correct size and
|
||||
the same colouring (white rectagle in a blue mount). In this case please push "Pass".
|
||||
|
||||
Otherwise (if the 2nd red-white small icon appears) please push "Fail".
|
||||
|
||||
</body>
|
||||
</html>
|
116
jdk/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.java
Normal file
116
jdk/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.java
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 8150176
|
||||
@ignore 8150176
|
||||
@summary Check if correct resolution variant is used for tray icon.
|
||||
@author a.stepanov
|
||||
@run applet/manual=yesno MultiResolutionTrayIconTest.html
|
||||
*/
|
||||
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
|
||||
public class MultiResolutionTrayIconTest extends Applet {
|
||||
|
||||
private SystemTray tray;
|
||||
private TrayIcon icon, iconMRI;
|
||||
|
||||
public void init() { this.setLayout(new BorderLayout()); }
|
||||
|
||||
public void start() {
|
||||
|
||||
boolean trayIsSupported = SystemTray.isSupported();
|
||||
Button b = new Button("Start");
|
||||
if (trayIsSupported) {
|
||||
|
||||
prepareIcons();
|
||||
b.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) { doTest(); }
|
||||
});
|
||||
} else {
|
||||
b.setLabel("not supported");
|
||||
b.setEnabled(false);
|
||||
System.out.println("system tray is not supported");
|
||||
}
|
||||
add(b, BorderLayout.CENTER);
|
||||
|
||||
validate();
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
private BufferedImage generateImage(int w, int h, Color c) {
|
||||
|
||||
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
|
||||
Graphics g = img.getGraphics();
|
||||
g.setColor(c);
|
||||
g.fillRect(0, 0, w, h);
|
||||
g.setColor(Color.WHITE);
|
||||
int r = (Math.min(w, h) >= 8) ? 3 : 1;
|
||||
g.fillRect(r, r, w - 2 * r, h - 2 * r);
|
||||
return img;
|
||||
}
|
||||
|
||||
private void prepareIcons() {
|
||||
|
||||
tray = SystemTray.getSystemTray();
|
||||
Dimension d = tray.getTrayIconSize();
|
||||
int w = d.width, h = d.height;
|
||||
|
||||
BufferedImage img = generateImage(w, h, Color.BLUE);
|
||||
// use wrong icon size for "nok"
|
||||
BufferedImage nok = generateImage(w / 2 + 2, h / 2 + 2, Color.RED);
|
||||
BaseMultiResolutionImage mri =
|
||||
new BaseMultiResolutionImage(new BufferedImage[] {nok, img});
|
||||
icon = new TrayIcon(img);
|
||||
iconMRI = new TrayIcon(mri);
|
||||
}
|
||||
|
||||
private void doTest() {
|
||||
|
||||
if (tray.getTrayIcons().length > 0) { return; } // icons were added already
|
||||
try {
|
||||
tray.add(icon);
|
||||
tray.add(iconMRI);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
|
||||
// check for null, just in case
|
||||
if (tray != null) {
|
||||
tray.remove(icon);
|
||||
tray.remove(iconMRI);
|
||||
}
|
||||
}
|
||||
}
|
125
jdk/test/java/awt/print/PrinterJob/MultiMonPrintDlgTest.java
Normal file
125
jdk/test/java/awt/print/PrinterJob/MultiMonPrintDlgTest.java
Normal file
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
import java.awt.Button;
|
||||
import java.awt.Component;
|
||||
import java.awt.Frame;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8138749
|
||||
* @summary PrinterJob.printDialog() does not support multi-mon,
|
||||
* always displayed on primary
|
||||
* @run main/manual MultiMonPrintDlgTest
|
||||
*/
|
||||
public class MultiMonPrintDlgTest implements ActionListener {
|
||||
|
||||
Frame primaryFrame = null;
|
||||
Frame secFrame = null;
|
||||
GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment().
|
||||
getScreenDevices();
|
||||
|
||||
public MultiMonPrintDlgTest() throws Exception {
|
||||
if (gd.length <= 1) {
|
||||
System.out.println("This test should be run only on dual-monitor systems. Aborted!!");
|
||||
return;
|
||||
}
|
||||
|
||||
String[] instructions =
|
||||
{
|
||||
" This test should be running on a dual-monitor setup.",
|
||||
"A frame will be created on each of the 2 monitor. ",
|
||||
"Click the Print button on the frame displayed in the non-default monitor.",
|
||||
"Please verify that page dialog followed by print dialog ",
|
||||
" is displayed in the same screen",
|
||||
"where the frame is located ie, in the non-default monitor.",
|
||||
};
|
||||
|
||||
SwingUtilities.invokeAndWait(() -> {
|
||||
JOptionPane.showMessageDialog(
|
||||
(Component) null,
|
||||
instructions,
|
||||
"information", JOptionPane.INFORMATION_MESSAGE);
|
||||
});
|
||||
GraphicsDevice defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
|
||||
int x = 0;
|
||||
Frame f = null;
|
||||
for (x = 0; x < gd.length; x ++) {
|
||||
if (gd[x] != defDev) {
|
||||
secFrame = new Frame("Screen " + x + " - secondary", gd[x].getDefaultConfiguration());
|
||||
f = secFrame;
|
||||
} else {
|
||||
primaryFrame = new Frame("Screen " + x + " - primary", gd[x].getDefaultConfiguration());
|
||||
f = primaryFrame;
|
||||
}
|
||||
Button b = new Button("Print");
|
||||
b.addActionListener(this);
|
||||
f.add("South", b);
|
||||
f.addWindowListener (new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent we) {
|
||||
((Window) we.getSource()).dispose();
|
||||
}
|
||||
});
|
||||
f.setSize(200, 200);
|
||||
f.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void actionPerformed (ActionEvent ae) {
|
||||
try {
|
||||
javax.print.attribute.PrintRequestAttributeSet prSet =
|
||||
new javax.print.attribute.HashPrintRequestAttributeSet();
|
||||
java.awt.print.PrinterJob.getPrinterJob().pageDialog(prSet);
|
||||
Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
|
||||
int dialogButton = JOptionPane.showConfirmDialog (w,
|
||||
"Did the pageDialog shown in non-default monitor?",
|
||||
null, JOptionPane.YES_NO_OPTION);
|
||||
if(dialogButton == JOptionPane.NO_OPTION) {
|
||||
throw new RuntimeException("PageDialog is shown in wrong monitor");
|
||||
}
|
||||
java.awt.print.PrinterJob.getPrinterJob().printDialog(prSet);
|
||||
dialogButton = JOptionPane.showConfirmDialog (w,
|
||||
"Did the printDialog shown in non-default monitor?",
|
||||
null, JOptionPane.YES_NO_OPTION);
|
||||
if(dialogButton == JOptionPane.NO_OPTION) {
|
||||
throw new RuntimeException("PrintDialog is shown in wrong monitor");
|
||||
}
|
||||
} finally {
|
||||
primaryFrame.dispose();
|
||||
secFrame.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main (String args[]) throws Exception {
|
||||
MultiMonPrintDlgTest test = new MultiMonPrintDlgTest();
|
||||
}
|
||||
}
|
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.UnsupportedAudioFileException;
|
||||
import javax.sound.sampled.spi.AudioFileWriter;
|
||||
import javax.sound.sampled.spi.FormatConversionProvider;
|
||||
|
||||
import static java.util.ServiceLoader.load;
|
||||
import static javax.sound.sampled.AudioFileFormat.Type.AIFC;
|
||||
import static javax.sound.sampled.AudioFileFormat.Type.AIFF;
|
||||
import static javax.sound.sampled.AudioFileFormat.Type.AU;
|
||||
import static javax.sound.sampled.AudioFileFormat.Type.SND;
|
||||
import static javax.sound.sampled.AudioFileFormat.Type.WAVE;
|
||||
import static javax.sound.sampled.AudioSystem.NOT_SPECIFIED;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8038139
|
||||
*/
|
||||
public final class FrameLengthAfterConversion {
|
||||
|
||||
/**
|
||||
* We will try to use all formats, in this case all our providers will be
|
||||
* covered by supported/unsupported formats.
|
||||
*/
|
||||
private static final List<AudioFormat> formats = new ArrayList<>(23000);
|
||||
|
||||
private static final AudioFormat.Encoding[] encodings = {
|
||||
AudioFormat.Encoding.ALAW, AudioFormat.Encoding.ULAW,
|
||||
AudioFormat.Encoding.PCM_SIGNED, AudioFormat.Encoding.PCM_UNSIGNED,
|
||||
AudioFormat.Encoding.PCM_FLOAT, new AudioFormat.Encoding("Test")
|
||||
};
|
||||
|
||||
private static final int[] sampleBits = {
|
||||
1, 4, 8, 11, 16, 20, 24, 32
|
||||
};
|
||||
|
||||
private static final int[] channels = {
|
||||
1, 2, 3, 4, 5
|
||||
};
|
||||
|
||||
private static final AudioFileFormat.Type[] types = {
|
||||
WAVE, AU, AIFF, AIFC, SND,
|
||||
new AudioFileFormat.Type("TestName", "TestExt")
|
||||
};
|
||||
|
||||
private static final int FRAME_LENGTH = 10;
|
||||
|
||||
static {
|
||||
for (final int sampleSize : sampleBits) {
|
||||
for (final int channel : channels) {
|
||||
for (final AudioFormat.Encoding enc : encodings) {
|
||||
final int frameSize = ((sampleSize + 7) / 8) * channel;
|
||||
formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
|
||||
frameSize, 44100, true));
|
||||
formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
|
||||
frameSize, 44100, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(final String[] args) {
|
||||
for (final FormatConversionProvider fcp : load(
|
||||
FormatConversionProvider.class)) {
|
||||
System.out.println("fcp = " + fcp);
|
||||
for (final AudioFormat from : formats) {
|
||||
for (final AudioFormat to : formats) {
|
||||
testAfterConversion(fcp, to, getStream(from, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
|
||||
System.out.println("afw = " + afw);
|
||||
for (final AudioFileFormat.Type type : types) {
|
||||
for (final AudioFormat from : formats) {
|
||||
testAfterSaveToStream(afw, type, getStream(from, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
|
||||
System.out.println("afw = " + afw);
|
||||
for (final AudioFileFormat.Type type : types) {
|
||||
for (final AudioFormat from : formats) {
|
||||
testAfterSaveToFile(afw, type, getStream(from, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
|
||||
System.out.println("afw = " + afw);
|
||||
for (final AudioFileFormat.Type type : types) {
|
||||
for (final AudioFormat from : formats) {
|
||||
testAfterSaveToFile(afw, type, getStream(from, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the frame length after the stream was saved/read to/from
|
||||
* stream.
|
||||
*/
|
||||
private static void testAfterSaveToStream(final AudioFileWriter afw,
|
||||
final AudioFileFormat.Type type,
|
||||
final AudioInputStream ais) {
|
||||
try {
|
||||
final ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
afw.write(ais, type, out);
|
||||
final InputStream input = new ByteArrayInputStream(
|
||||
out.toByteArray());
|
||||
validate(AudioSystem.getAudioInputStream(input).getFrameLength());
|
||||
} catch (IllegalArgumentException | UnsupportedAudioFileException
|
||||
| IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the frame length after the stream was saved/read to/from file.
|
||||
*/
|
||||
private static void testAfterSaveToFile(final AudioFileWriter afw,
|
||||
final AudioFileFormat.Type type,
|
||||
AudioInputStream ais) {
|
||||
try {
|
||||
final File temp = File.createTempFile("sound", ".tmp");
|
||||
temp.deleteOnExit();
|
||||
afw.write(ais, type, temp);
|
||||
ais = AudioSystem.getAudioInputStream(temp);
|
||||
final long frameLength = ais.getFrameLength();
|
||||
ais.close();
|
||||
temp.delete();
|
||||
validate(frameLength);
|
||||
} catch (IllegalArgumentException | UnsupportedAudioFileException
|
||||
| IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the frame length after the stream was converted to other
|
||||
* stream.
|
||||
*
|
||||
* @see FormatConversionProvider#getAudioInputStream(AudioFormat,
|
||||
* AudioInputStream)
|
||||
*/
|
||||
private static void testAfterConversion(final FormatConversionProvider fcp,
|
||||
final AudioFormat to,
|
||||
final AudioInputStream ais) {
|
||||
if (fcp.isConversionSupported(to, ais.getFormat())) {
|
||||
validate(fcp.getAudioInputStream(to, ais).getFrameLength());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws an exception if the frameLength is specified and is not equal to
|
||||
* the gold value.
|
||||
*/
|
||||
private static void validate(final long frameLength) {
|
||||
if (frameLength != FRAME_LENGTH) {
|
||||
System.err.println("Expected: " + FRAME_LENGTH);
|
||||
System.err.println("Actual: " + frameLength);
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
private static AudioInputStream getStream(final AudioFormat format,
|
||||
final boolean frameLength) {
|
||||
final int dataSize = FRAME_LENGTH * format.getFrameSize();
|
||||
final InputStream in = new ByteArrayInputStream(new byte[dataSize]);
|
||||
if (frameLength) {
|
||||
return new AudioInputStream(in, format, FRAME_LENGTH);
|
||||
} else {
|
||||
return new AudioInputStream(in, format, NOT_SPECIFIED);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8081722
|
||||
* @summary Provide public API for file hierarchy provided by
|
||||
* sun.awt.shell.ShellFolder
|
||||
* @author Semyon Sadetsky
|
||||
* @run main ShellFolderQueriesTest
|
||||
*/
|
||||
|
||||
import sun.awt.OSInfo;
|
||||
|
||||
import javax.swing.filechooser.FileSystemView;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ShellFolderQueriesTest {
|
||||
static final String HOME = System.getProperty("user.home");
|
||||
static final FileSystemView fsv = FileSystemView.getFileSystemView();
|
||||
|
||||
|
||||
static String scriptBeg =
|
||||
"set WshShell = WScript.CreateObject(\"WScript.Shell\")\n" +
|
||||
"set oShellLink = WshShell.CreateShortcut(\"shortcut.lnk\")\n" +
|
||||
"oShellLink.TargetPath = \"";
|
||||
static String scriptEnd = "\"\noShellLink.WindowStyle = 1\noShellLink.Save";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if(OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
|
||||
testGet();
|
||||
testLink();
|
||||
} else {
|
||||
testGet();
|
||||
}
|
||||
System.out.println("ok");
|
||||
}
|
||||
|
||||
private static void testLink() throws IOException, InterruptedException {
|
||||
// Create and execute VBS script to create a link
|
||||
File file = createVbsScript(scriptBeg + HOME + scriptEnd);
|
||||
Runtime.getRuntime().exec("cscript " + file.getName(), null,
|
||||
file.getParentFile()).waitFor();
|
||||
file.delete();
|
||||
|
||||
File link = new File(file.getParentFile(), "shortcut.lnk");
|
||||
if (!fsv.isLink(link)) {
|
||||
link.delete();
|
||||
throw new RuntimeException("Link is not detected");
|
||||
}
|
||||
|
||||
File location = fsv.getLinkLocation(link);
|
||||
if (!location.getAbsolutePath().equals(HOME)) {
|
||||
link.delete();
|
||||
throw new RuntimeException("Link location " + location +
|
||||
" is wrong");
|
||||
}
|
||||
link.delete();
|
||||
|
||||
|
||||
link = File.createTempFile("test", ".tst");
|
||||
|
||||
if (fsv.isLink(link)) {
|
||||
link.delete();
|
||||
throw new RuntimeException("File is not a link");
|
||||
}
|
||||
|
||||
try {
|
||||
location = fsv.getLinkLocation(link);
|
||||
if (location != null) {
|
||||
link.delete();
|
||||
throw new RuntimeException("Not a link, should return null");
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException e) {
|
||||
}
|
||||
link.delete();
|
||||
}
|
||||
|
||||
private static File createVbsScript(String script) throws IOException {
|
||||
File file = File.createTempFile("test", ".vbs");
|
||||
file.deleteOnExit();
|
||||
FileOutputStream fos = new FileOutputStream(file);
|
||||
fos.write(script.getBytes());
|
||||
fos.close();
|
||||
return file;
|
||||
}
|
||||
|
||||
private static void testGet() {
|
||||
File[] files = fsv.getChooserComboBoxFiles();
|
||||
for (File file : files) {
|
||||
if (fsv.isLink(file)) {
|
||||
throw new RuntimeException(
|
||||
"Link shouldn't be in FileChooser combobox, "
|
||||
+ file.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,275 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 8146321
|
||||
* @summary verifies JInternalFrame Icon and ImageIcon
|
||||
* @library ../../regtesthelpers
|
||||
* @build Util
|
||||
* @run main JInternalFrameIconTest
|
||||
*/
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Robot;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JDesktopPane;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JInternalFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
|
||||
public class JInternalFrameIconTest {
|
||||
|
||||
private static JFrame frame;
|
||||
private static JDesktopPane desktopPane;
|
||||
private static JInternalFrame internalFrame;
|
||||
private static ImageIcon titleImageIcon;
|
||||
private static Icon titleIcon;
|
||||
private static BufferedImage imageIconImage;
|
||||
private static BufferedImage iconImage;
|
||||
|
||||
private static Robot robot;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
robot = new Robot();
|
||||
robot.delay(2000);
|
||||
UIManager.LookAndFeelInfo[] lookAndFeelArray
|
||||
= UIManager.getInstalledLookAndFeels();
|
||||
for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
|
||||
executeCase(lookAndFeelItem.getClassName());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void executeCase(String lookAndFeelString) throws Exception {
|
||||
if (tryLookAndFeel(lookAndFeelString)) {
|
||||
createImageIconUI(lookAndFeelString);
|
||||
robot.delay(1000);
|
||||
getImageIconBufferedImage();
|
||||
robot.waitForIdle();
|
||||
cleanUp();
|
||||
robot.waitForIdle();
|
||||
|
||||
createIconUI(lookAndFeelString);
|
||||
robot.delay(1000);
|
||||
getIconBufferedImage();
|
||||
robot.waitForIdle();
|
||||
cleanUp();
|
||||
robot.waitForIdle();
|
||||
testIfSame();
|
||||
robot.waitForIdle();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void createImageIconUI(final String lookAndFeelString)
|
||||
throws Exception {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
desktopPane = new JDesktopPane();
|
||||
internalFrame = new JInternalFrame();
|
||||
frame = new JFrame();
|
||||
internalFrame.setTitle(lookAndFeelString);
|
||||
titleImageIcon = new ImageIcon() {
|
||||
@Override
|
||||
public int getIconWidth() {
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconHeight() {
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintIcon(
|
||||
Component c, Graphics g, int x, int y) {
|
||||
g.setColor(java.awt.Color.black);
|
||||
g.fillRect(x, y, 16, 16);
|
||||
}
|
||||
};
|
||||
internalFrame.setFrameIcon(titleImageIcon);
|
||||
internalFrame.setSize(500, 200);
|
||||
internalFrame.setVisible(true);
|
||||
desktopPane.add(internalFrame);
|
||||
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.getContentPane().setLayout(new BorderLayout());
|
||||
frame.getContentPane().add(desktopPane, "Center");
|
||||
frame.setSize(500, 500);
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
frame.toFront();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void createIconUI(final String lookAndFeelString)
|
||||
throws Exception {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
desktopPane = new JDesktopPane();
|
||||
internalFrame = new JInternalFrame();
|
||||
frame = new JFrame();
|
||||
internalFrame.setTitle(lookAndFeelString);
|
||||
titleIcon = new Icon() {
|
||||
@Override
|
||||
public int getIconWidth() {
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconHeight() {
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintIcon(
|
||||
Component c, Graphics g, int x, int y) {
|
||||
g.setColor(java.awt.Color.black);
|
||||
g.fillRect(x, y, 16, 16);
|
||||
}
|
||||
};
|
||||
internalFrame.setFrameIcon(titleIcon);
|
||||
internalFrame.setSize(500, 200);
|
||||
internalFrame.setVisible(true);
|
||||
desktopPane.add(internalFrame);
|
||||
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.getContentPane().setLayout(new BorderLayout());
|
||||
frame.getContentPane().add(desktopPane, "Center");
|
||||
frame.setSize(500, 500);
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
frame.toFront();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void getImageIconBufferedImage() throws Exception {
|
||||
Point point = internalFrame.getLocationOnScreen();
|
||||
Rectangle rect = internalFrame.getBounds();
|
||||
Rectangle captureRect = new Rectangle(
|
||||
point.x + internalFrame.getInsets().left,
|
||||
point.y,
|
||||
rect.width,
|
||||
internalFrame.getInsets().top);
|
||||
imageIconImage
|
||||
= robot.createScreenCapture(captureRect);
|
||||
}
|
||||
|
||||
private static void getIconBufferedImage() throws Exception {
|
||||
Point point = internalFrame.getLocationOnScreen();
|
||||
Rectangle rect = internalFrame.getBounds();
|
||||
Rectangle captureRect = new Rectangle(
|
||||
point.x + internalFrame.getInsets().left,
|
||||
point.y,
|
||||
rect.width,
|
||||
internalFrame.getInsets().top);
|
||||
iconImage
|
||||
= robot.createScreenCapture(captureRect);
|
||||
}
|
||||
|
||||
private static void testIfSame() throws Exception {
|
||||
if (!bufferedImagesEqual(imageIconImage, iconImage)) {
|
||||
System.err.println("ERROR: icon and imageIcon not same.");
|
||||
} else {
|
||||
System.out.println("SUCCESS: icon and imageIcon same.");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean bufferedImagesEqual(
|
||||
BufferedImage bufferedImage1, BufferedImage bufferedImage2) {
|
||||
boolean flag = true;
|
||||
|
||||
if (bufferedImage1.getWidth() == bufferedImage2.getWidth()
|
||||
&& bufferedImage1.getHeight() == bufferedImage2.getHeight()) {
|
||||
final int colorTolerance = 25;
|
||||
final int mismatchTolerance = (int) (0.1
|
||||
* bufferedImage1.getWidth() * bufferedImage1.getHeight());
|
||||
int mismatchCounter = 0;
|
||||
for (int x = 0; x < bufferedImage1.getWidth(); x++) {
|
||||
for (int y = 0; y < bufferedImage1.getHeight(); y++) {
|
||||
|
||||
int color1 = bufferedImage1.getRGB(x, y);
|
||||
int red1 = (color1 >> 16) & 0x000000FF;
|
||||
int green1 = (color1 >> 8) & 0x000000FF;
|
||||
int blue1 = (color1) & 0x000000FF;
|
||||
|
||||
int color2 = bufferedImage2.getRGB(x, y);
|
||||
int red2 = (color2 >> 16) & 0x000000FF;
|
||||
int green2 = (color2 >> 8) & 0x000000FF;
|
||||
int blue2 = (color2) & 0x000000FF;
|
||||
if (red1 != red2 || green1 != green2 || blue1 != blue2) {
|
||||
++mismatchCounter;
|
||||
if ((Math.abs(red1 - red2) > colorTolerance)
|
||||
|| (Math.abs(green1 - green2) > colorTolerance)
|
||||
|| (Math.abs(blue1 - blue2) > colorTolerance)) {
|
||||
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mismatchCounter > mismatchTolerance) {
|
||||
flag = false;
|
||||
}
|
||||
} else {
|
||||
System.err.println("ERROR: size is different");
|
||||
flag = false;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
private static void cleanUp() throws Exception {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean tryLookAndFeel(String lookAndFeelString)
|
||||
throws Exception {
|
||||
try {
|
||||
UIManager.setLookAndFeel(
|
||||
lookAndFeelString);
|
||||
|
||||
} catch (UnsupportedLookAndFeelException
|
||||
| ClassNotFoundException
|
||||
| InstantiationException
|
||||
| IllegalAccessException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
301
jdk/test/javax/swing/JInternalFrame/NormalBoundsTest.java
Normal file
301
jdk/test/javax/swing/JInternalFrame/NormalBoundsTest.java
Normal file
@ -0,0 +1,301 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 7126823
|
||||
@summary Verify NormalBounds upon iconify/deiconify sequence
|
||||
@run main NormalBoundsTest
|
||||
*/
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Robot;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.beans.PropertyVetoException;
|
||||
import javax.swing.JDesktopPane;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JInternalFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
public class NormalBoundsTest {
|
||||
|
||||
private static JFrame mainFrame;
|
||||
private static JInternalFrame internalFrame;
|
||||
private static Rectangle bounds;
|
||||
|
||||
private static void createUI(String lookAndFeelString) {
|
||||
internalFrame = new JInternalFrame("Internal", true, true, true, true);
|
||||
internalFrame.setDefaultCloseOperation(
|
||||
WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
internalFrame.setSize(200, 200);
|
||||
|
||||
JDesktopPane desktopPane = new JDesktopPane();
|
||||
desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
|
||||
desktopPane.add(internalFrame);
|
||||
|
||||
mainFrame = new JFrame(lookAndFeelString);
|
||||
mainFrame.setSize(640, 480);
|
||||
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
mainFrame.setContentPane(desktopPane);
|
||||
|
||||
mainFrame.setVisible(true);
|
||||
internalFrame.setVisible(true);
|
||||
|
||||
}
|
||||
|
||||
private static int signWOZero(int i) {
|
||||
return (i > 0) ? 1 : -1;
|
||||
}
|
||||
|
||||
private static void mouseMove(Robot robot, Point startPt, Point endPt) {
|
||||
int dx = endPt.x - startPt.x;
|
||||
int dy = endPt.y - startPt.y;
|
||||
|
||||
int ax = Math.abs(dx) * 2;
|
||||
int ay = Math.abs(dy) * 2;
|
||||
|
||||
int sx = signWOZero(dx);
|
||||
int sy = signWOZero(dy);
|
||||
|
||||
int x = startPt.x;
|
||||
int y = startPt.y;
|
||||
|
||||
int d = 0;
|
||||
|
||||
if (ax > ay) {
|
||||
d = ay - ax / 2;
|
||||
while (true) {
|
||||
robot.mouseMove(x, y);
|
||||
robot.delay(50);
|
||||
|
||||
if (x == endPt.x) {
|
||||
return;
|
||||
}
|
||||
if (d >= 0) {
|
||||
y = y + sy;
|
||||
d = d - ax;
|
||||
}
|
||||
x = x + sx;
|
||||
d = d + ay;
|
||||
}
|
||||
} else {
|
||||
d = ax - ay / 2;
|
||||
while (true) {
|
||||
robot.mouseMove(x, y);
|
||||
robot.delay(50);
|
||||
|
||||
if (y == endPt.y) {
|
||||
return;
|
||||
}
|
||||
if (d >= 0) {
|
||||
x = x + sx;
|
||||
d = d - ay;
|
||||
}
|
||||
y = y + sy;
|
||||
d = d + ax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void drag(Robot r, Point startPt, Point endPt, int button) {
|
||||
if (!(button == InputEvent.BUTTON1_MASK
|
||||
|| button == InputEvent.BUTTON2_MASK
|
||||
|| button == InputEvent.BUTTON3_MASK)) {
|
||||
throw new IllegalArgumentException("invalid mouse button");
|
||||
}
|
||||
|
||||
r.mouseMove(startPt.x, startPt.y);
|
||||
r.mousePress(button);
|
||||
try {
|
||||
mouseMove(r, startPt, endPt);
|
||||
} finally {
|
||||
r.mouseRelease(button);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean tryLookAndFeel(String lookAndFeelString) {
|
||||
try {
|
||||
UIManager.setLookAndFeel(lookAndFeelString);
|
||||
return true;
|
||||
} catch (UnsupportedLookAndFeelException | ClassNotFoundException |
|
||||
InstantiationException | IllegalAccessException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void executeTest(Robot robot) throws Exception {
|
||||
|
||||
// Iconize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setIcon(true);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Iconize InternalFrame Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
// Deiconize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setIcon(false);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Deiconize InternalFrame"
|
||||
+ " Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Point loc = internalFrame.getLocationOnScreen();
|
||||
// Drag Frame
|
||||
drag(robot,
|
||||
new Point((int) loc.x + 80, (int) loc.y + 12),
|
||||
new Point((int) loc.x + 100, (int) loc.y + 40),
|
||||
InputEvent.BUTTON1_MASK);
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
bounds = internalFrame.getBounds();
|
||||
if (!internalFrame.getNormalBounds().equals(bounds)) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Invalid NormalBounds");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
// Regression Test Bug ID: 4424247
|
||||
// Maximize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setMaximum(true);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Maximize InternalFrame Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
// Iconize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setIcon(true);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Iconize InternalFrame Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
// DeIconize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setIcon(false);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("DeIcoize InternalFrame "
|
||||
+ " Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
// Restore/Undo Maximize JInternalFrame
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
internalFrame.setMaximum(false);
|
||||
} catch (PropertyVetoException ex) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Restore InternalFrame "
|
||||
+ " Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!internalFrame.getBounds().equals(bounds)) {
|
||||
mainFrame.dispose();
|
||||
throw new RuntimeException("Regression Test Failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
mainFrame.dispose();
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Robot robot = new Robot();
|
||||
UIManager.LookAndFeelInfo[] lookAndFeelArray
|
||||
= UIManager.getInstalledLookAndFeels();
|
||||
for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
|
||||
String lookAndFeelString = lookAndFeelItem.getClassName();
|
||||
if (tryLookAndFeel(lookAndFeelString)) {
|
||||
// create UI
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
createUI(lookAndFeelString);
|
||||
}
|
||||
});
|
||||
|
||||
robot.waitForIdle();
|
||||
executeTest(robot);
|
||||
} else {
|
||||
throw new RuntimeException("Setting Look and Feel Failed");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -20,6 +20,7 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Point;
|
||||
import java.awt.Robot;
|
||||
@ -29,24 +30,25 @@ import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import jdk.testlibrary.OSInfo;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8033000
|
||||
* @bug 8033000 8147994
|
||||
* @author Alexander Scherbatiy
|
||||
* @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
|
||||
* @library ../../../../lib/testlibrary
|
||||
* @build jdk.testlibrary.OSInfo
|
||||
* @run main bug8033000
|
||||
* @run main HorizontalMouseWheelOnShiftPressed
|
||||
*/
|
||||
public class bug8033000 {
|
||||
public class HorizontalMouseWheelOnShiftPressed {
|
||||
|
||||
private static JScrollPane scrollPane;
|
||||
private static JTextArea textArea;
|
||||
private static Point point;
|
||||
private static final int delta;
|
||||
private static JFrame frame;
|
||||
|
||||
static {
|
||||
delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
|
||||
@ -57,9 +59,17 @@ public class bug8033000 {
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(50);
|
||||
|
||||
SwingUtilities.invokeAndWait(bug8033000::createAndShowGUI);
|
||||
SwingUtilities.invokeAndWait(
|
||||
HorizontalMouseWheelOnShiftPressed::createAndShowGUI);
|
||||
robot.waitForIdle();
|
||||
try {
|
||||
test(robot);
|
||||
} finally {
|
||||
frame.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static void test(Robot robot) throws Exception {
|
||||
SwingUtilities.invokeAndWait(() -> {
|
||||
Point locationOnScreen = scrollPane.getLocationOnScreen();
|
||||
point = new Point(
|
||||
@ -75,7 +85,7 @@ public class bug8033000 {
|
||||
robot.waitForIdle();
|
||||
robot.mouseWheel(delta);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(true);
|
||||
checkScrollPane(true, false);
|
||||
|
||||
// vertical scroll bar is enabled + shift
|
||||
initScrollPane(true, false);
|
||||
@ -84,14 +94,14 @@ public class bug8033000 {
|
||||
robot.mouseWheel(delta);
|
||||
robot.keyRelease(KeyEvent.VK_SHIFT);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(true);
|
||||
checkScrollPane(false, false);
|
||||
|
||||
// horizontal scroll bar is enabled
|
||||
initScrollPane(false, true);
|
||||
robot.waitForIdle();
|
||||
robot.mouseWheel(delta);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(false);
|
||||
checkScrollPane(false, true);
|
||||
|
||||
// horizontal scroll bar is enabled + shift
|
||||
initScrollPane(false, true);
|
||||
@ -100,14 +110,14 @@ public class bug8033000 {
|
||||
robot.mouseWheel(delta);
|
||||
robot.keyRelease(KeyEvent.VK_SHIFT);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(false);
|
||||
checkScrollPane(false, true);
|
||||
|
||||
// both scroll bars are enabled
|
||||
initScrollPane(true, true);
|
||||
robot.waitForIdle();
|
||||
robot.mouseWheel(delta);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(true);
|
||||
checkScrollPane(true, false);
|
||||
|
||||
// both scroll bars are enabled + shift
|
||||
initScrollPane(true, true);
|
||||
@ -116,7 +126,7 @@ public class bug8033000 {
|
||||
robot.mouseWheel(delta);
|
||||
robot.keyRelease(KeyEvent.VK_SHIFT);
|
||||
robot.waitForIdle();
|
||||
checkScrollPane(false);
|
||||
checkScrollPane(false, true);
|
||||
}
|
||||
|
||||
static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
|
||||
@ -131,17 +141,25 @@ public class bug8033000 {
|
||||
});
|
||||
}
|
||||
|
||||
static void checkScrollPane(boolean verticalScrolled) throws Exception {
|
||||
static void checkScrollPane(boolean verticalScrolled,
|
||||
boolean horizontalScrolled) throws Exception {
|
||||
SwingUtilities.invokeAndWait(() -> {
|
||||
|
||||
if (verticalScrolled) {
|
||||
if (scrollPane.getVerticalScrollBar().getValue() == 0
|
||||
|| scrollPane.getHorizontalScrollBar().getValue() != 0) {
|
||||
if (scrollPane.getVerticalScrollBar().getValue() == 0) {
|
||||
throw new RuntimeException("Wrong vertical scrolling!");
|
||||
}
|
||||
} else{
|
||||
if (scrollPane.getVerticalScrollBar().getValue() != 0) {
|
||||
throw new RuntimeException("Wrong vertical scrolling!");
|
||||
}
|
||||
}
|
||||
if (horizontalScrolled) {
|
||||
if (scrollPane.getHorizontalScrollBar().getValue() == 0) {
|
||||
throw new RuntimeException("Wrong horizontal scrolling!");
|
||||
}
|
||||
} else {
|
||||
if (scrollPane.getVerticalScrollBar().getValue() != 0
|
||||
|| scrollPane.getHorizontalScrollBar().getValue() == 0) {
|
||||
if (scrollPane.getHorizontalScrollBar().getValue() != 0) {
|
||||
throw new RuntimeException("Wrong horizontal scrolling!");
|
||||
}
|
||||
}
|
||||
@ -149,9 +167,10 @@ public class bug8033000 {
|
||||
}
|
||||
|
||||
static void createAndShowGUI() {
|
||||
JFrame frame = new JFrame();
|
||||
frame = new JFrame();
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setSize(300, 300);
|
||||
frame.setLocationRelativeTo(null);
|
||||
textArea = new JTextArea("Hello World!");
|
||||
scrollPane = new JScrollPane(textArea);
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.table.JTableHeader;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @summary Tests whether getTableCellRendererComponent() method handles
|
||||
* null table parameter
|
||||
* @bug 8020039
|
||||
* @run main TableHeaderRendererExceptionTest
|
||||
*/
|
||||
public class TableHeaderRendererExceptionTest {
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
//Execute test for all supported look and feels
|
||||
UIManager.LookAndFeelInfo[] lookAndFeelArray
|
||||
= UIManager.getInstalledLookAndFeels();
|
||||
|
||||
for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
|
||||
String lookAndFeelString = lookAndFeelItem.getClassName();
|
||||
|
||||
UIManager.setLookAndFeel(lookAndFeelString);
|
||||
|
||||
// Test getTableCellRendererComponent method by passing null table
|
||||
JTableHeader header = new JTableHeader();
|
||||
|
||||
header.getDefaultRenderer().getTableCellRendererComponent(null,
|
||||
" test ", true, true, -1, 0);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,16 +23,15 @@
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 8056151
|
||||
@bug 8056151 8131751
|
||||
@summary Switching to GTK L&F on-the-fly leads to X Window System error RenderBadPicture
|
||||
@run main/othervm -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel -Dsun.java2d.xrender=T RenderBadPictureCrash
|
||||
*/
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
public class RenderBadPictureCrash {
|
||||
@ -41,7 +40,10 @@ public class RenderBadPictureCrash {
|
||||
SwingUtilities.invokeAndWait(() -> {
|
||||
JFrame f = new JFrame();
|
||||
f.setUndecorated(true);
|
||||
f.setBackground(new Color(0, 0, 0, 0));
|
||||
GraphicsDevice gd = f.getGraphicsConfiguration().getDevice();
|
||||
if (gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
|
||||
f.setBackground(new Color(0, 0, 0, 0));
|
||||
}
|
||||
f.setSize(200, 300);
|
||||
f.setVisible(true);
|
||||
|
||||
|
143
jdk/test/sun/java2d/marlin/CrashNaNTest.java
Normal file
143
jdk/test/sun/java2d/marlin/CrashNaNTest.java
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.geom.Path2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import static java.lang.Double.NaN;
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Handler;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8149338
|
||||
* @summary Verifies that Marlin supports NaN coordinates and no JVM crash happens !
|
||||
* @run main CrashNaNTest
|
||||
*/
|
||||
public class CrashNaNTest {
|
||||
|
||||
static final boolean SAVE_IMAGE = false;
|
||||
|
||||
public static void main(String argv[]) {
|
||||
Locale.setDefault(Locale.US);
|
||||
|
||||
// initialize j.u.l Looger:
|
||||
final Logger log = Logger.getLogger("sun.java2d.marlin");
|
||||
log.addHandler(new Handler() {
|
||||
@Override
|
||||
public void publish(LogRecord record) {
|
||||
Throwable th = record.getThrown();
|
||||
// detect any Throwable:
|
||||
if (th != null) {
|
||||
System.out.println("Test failed:\n" + record.getMessage());
|
||||
th.printStackTrace(System.out);
|
||||
|
||||
throw new RuntimeException("Test failed: ", th);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws SecurityException {
|
||||
}
|
||||
});
|
||||
|
||||
// enable Marlin logging & internal checks:
|
||||
System.setProperty("sun.java2d.renderer.log", "true");
|
||||
System.setProperty("sun.java2d.renderer.useLogger", "true");
|
||||
System.setProperty("sun.java2d.renderer.doChecks", "true");
|
||||
|
||||
final int width = 400;
|
||||
final int height = 400;
|
||||
|
||||
final BufferedImage image = new BufferedImage(width, height,
|
||||
BufferedImage.TYPE_INT_ARGB);
|
||||
|
||||
final Graphics2D g2d = (Graphics2D) image.getGraphics();
|
||||
try {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
||||
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
g2d.setBackground(Color.WHITE);
|
||||
g2d.clearRect(0, 0, width, height);
|
||||
|
||||
final Path2D.Double path = new Path2D.Double();
|
||||
path.moveTo(30, 30);
|
||||
path.lineTo(100, 100);
|
||||
|
||||
for (int i = 0; i < 20000; i++) {
|
||||
path.lineTo(110 + 0.01 * i, 110);
|
||||
path.lineTo(111 + 0.01 * i, 100);
|
||||
}
|
||||
|
||||
path.lineTo(NaN, 200);
|
||||
path.lineTo(200, 200);
|
||||
path.lineTo(200, NaN);
|
||||
path.lineTo(300, 300);
|
||||
path.lineTo(NaN, NaN);
|
||||
path.lineTo(100, 100);
|
||||
path.closePath();
|
||||
|
||||
final Path2D.Double path2 = new Path2D.Double();
|
||||
path2.moveTo(0,0);
|
||||
path2.lineTo(width,height);
|
||||
path2.lineTo(10, 10);
|
||||
path2.closePath();
|
||||
|
||||
for (int i = 0; i < 1; i++) {
|
||||
final long start = System.nanoTime();
|
||||
g2d.setColor(Color.BLUE);
|
||||
g2d.fill(path);
|
||||
|
||||
g2d.fill(path2);
|
||||
|
||||
final long time = System.nanoTime() - start;
|
||||
System.out.println("paint: duration= " + (1e-6 * time) + " ms.");
|
||||
}
|
||||
|
||||
if (SAVE_IMAGE) {
|
||||
try {
|
||||
final File file = new File("CrashNaNTest.png");
|
||||
System.out.println("Writing file: "
|
||||
+ file.getAbsolutePath());
|
||||
ImageIO.write(image, "PNG", file);
|
||||
} catch (IOException ex) {
|
||||
System.out.println("Writing file failure:");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
}
|
205
jdk/test/sun/java2d/marlin/CrashPaintTest.java
Normal file
205
jdk/test/sun/java2d/marlin/CrashPaintTest.java
Normal file
@ -0,0 +1,205 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Paint;
|
||||
import java.awt.PaintContext;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.TexturePaint;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.awt.image.Raster;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Handler;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8148886
|
||||
* @summary Verifies that Marlin supports reentrant operations (ThreadLocal)
|
||||
* like in custom Paint or custom Composite
|
||||
* @run main CrashPaintTest
|
||||
*/
|
||||
public class CrashPaintTest {
|
||||
|
||||
static final boolean SAVE_IMAGE = false;
|
||||
|
||||
public static void main(String argv[]) {
|
||||
Locale.setDefault(Locale.US);
|
||||
|
||||
// initialize j.u.l Looger:
|
||||
final Logger log = Logger.getLogger("sun.java2d.marlin");
|
||||
log.addHandler(new Handler() {
|
||||
@Override
|
||||
public void publish(LogRecord record) {
|
||||
Throwable th = record.getThrown();
|
||||
// detect any Throwable:
|
||||
if (th != null) {
|
||||
System.out.println("Test failed:\n" + record.getMessage());
|
||||
th.printStackTrace(System.out);
|
||||
|
||||
throw new RuntimeException("Test failed: ", th);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws SecurityException {
|
||||
}
|
||||
});
|
||||
|
||||
// enable Marlin logging & internal checks:
|
||||
System.setProperty("sun.java2d.renderer.log", "true");
|
||||
System.setProperty("sun.java2d.renderer.useLogger", "true");
|
||||
System.setProperty("sun.java2d.renderer.doChecks", "true");
|
||||
|
||||
// Force using thread-local storage:
|
||||
System.setProperty("sun.java2d.renderer.useThreadLocal", "true");
|
||||
// Force smaller pixelsize to force using array caches:
|
||||
System.setProperty("sun.java2d.renderer.pixelsize", "256");
|
||||
|
||||
final int width = 300;
|
||||
final int height = 300;
|
||||
|
||||
final BufferedImage image = new BufferedImage(width, height,
|
||||
BufferedImage.TYPE_INT_ARGB);
|
||||
|
||||
final Graphics2D g2d = (Graphics2D) image.getGraphics();
|
||||
try {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
||||
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
g2d.setBackground(Color.WHITE);
|
||||
g2d.clearRect(0, 0, width, height);
|
||||
|
||||
final Ellipse2D.Double ellipse
|
||||
= new Ellipse2D.Double(0, 0, width, height);
|
||||
|
||||
final Paint paint = new CustomPaint(100);
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
final long start = System.nanoTime();
|
||||
g2d.setPaint(paint);
|
||||
g2d.fill(ellipse);
|
||||
|
||||
g2d.setColor(Color.GREEN);
|
||||
g2d.draw(ellipse);
|
||||
|
||||
final long time = System.nanoTime() - start;
|
||||
System.out.println("paint: duration= " + (1e-6 * time) + " ms.");
|
||||
}
|
||||
|
||||
if (SAVE_IMAGE) {
|
||||
try {
|
||||
final File file = new File("CrashPaintTest.png");
|
||||
System.out.println("Writing file: "
|
||||
+ file.getAbsolutePath());
|
||||
ImageIO.write(image, "PNG", file);
|
||||
} catch (IOException ex) {
|
||||
System.out.println("Writing file failure:");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// Check image on few pixels:
|
||||
final Raster raster = image.getData();
|
||||
|
||||
// 170, 175 = blue
|
||||
checkPixel(raster, 170, 175, Color.BLUE.getRGB());
|
||||
// 50, 50 = blue
|
||||
checkPixel(raster, 50, 50, Color.BLUE.getRGB());
|
||||
|
||||
// 190, 110 = pink
|
||||
checkPixel(raster, 190, 110, Color.PINK.getRGB());
|
||||
// 280, 210 = pink
|
||||
checkPixel(raster, 280, 210, Color.PINK.getRGB());
|
||||
|
||||
} finally {
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkPixel(final Raster raster,
|
||||
final int x, final int y,
|
||||
final int expected) {
|
||||
|
||||
final int[] rgb = (int[]) raster.getDataElements(x, y, null);
|
||||
|
||||
if (rgb[0] != expected) {
|
||||
throw new IllegalStateException("bad pixel at (" + x + ", " + y
|
||||
+ ") = " + rgb[0] + " expected: " + expected);
|
||||
}
|
||||
}
|
||||
|
||||
private static class CustomPaint extends TexturePaint {
|
||||
private int size;
|
||||
|
||||
CustomPaint(final int size) {
|
||||
super(new BufferedImage(size, size,
|
||||
BufferedImage.TYPE_INT_ARGB),
|
||||
new Rectangle2D.Double(0, 0, size, size)
|
||||
);
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaintContext createContext(ColorModel cm,
|
||||
Rectangle deviceBounds,
|
||||
Rectangle2D userBounds,
|
||||
AffineTransform at,
|
||||
RenderingHints hints) {
|
||||
|
||||
// Fill bufferedImage using
|
||||
final Graphics2D g2d = (Graphics2D) getImage().getGraphics();
|
||||
try {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
||||
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
g2d.setBackground(Color.PINK);
|
||||
g2d.clearRect(0, 0, size, size);
|
||||
|
||||
g2d.setColor(Color.BLUE);
|
||||
g2d.drawRect(0, 0, size, size);
|
||||
|
||||
g2d.fillOval(size / 10, size / 10,
|
||||
size * 8 / 10, size * 8 / 10);
|
||||
|
||||
} finally {
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
return super.createContext(cm, deviceBounds, userBounds, at, hints);
|
||||
}
|
||||
}
|
||||
}
|
@ -69,24 +69,12 @@ public class TextClipErrorTest {
|
||||
@Override
|
||||
public void publish(LogRecord record) {
|
||||
Throwable th = record.getThrown();
|
||||
// detect potential Throwable thrown by XxxArrayCache.check():
|
||||
if (th != null && th.getClass() == Throwable.class) {
|
||||
StackTraceElement[] stackElements = th.getStackTrace();
|
||||
// detect any Throwable:
|
||||
if (th != null) {
|
||||
System.out.println("Test failed:\n" + record.getMessage());
|
||||
th.printStackTrace(System.out);
|
||||
|
||||
for (int i = 0; i < stackElements.length; i++) {
|
||||
StackTraceElement e = stackElements[i];
|
||||
|
||||
if (e.getClassName().startsWith("sun.java2d.marlin")
|
||||
&& e.getClassName().contains("ArrayCache")
|
||||
&& "check".equals(e.getMethodName()))
|
||||
{
|
||||
System.out.println("Test failed:\n"
|
||||
+ record.getMessage());
|
||||
th.printStackTrace(System.out);
|
||||
|
||||
throw new RuntimeException("Test failed: ", th);
|
||||
}
|
||||
}
|
||||
throw new RuntimeException("Test failed: ", th);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user