Merge
This commit is contained in:
commit
be32b11e5b
@ -233,6 +233,10 @@ public class CPrinterJob extends RasterPrinterJob {
|
||||
|
||||
|
||||
setAttributes(attributes);
|
||||
// throw exception for invalid destination
|
||||
if (destinationAttr != null) {
|
||||
validateDestination(destinationAttr);
|
||||
}
|
||||
|
||||
/* Get the range of pages we are to print. If the
|
||||
* last page to print is unknown, then we print to
|
||||
|
@ -359,7 +359,11 @@ static void javaPrinterJobToNSPrintInfo(JNIEnv* env, jobject srcPrinterJob, jobj
|
||||
static JNF_CLASS_CACHE(jc_Pageable, "java/awt/print/Pageable");
|
||||
static JNF_MEMBER_CACHE(jm_getCopies, sjc_CPrinterJob, "getCopiesInt", "()I");
|
||||
static JNF_MEMBER_CACHE(jm_isCollated, sjc_CPrinterJob, "isCollated", "()Z");
|
||||
static JNF_MEMBER_CACHE(jm_getFromPage, sjc_CPrinterJob, "getFromPageAttrib", "()I");
|
||||
static JNF_MEMBER_CACHE(jm_getToPage, sjc_CPrinterJob, "getToPageAttrib", "()I");
|
||||
static JNF_MEMBER_CACHE(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I");
|
||||
static JNF_MEMBER_CACHE(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I");
|
||||
static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;");
|
||||
|
||||
NSMutableDictionary* printingDictionary = [dst dictionary];
|
||||
|
||||
@ -368,19 +372,35 @@ static void javaPrinterJobToNSPrintInfo(JNIEnv* env, jobject srcPrinterJob, jobj
|
||||
|
||||
jboolean collated = JNFCallBooleanMethod(env, srcPrinterJob, jm_isCollated); // AWT_THREADING Safe (known object)
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:collated ? YES : NO] forKey:NSPrintMustCollate];
|
||||
|
||||
jint jNumPages = JNFCallIntMethod(env, srcPageable, jm_getNumberOfPages); // AWT_THREADING Safe (!appKit)
|
||||
if (jNumPages != java_awt_print_Pageable_UNKNOWN_NUMBER_OF_PAGES)
|
||||
{
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages];
|
||||
jint selectID = JNFCallIntMethod(env, srcPrinterJob, jm_getSelectAttrib);
|
||||
if (selectID ==0) {
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages];
|
||||
} else if (selectID == 2) {
|
||||
// In Mac 10.7, Print ALL is deselected if PrintSelection is YES whether
|
||||
// NSPrintAllPages is YES or NO
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages];
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintSelectionOnly];
|
||||
} else {
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages];
|
||||
}
|
||||
|
||||
[printingDictionary setObject:[NSNumber numberWithInteger:1] forKey:NSPrintFirstPage];
|
||||
[printingDictionary setObject:[NSNumber numberWithInteger:jNumPages] forKey:NSPrintLastPage];
|
||||
jint fromPage = JNFCallIntMethod(env, srcPrinterJob, jm_getFromPage);
|
||||
jint toPage = JNFCallIntMethod(env, srcPrinterJob, jm_getToPage);
|
||||
// setting fromPage and toPage will not be shown in the dialog if printing All pages
|
||||
[printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage];
|
||||
[printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage];
|
||||
}
|
||||
else
|
||||
{
|
||||
[printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages];
|
||||
}
|
||||
jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat);
|
||||
if (page != NULL) {
|
||||
javaPageFormatToNSPrintInfo(env, NULL, page, dst);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -187,15 +187,24 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth(int imageIndex) throws IOException {
|
||||
checkIndex(imageIndex);
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
return width;
|
||||
}
|
||||
|
||||
public int getHeight(int imageIndex) throws IOException {
|
||||
checkIndex(imageIndex);
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
return height;
|
||||
}
|
||||
|
||||
@ -205,7 +214,18 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
}
|
||||
}
|
||||
|
||||
public void readHeader() throws IOException {
|
||||
/**
|
||||
* Process the image header.
|
||||
*
|
||||
* @exception IllegalStateException if source stream is not set.
|
||||
*
|
||||
* @exception IOException if image stream is corrupted.
|
||||
*
|
||||
* @exception IllegalArgumentException if the image stream does not contain
|
||||
* a BMP image, or if a sample model instance to describe the
|
||||
* image can not be created.
|
||||
*/
|
||||
protected void readHeader() throws IOException, IllegalArgumentException {
|
||||
if (gotHeader)
|
||||
return;
|
||||
|
||||
@ -307,6 +327,9 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
case BI_RLE4: // 4-bit RLE compression
|
||||
|
||||
// Read in the palette
|
||||
if (bitmapOffset < (size + 14)) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader7"));
|
||||
}
|
||||
int numberOfEntries = (int)((bitmapOffset-14-size) / 4);
|
||||
int sizeOfPalette = numberOfEntries * 4;
|
||||
palette = new byte[sizeOfPalette];
|
||||
@ -375,7 +398,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
break;
|
||||
default:
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader2"));
|
||||
IIOException(I18N.getString("BMPImageReader2"));
|
||||
}
|
||||
} else if (size == 108 || size == 124) {
|
||||
// Windows 4.x BMP
|
||||
@ -478,7 +501,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
}
|
||||
} else {
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader3"));
|
||||
IIOException(I18N.getString("BMPImageReader3"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -660,7 +683,11 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
public Iterator getImageTypes(int imageIndex)
|
||||
throws IOException {
|
||||
checkIndex(imageIndex);
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
ArrayList list = new ArrayList(1);
|
||||
list.add(new ImageTypeSpecifier(originalColorModel,
|
||||
originalSampleModel));
|
||||
@ -675,7 +702,11 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
throws IOException {
|
||||
checkIndex(imageIndex);
|
||||
if (metadata == null) {
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
}
|
||||
return metadata;
|
||||
}
|
||||
@ -686,7 +717,11 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
|
||||
public boolean isRandomAccessEasy(int imageIndex) throws IOException {
|
||||
checkIndex(imageIndex);
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
return metadata.compression == BI_RGB;
|
||||
}
|
||||
|
||||
@ -705,7 +740,11 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
param = getDefaultReadParam();
|
||||
|
||||
//read header
|
||||
readHeader();
|
||||
try {
|
||||
readHeader();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IIOException(I18N.getString("BMPImageReader6"), e);
|
||||
}
|
||||
|
||||
sourceRegion = new Rectangle(0, 0, 0, 0);
|
||||
destinationRegion = new Rectangle(0, 0, 0, 0);
|
||||
@ -817,7 +856,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
|
||||
default:
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader1"));
|
||||
IIOException(I18N.getString("BMPImageReader1"));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -833,7 +872,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
|
||||
default:
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader1"));
|
||||
IIOException(I18N.getString("BMPImageReader1"));
|
||||
}
|
||||
|
||||
break;
|
||||
@ -874,7 +913,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
|
||||
default:
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader1"));
|
||||
IIOException(I18N.getString("BMPImageReader1"));
|
||||
}
|
||||
|
||||
case VERSION_4_8_BIT:
|
||||
@ -890,7 +929,7 @@ public class BMPImageReader extends ImageReader implements BMPConstants {
|
||||
|
||||
default:
|
||||
throw new
|
||||
RuntimeException(I18N.getString("BMPImageReader1"));
|
||||
IIOException(I18N.getString("BMPImageReader1"));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -21,6 +21,8 @@ BMPImageReader2=Invalid compression specified in BMP stream.
|
||||
BMPImageReader3=New BMP version not implemented yet.
|
||||
BMPImageReader4=No ImageIO-style reader is found for
|
||||
BMPImageReader5=Input has not been set.
|
||||
BMPImageReader6=Unable to read the image header.
|
||||
BMPImageReader7=Invalid bitmap offset.
|
||||
BMPImageWriter0=Output is not an ImageOutputStream.
|
||||
BMPImageWriter1=The image region to be encoded is empty.
|
||||
BMPImageWriter2=Only 1 or 3 band image is encoded.
|
||||
@ -34,7 +36,7 @@ BMPMetadata0=The provided metadata format isn't recognized.
|
||||
BMPMetadata1=Metadata is read-only.
|
||||
|
||||
|
||||
# WBMP plugin properties
|
||||
# WBMP plugin properties
|
||||
WBMPImageReader0=Only one image exists in the stream.
|
||||
WBMPImageReader1=Input has not been set.
|
||||
WBMPImageReader2=Bad WBMP header.
|
||||
|
@ -115,6 +115,8 @@ public class GIFImageReader extends ImageReader {
|
||||
// The current interlace pass, starting with 0.
|
||||
int interlacePass = 0;
|
||||
|
||||
private byte[] fallbackColorTable = null;
|
||||
|
||||
// End per-stream settings
|
||||
|
||||
// Constants used to control interlacing.
|
||||
@ -239,10 +241,22 @@ public class GIFImageReader extends ImageReader {
|
||||
byte[] colorTable;
|
||||
if (imageMetadata.localColorTable != null) {
|
||||
colorTable = imageMetadata.localColorTable;
|
||||
fallbackColorTable = imageMetadata.localColorTable;
|
||||
} else {
|
||||
colorTable = streamMetadata.globalColorTable;
|
||||
}
|
||||
|
||||
if (colorTable == null) {
|
||||
if (fallbackColorTable == null) {
|
||||
this.processWarningOccurred("Use default color table.");
|
||||
|
||||
// no color table, the spec allows to use any palette.
|
||||
fallbackColorTable = getDefaultPalette();
|
||||
}
|
||||
|
||||
colorTable = fallbackColorTable;
|
||||
}
|
||||
|
||||
// Normalize color table length to 2^1, 2^2, 2^4, or 2^8
|
||||
int length = colorTable.length/3;
|
||||
int bits;
|
||||
@ -1036,5 +1050,34 @@ public class GIFImageReader extends ImageReader {
|
||||
streamY = -1;
|
||||
rowsDone = 0;
|
||||
interlacePass = 0;
|
||||
|
||||
fallbackColorTable = null;
|
||||
}
|
||||
|
||||
private static byte[] defaultPalette = null;
|
||||
|
||||
private static synchronized byte[] getDefaultPalette() {
|
||||
if (defaultPalette == null) {
|
||||
BufferedImage img = new BufferedImage(1, 1,
|
||||
BufferedImage.TYPE_BYTE_INDEXED);
|
||||
IndexColorModel icm = (IndexColorModel) img.getColorModel();
|
||||
|
||||
final int size = icm.getMapSize();
|
||||
byte[] r = new byte[size];
|
||||
byte[] g = new byte[size];
|
||||
byte[] b = new byte[size];
|
||||
icm.getReds(r);
|
||||
icm.getGreens(g);
|
||||
icm.getBlues(b);
|
||||
|
||||
defaultPalette = new byte[size * 3];
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
defaultPalette[3 * i + 0] = r[i];
|
||||
defaultPalette[3 * i + 1] = g[i];
|
||||
defaultPalette[3 * i + 2] = b[i];
|
||||
}
|
||||
}
|
||||
return defaultPalette;
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ package com.sun.imageio.plugins.jpeg;
|
||||
import javax.imageio.metadata.IIOInvalidTreeException;
|
||||
import javax.imageio.metadata.IIOMetadataNode;
|
||||
import javax.imageio.stream.ImageOutputStream;
|
||||
import javax.imageio.IIOException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@ -60,6 +61,10 @@ class MarkerSegment implements Cloneable {
|
||||
length = (buffer.buf[buffer.bufPtr++] & 0xff) << 8;
|
||||
length |= buffer.buf[buffer.bufPtr++] & 0xff;
|
||||
length -= 2; // JPEG length includes itself, we don't
|
||||
|
||||
if (length < 0) {
|
||||
throw new IIOException("Invalid segment length: " + length);
|
||||
}
|
||||
buffer.bufAvail -= 3;
|
||||
// Now that we know the true length, ensure that we've got it,
|
||||
// or at least a bufferful if length is too big.
|
||||
|
@ -78,7 +78,7 @@ class SOFMarkerSegment extends MarkerSegment {
|
||||
numLines |= buffer.buf[buffer.bufPtr++] & 0xff;
|
||||
samplesPerLine = (buffer.buf[buffer.bufPtr++] & 0xff) << 8;
|
||||
samplesPerLine |= buffer.buf[buffer.bufPtr++] & 0xff;
|
||||
int numComponents = buffer.buf[buffer.bufPtr++];
|
||||
int numComponents = buffer.buf[buffer.bufPtr++] & 0xff;
|
||||
componentSpecs = new ComponentSpec [numComponents];
|
||||
for (int i = 0; i < numComponents; i++) {
|
||||
componentSpecs[i] = new ComponentSpec(buffer);
|
||||
|
@ -688,6 +688,21 @@ public class PNGImageReader extends ImageReader {
|
||||
loop: while (true) {
|
||||
int chunkLength = stream.readInt();
|
||||
int chunkType = stream.readInt();
|
||||
int chunkCRC;
|
||||
|
||||
// verify the chunk length
|
||||
if (chunkLength < 0) {
|
||||
throw new IIOException("Invalid chunk lenght " + chunkLength);
|
||||
};
|
||||
|
||||
try {
|
||||
stream.mark();
|
||||
stream.seek(stream.getStreamPosition() + chunkLength);
|
||||
chunkCRC = stream.readInt();
|
||||
stream.reset();
|
||||
} catch (IOException e) {
|
||||
throw new IIOException("Invalid chunk length " + chunkLength);
|
||||
}
|
||||
|
||||
switch (chunkType) {
|
||||
case IDAT_TYPE:
|
||||
@ -762,7 +777,11 @@ public class PNGImageReader extends ImageReader {
|
||||
break;
|
||||
}
|
||||
|
||||
int chunkCRC = stream.readInt();
|
||||
// double check whether all chunk data were consumed
|
||||
if (chunkCRC != stream.readInt()) {
|
||||
throw new IIOException("Failed to read a chunk of type " +
|
||||
chunkType);
|
||||
}
|
||||
stream.flushBefore(stream.getStreamPosition());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@ -1277,6 +1296,16 @@ public class PNGImageReader extends ImageReader {
|
||||
is = new BufferedInputStream(is);
|
||||
this.pixelStream = new DataInputStream(is);
|
||||
|
||||
/*
|
||||
* NB: the PNG spec declares that valid range for width
|
||||
* and height is [1, 2^31-1], so here we may fail to allocate
|
||||
* a buffer for destination image due to memory limitation.
|
||||
*
|
||||
* However, the recovery strategy for this case should be
|
||||
* defined on the level of application, so we will not
|
||||
* try to estimate the required amount of the memory and/or
|
||||
* handle OOM in any way.
|
||||
*/
|
||||
theImage = getDestination(param,
|
||||
getImageTypes(0),
|
||||
width,
|
||||
|
@ -167,6 +167,7 @@ public class ComponentSampleModel extends SampleModel
|
||||
for (int i=0; i<numBands; i++) {
|
||||
bankIndices[i] = 0;
|
||||
}
|
||||
verify();
|
||||
}
|
||||
|
||||
|
||||
@ -244,24 +245,53 @@ public class ComponentSampleModel extends SampleModel
|
||||
throw new IllegalArgumentException("Length of bandOffsets must "+
|
||||
"equal length of bankIndices.");
|
||||
}
|
||||
verify();
|
||||
}
|
||||
|
||||
private void verify() {
|
||||
int requiredSize = getBufferSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of the data buffer (in data elements) needed
|
||||
* for a data buffer that matches this ComponentSampleModel.
|
||||
*/
|
||||
private long getBufferSize() {
|
||||
private int getBufferSize() {
|
||||
int maxBandOff=bandOffsets[0];
|
||||
for (int i=1; i<bandOffsets.length; i++)
|
||||
for (int i=1; i<bandOffsets.length; i++) {
|
||||
maxBandOff = Math.max(maxBandOff,bandOffsets[i]);
|
||||
}
|
||||
|
||||
if (maxBandOff < 0 || maxBandOff > (Integer.MAX_VALUE - 1)) {
|
||||
throw new IllegalArgumentException("Invalid band offset");
|
||||
}
|
||||
|
||||
if (pixelStride < 0 || pixelStride > (Integer.MAX_VALUE / width)) {
|
||||
throw new IllegalArgumentException("Invalid pixel stride");
|
||||
}
|
||||
|
||||
if (scanlineStride < 0 || scanlineStride > (Integer.MAX_VALUE / height)) {
|
||||
throw new IllegalArgumentException("Invalid scanline stride");
|
||||
}
|
||||
|
||||
int size = maxBandOff + 1;
|
||||
|
||||
int val = pixelStride * (width - 1);
|
||||
|
||||
if (val > (Integer.MAX_VALUE - size)) {
|
||||
throw new IllegalArgumentException("Invalid pixel stride");
|
||||
}
|
||||
|
||||
size += val;
|
||||
|
||||
val = scanlineStride * (height - 1);
|
||||
|
||||
if (val > (Integer.MAX_VALUE - size)) {
|
||||
throw new IllegalArgumentException("Invalid scan stride");
|
||||
}
|
||||
|
||||
size += val;
|
||||
|
||||
long size = 0;
|
||||
if (maxBandOff >= 0)
|
||||
size += maxBandOff+1;
|
||||
if (pixelStride > 0)
|
||||
size += pixelStride * (width-1);
|
||||
if (scanlineStride > 0)
|
||||
size += scanlineStride*(height-1);
|
||||
return size;
|
||||
}
|
||||
|
||||
@ -409,7 +439,7 @@ public class ComponentSampleModel extends SampleModel
|
||||
public DataBuffer createDataBuffer() {
|
||||
DataBuffer dataBuffer = null;
|
||||
|
||||
int size = (int)getBufferSize();
|
||||
int size = getBufferSize();
|
||||
switch (dataType) {
|
||||
case DataBuffer.TYPE_BYTE:
|
||||
dataBuffer = new DataBufferByte(size, numBanks);
|
||||
|
@ -97,7 +97,7 @@ public class StandardTextSource extends TextSource {
|
||||
throw new IllegalArgumentException("bad frc: null");
|
||||
}
|
||||
|
||||
this.chars = chars;
|
||||
this.chars = chars.clone();
|
||||
this.start = start;
|
||||
this.len = len;
|
||||
this.cstart = cstart;
|
||||
@ -148,7 +148,7 @@ public class StandardTextSource extends TextSource {
|
||||
// TextSource API
|
||||
|
||||
public char[] getChars() {
|
||||
return chars;
|
||||
return chars.clone();
|
||||
}
|
||||
|
||||
public int getStart() {
|
||||
|
@ -32,7 +32,6 @@ package sun.font;
|
||||
import java.awt.Font;
|
||||
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.font.LineMetrics;
|
||||
import java.text.Bidi;
|
||||
|
||||
/**
|
||||
@ -70,7 +69,7 @@ public class TextLabelFactory {
|
||||
Bidi bidi,
|
||||
int flags) {
|
||||
this.frc = frc;
|
||||
this.text = text;
|
||||
this.text = text.clone();
|
||||
this.bidi = bidi;
|
||||
this.flags = flags;
|
||||
this.lineBidi = bidi;
|
||||
@ -82,30 +81,10 @@ public class TextLabelFactory {
|
||||
return frc;
|
||||
}
|
||||
|
||||
public char[] getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public Bidi getParagraphBidi() {
|
||||
return bidi;
|
||||
}
|
||||
|
||||
public Bidi getLineBidi() {
|
||||
return lineBidi;
|
||||
}
|
||||
|
||||
public int getLayoutFlags() {
|
||||
return flags;
|
||||
}
|
||||
|
||||
public int getLineStart() {
|
||||
return lineStart;
|
||||
}
|
||||
|
||||
public int getLineLimit() {
|
||||
return lineLimit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a line context for the factory. Shaping only occurs on this line.
|
||||
* Characters are ordered as they would appear on this line.
|
||||
|
@ -117,6 +117,16 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
/* Stream destination type. */
|
||||
protected static final int STREAM = 2;
|
||||
|
||||
/**
|
||||
* Pageable MAX pages
|
||||
*/
|
||||
protected static final int MAX_UNKNOWN_PAGES = 9999;
|
||||
|
||||
protected static final int PD_ALLPAGES = 0x00000000;
|
||||
protected static final int PD_SELECTION = 0x00000001;
|
||||
protected static final int PD_PAGENUMS = 0x00000002;
|
||||
protected static final int PD_NOSELECTION = 0x00000004;
|
||||
|
||||
/**
|
||||
* Maximum amount of memory in bytes to use for the
|
||||
* buffered image "band". 4Mb is a compromise between
|
||||
@ -800,6 +810,14 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
}
|
||||
}
|
||||
|
||||
protected PageFormat getPageFormatFromAttributes() {
|
||||
if (attributes == null) {
|
||||
return null;
|
||||
}
|
||||
return attributeToPageFormat(getPrintService(), this.attributes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Presents the user a dialog for changing properties of the
|
||||
* print job interactively.
|
||||
@ -1359,34 +1377,7 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
setAttributes(attributes);
|
||||
// throw exception for invalid destination
|
||||
if (destinationAttr != null) {
|
||||
// destinationAttr is null for Destination(new URI(""))
|
||||
// because isAttributeValueSupported returns false in setAttributes
|
||||
|
||||
// Destination(new URI(" ")) throws URISyntaxException
|
||||
File f = new File(destinationAttr);
|
||||
try {
|
||||
// check if this is a new file and if filename chars are valid
|
||||
if (f.createNewFile()) {
|
||||
f.delete();
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
throw new PrinterException("Cannot write to file:"+
|
||||
destinationAttr);
|
||||
} catch (SecurityException se) {
|
||||
//There is already file read/write access so at this point
|
||||
// only delete access is denied. Just ignore it because in
|
||||
// most cases the file created in createNewFile gets overwritten
|
||||
// anyway.
|
||||
}
|
||||
|
||||
File pFile = f.getParentFile();
|
||||
if ((f.exists() &&
|
||||
(!f.isFile() || !f.canWrite())) ||
|
||||
((pFile != null) &&
|
||||
(!pFile.exists() || (pFile.exists() && !pFile.canWrite())))) {
|
||||
throw new PrinterException("Cannot write to file:"+
|
||||
destinationAttr);
|
||||
}
|
||||
validateDestination(destinationAttr);
|
||||
}
|
||||
} else {
|
||||
spoolToService(psvc, attributes);
|
||||
@ -1509,6 +1500,40 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
}
|
||||
}
|
||||
|
||||
protected void validateDestination(String dest) throws PrinterException {
|
||||
if (dest == null) {
|
||||
return;
|
||||
}
|
||||
// dest is null for Destination(new URI(""))
|
||||
// because isAttributeValueSupported returns false in setAttributes
|
||||
|
||||
// Destination(new URI(" ")) throws URISyntaxException
|
||||
File f = new File(dest);
|
||||
try {
|
||||
// check if this is a new file and if filename chars are valid
|
||||
if (f.createNewFile()) {
|
||||
f.delete();
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
throw new PrinterException("Cannot write to file:"+
|
||||
dest);
|
||||
} catch (SecurityException se) {
|
||||
//There is already file read/write access so at this point
|
||||
// only delete access is denied. Just ignore it because in
|
||||
// most cases the file created in createNewFile gets overwritten
|
||||
// anyway.
|
||||
}
|
||||
|
||||
File pFile = f.getParentFile();
|
||||
if ((f.exists() &&
|
||||
(!f.isFile() || !f.canWrite())) ||
|
||||
((pFile != null) &&
|
||||
(!pFile.exists() || (pFile.exists() && !pFile.canWrite())))) {
|
||||
throw new PrinterException("Cannot write to file:"+
|
||||
dest);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* updates a Paper object to reflect the current printer's selected
|
||||
* paper size and imageable area for that paper size.
|
||||
@ -1755,6 +1780,78 @@ public abstract class RasterPrinterJob extends PrinterJob {
|
||||
return mCollate;
|
||||
}
|
||||
|
||||
protected final int getSelectAttrib() {
|
||||
if (attributes != null) {
|
||||
SunPageSelection pages =
|
||||
(SunPageSelection)attributes.get(SunPageSelection.class);
|
||||
if (pages == SunPageSelection.RANGE) {
|
||||
return PD_PAGENUMS;
|
||||
} else if (pages == SunPageSelection.SELECTION) {
|
||||
return PD_SELECTION;
|
||||
} else if (pages == SunPageSelection.ALL) {
|
||||
return PD_ALLPAGES;
|
||||
}
|
||||
}
|
||||
return PD_NOSELECTION;
|
||||
}
|
||||
|
||||
//returns 1-based index for "From" page
|
||||
protected final int getFromPageAttrib() {
|
||||
if (attributes != null) {
|
||||
PageRanges pageRangesAttr =
|
||||
(PageRanges)attributes.get(PageRanges.class);
|
||||
if (pageRangesAttr != null) {
|
||||
int[][] range = pageRangesAttr.getMembers();
|
||||
return range[0][0];
|
||||
}
|
||||
}
|
||||
return getMinPageAttrib();
|
||||
}
|
||||
|
||||
//returns 1-based index for "To" page
|
||||
protected final int getToPageAttrib() {
|
||||
if (attributes != null) {
|
||||
PageRanges pageRangesAttr =
|
||||
(PageRanges)attributes.get(PageRanges.class);
|
||||
if (pageRangesAttr != null) {
|
||||
int[][] range = pageRangesAttr.getMembers();
|
||||
return range[range.length-1][1];
|
||||
}
|
||||
}
|
||||
return getMaxPageAttrib();
|
||||
}
|
||||
|
||||
protected final int getMinPageAttrib() {
|
||||
if (attributes != null) {
|
||||
SunMinMaxPage s =
|
||||
(SunMinMaxPage)attributes.get(SunMinMaxPage.class);
|
||||
if (s != null) {
|
||||
return s.getMin();
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
protected final int getMaxPageAttrib() {
|
||||
if (attributes != null) {
|
||||
SunMinMaxPage s =
|
||||
(SunMinMaxPage)attributes.get(SunMinMaxPage.class);
|
||||
if (s != null) {
|
||||
return s.getMax();
|
||||
}
|
||||
}
|
||||
|
||||
Pageable pageable = getPageable();
|
||||
if (pageable != null) {
|
||||
int numPages = pageable.getNumberOfPages();
|
||||
if (numPages <= Pageable.UNKNOWN_NUMBER_OF_PAGES) {
|
||||
numPages = MAX_UNKNOWN_PAGES;
|
||||
}
|
||||
return ((numPages == 0) ? 1 : numPages);
|
||||
}
|
||||
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
/**
|
||||
* Called by the print() method at the start of
|
||||
* a print job.
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "Trace.h"
|
||||
#include "Disposer.h"
|
||||
#include "lcms2.h"
|
||||
#include "jlong.h"
|
||||
|
||||
|
||||
#define ALIGNLONG(x) (((x)+3) & ~(3)) // Aligns to DWORD boundary
|
||||
@ -98,13 +99,6 @@ typedef struct lcmsProfile_s {
|
||||
cmsHPROFILE pf;
|
||||
} lcmsProfile_t, *lcmsProfile_p;
|
||||
|
||||
typedef union storeID_s { /* store SProfile stuff in a Java Long */
|
||||
lcmsProfile_p lcmsPf;
|
||||
cmsHTRANSFORM xf;
|
||||
jobject jobj;
|
||||
jlong j;
|
||||
} storeID_t, *storeID_p;
|
||||
|
||||
typedef union {
|
||||
cmsTagSignature cms;
|
||||
jint j;
|
||||
@ -148,23 +142,21 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
|
||||
}
|
||||
|
||||
void LCMS_freeProfile(JNIEnv *env, jlong ptr) {
|
||||
storeID_t sProfile;
|
||||
sProfile.j = ptr;
|
||||
lcmsProfile_p p = (lcmsProfile_p)jlong_to_ptr(ptr);
|
||||
|
||||
if (sProfile.lcmsPf != NULL) {
|
||||
if (sProfile.lcmsPf->pf != NULL) {
|
||||
cmsCloseProfile(sProfile.lcmsPf->pf);
|
||||
if (p != NULL) {
|
||||
if (p->pf != NULL) {
|
||||
cmsCloseProfile(p->pf);
|
||||
}
|
||||
free(sProfile.lcmsPf);
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
|
||||
void LCMS_freeTransform(JNIEnv *env, jlong ID)
|
||||
{
|
||||
storeID_t sTrans;
|
||||
sTrans.j = ID;
|
||||
cmsHTRANSFORM sTrans = jlong_to_ptr(ID);
|
||||
/* Passed ID is always valid native ref so there is no check for zero */
|
||||
cmsDeleteTransform(sTrans.xf);
|
||||
cmsDeleteTransform(sTrans);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -179,12 +171,16 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
|
||||
{
|
||||
cmsHPROFILE _iccArray[DF_ICC_BUF_SIZE];
|
||||
cmsHPROFILE *iccArray = &_iccArray[0];
|
||||
storeID_t sTrans;
|
||||
cmsHTRANSFORM sTrans = NULL;
|
||||
int i, j, size;
|
||||
jlong* ids;
|
||||
|
||||
size = (*env)->GetArrayLength (env, profileIDs);
|
||||
ids = (*env)->GetLongArrayElements(env, profileIDs, 0);
|
||||
if (ids == NULL) {
|
||||
// An exception should have already been thrown.
|
||||
return 0L;
|
||||
}
|
||||
|
||||
#ifdef _LITTLE_ENDIAN
|
||||
/* Reversing data packed into int for LE archs */
|
||||
@ -209,11 +205,10 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < size; i++) {
|
||||
cmsHPROFILE icc;
|
||||
cmsColorSpaceSignature cs;
|
||||
lcmsProfile_p profilePtr = (lcmsProfile_p)jlong_to_ptr(ids[i]);
|
||||
cmsHPROFILE icc = profilePtr->pf;
|
||||
|
||||
sTrans.j = ids[i];
|
||||
icc = sTrans.lcmsPf->pf;
|
||||
iccArray[j++] = icc;
|
||||
|
||||
/* Middle non-abstract profiles should be doubled before passing to
|
||||
@ -228,26 +223,26 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
|
||||
}
|
||||
}
|
||||
|
||||
sTrans.xf = cmsCreateMultiprofileTransform(iccArray, j,
|
||||
sTrans = cmsCreateMultiprofileTransform(iccArray, j,
|
||||
inFormatter, outFormatter, renderType, 0);
|
||||
|
||||
(*env)->ReleaseLongArrayElements(env, profileIDs, ids, 0);
|
||||
|
||||
if (sTrans.xf == NULL) {
|
||||
if (sTrans == NULL) {
|
||||
J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_createNativeTransform: "
|
||||
"sTrans.xf == NULL");
|
||||
"sTrans == NULL");
|
||||
if ((*env)->ExceptionOccurred(env) == NULL) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Cannot get color transform");
|
||||
}
|
||||
} else {
|
||||
Disposer_AddRecord(env, disposerRef, LCMS_freeTransform, sTrans.j);
|
||||
Disposer_AddRecord(env, disposerRef, LCMS_freeTransform, ptr_to_jlong(sTrans));
|
||||
}
|
||||
|
||||
if (iccArray != &_iccArray[0]) {
|
||||
free(iccArray);
|
||||
}
|
||||
return sTrans.j;
|
||||
return ptr_to_jlong(sTrans);
|
||||
}
|
||||
|
||||
|
||||
@ -261,7 +256,7 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
|
||||
{
|
||||
jbyte* dataArray;
|
||||
jint dataSize;
|
||||
storeID_t sProf;
|
||||
lcmsProfile_p sProf = NULL;
|
||||
cmsHPROFILE pf;
|
||||
|
||||
if (JNU_IsNull(env, data)) {
|
||||
@ -269,16 +264,14 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
|
||||
return 0L;
|
||||
}
|
||||
|
||||
sProf.j = 0L;
|
||||
|
||||
dataArray = (*env)->GetByteArrayElements (env, data, 0);
|
||||
dataSize = (*env)->GetArrayLength (env, data);
|
||||
|
||||
if (dataArray == NULL) {
|
||||
JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
|
||||
// An exception should have already been thrown.
|
||||
return 0L;
|
||||
}
|
||||
|
||||
dataSize = (*env)->GetArrayLength (env, data);
|
||||
|
||||
pf = cmsOpenProfileFromMem((const void *)dataArray,
|
||||
(cmsUInt32Number) dataSize);
|
||||
|
||||
@ -303,17 +296,17 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
|
||||
|
||||
if (pf != NULL) {
|
||||
// create profile holder
|
||||
sProf.lcmsPf = (lcmsProfile_p)malloc(sizeof(lcmsProfile_t));
|
||||
if (sProf.lcmsPf != NULL) {
|
||||
sProf = (lcmsProfile_p)malloc(sizeof(lcmsProfile_t));
|
||||
if (sProf != NULL) {
|
||||
// register the disposer record
|
||||
sProf.lcmsPf->pf = pf;
|
||||
Disposer_AddRecord(env, disposerRef, LCMS_freeProfile, sProf.j);
|
||||
sProf->pf = pf;
|
||||
Disposer_AddRecord(env, disposerRef, LCMS_freeProfile, ptr_to_jlong(sProf));
|
||||
} else {
|
||||
cmsCloseProfile(pf);
|
||||
}
|
||||
}
|
||||
|
||||
return sProf.j;
|
||||
return ptr_to_jlong(sProf);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -324,11 +317,10 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
|
||||
JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileSizeNative
|
||||
(JNIEnv *env, jobject obj, jlong id)
|
||||
{
|
||||
storeID_t sProf;
|
||||
lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
|
||||
cmsUInt32Number pfSize = 0;
|
||||
sProf.j = id;
|
||||
|
||||
if (cmsSaveProfileToMem(sProf.lcmsPf->pf, NULL, &pfSize) && ((jint)pfSize > 0)) {
|
||||
if (cmsSaveProfileToMem(sProf->pf, NULL, &pfSize) && ((jint)pfSize > 0)) {
|
||||
return (jint)pfSize;
|
||||
} else {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
@ -345,16 +337,14 @@ JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileSizeNative
|
||||
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileDataNative
|
||||
(JNIEnv *env, jobject obj, jlong id, jbyteArray data)
|
||||
{
|
||||
storeID_t sProf;
|
||||
lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
|
||||
jint size;
|
||||
jbyte* dataArray;
|
||||
cmsUInt32Number pfSize = 0;
|
||||
cmsBool status;
|
||||
|
||||
sProf.j = id;
|
||||
|
||||
// determine actual profile size
|
||||
if (!cmsSaveProfileToMem(sProf.lcmsPf->pf, NULL, &pfSize)) {
|
||||
if (!cmsSaveProfileToMem(sProf->pf, NULL, &pfSize)) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Can not access specified profile.");
|
||||
return;
|
||||
@ -369,8 +359,12 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileDataNative
|
||||
}
|
||||
|
||||
dataArray = (*env)->GetByteArrayElements (env, data, 0);
|
||||
if (dataArray == NULL) {
|
||||
// An exception should have already been thrown.
|
||||
return;
|
||||
}
|
||||
|
||||
status = cmsSaveProfileToMem(sProf.lcmsPf->pf, dataArray, &pfSize);
|
||||
status = cmsSaveProfileToMem(sProf->pf, dataArray, &pfSize);
|
||||
|
||||
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
|
||||
|
||||
@ -395,7 +389,7 @@ static cmsHPROFILE _writeCookedTag(cmsHPROFILE pfTarget, cmsTagSignature sig, jb
|
||||
JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
(JNIEnv *env, jobject obj, jlong id, jint tagSig)
|
||||
{
|
||||
storeID_t sProf;
|
||||
lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
|
||||
TagSignature_t sig;
|
||||
cmsInt32Number tagSize;
|
||||
|
||||
@ -404,7 +398,6 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
|
||||
jint bufSize;
|
||||
|
||||
sProf.j = id;
|
||||
sig.j = tagSig;
|
||||
|
||||
if (tagSig == SigHead) {
|
||||
@ -415,20 +408,18 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
data = (*env)->NewByteArray(env, bufSize);
|
||||
|
||||
if (data == NULL) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Unable to allocate buffer");
|
||||
// An exception should have already been thrown.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dataArray = (*env)->GetByteArrayElements (env, data, 0);
|
||||
|
||||
if (dataArray == NULL) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Unable to get buffer");
|
||||
return NULL;
|
||||
// An exception should have already been thrown.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = _getHeaderInfo(sProf.lcmsPf->pf, dataArray, bufSize);
|
||||
status = _getHeaderInfo(sProf->pf, dataArray, bufSize);
|
||||
|
||||
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
|
||||
|
||||
@ -441,8 +432,8 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
return data;
|
||||
}
|
||||
|
||||
if (cmsIsTag(sProf.lcmsPf->pf, sig.cms)) {
|
||||
tagSize = cmsReadRawTag(sProf.lcmsPf->pf, sig.cms, NULL, 0);
|
||||
if (cmsIsTag(sProf->pf, sig.cms)) {
|
||||
tagSize = cmsReadRawTag(sProf->pf, sig.cms, NULL, 0);
|
||||
} else {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"ICC profile tag not found");
|
||||
@ -452,20 +443,18 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
// allocate java array
|
||||
data = (*env)->NewByteArray(env, tagSize);
|
||||
if (data == NULL) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Unable to allocate buffer");
|
||||
// An exception should have already been thrown.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dataArray = (*env)->GetByteArrayElements (env, data, 0);
|
||||
|
||||
if (dataArray == NULL) {
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Unable to get buffer");
|
||||
// An exception should have already been thrown.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bufSize = cmsReadRawTag(sProf.lcmsPf->pf, sig.cms, dataArray, tagSize);
|
||||
bufSize = cmsReadRawTag(sProf->pf, sig.cms, dataArray, tagSize);
|
||||
|
||||
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
|
||||
|
||||
@ -485,7 +474,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
|
||||
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
|
||||
(JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
|
||||
{
|
||||
storeID_t sProf;
|
||||
lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
|
||||
cmsHPROFILE pfReplace = NULL;
|
||||
|
||||
TagSignature_t sig;
|
||||
@ -493,7 +482,6 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
|
||||
jbyte* dataArray;
|
||||
int tagSize;
|
||||
|
||||
sProf.j = id;
|
||||
sig.j = tagSig;
|
||||
|
||||
if (JNU_IsNull(env, data)) {
|
||||
@ -506,19 +494,19 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
|
||||
dataArray = (*env)->GetByteArrayElements(env, data, 0);
|
||||
|
||||
if (dataArray == NULL) {
|
||||
JNU_ThrowIllegalArgumentException(env, "Can not write tag data.");
|
||||
// An exception should have already been thrown.
|
||||
return;
|
||||
}
|
||||
|
||||
if (tagSig == SigHead) {
|
||||
status = _setHeaderInfo(sProf.lcmsPf->pf, dataArray, tagSize);
|
||||
status = _setHeaderInfo(sProf->pf, dataArray, tagSize);
|
||||
} else {
|
||||
/*
|
||||
* New strategy for generic tags: create a place holder,
|
||||
* dump all existing tags there, dump externally supplied
|
||||
* tag, and return the new profile to the java.
|
||||
*/
|
||||
pfReplace = _writeCookedTag(sProf.lcmsPf->pf, sig.cms, dataArray, tagSize);
|
||||
pfReplace = _writeCookedTag(sProf->pf, sig.cms, dataArray, tagSize);
|
||||
status = (pfReplace != NULL);
|
||||
}
|
||||
|
||||
@ -527,8 +515,8 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
|
||||
if (!status) {
|
||||
JNU_ThrowIllegalArgumentException(env, "Can not write tag data.");
|
||||
} else if (pfReplace != NULL) {
|
||||
cmsCloseProfile(sProf.lcmsPf->pf);
|
||||
sProf.lcmsPf->pf = pfReplace;
|
||||
cmsCloseProfile(sProf->pf);
|
||||
sProf->pf = pfReplace;
|
||||
}
|
||||
}
|
||||
|
||||
@ -582,7 +570,7 @@ void releaseILData (JNIEnv *env, void* pData, jint dataType,
|
||||
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
(JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
|
||||
{
|
||||
storeID_t sTrans;
|
||||
cmsHTRANSFORM sTrans = NULL;
|
||||
int srcDType, dstDType;
|
||||
int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
|
||||
int width, height, i;
|
||||
@ -603,9 +591,9 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
srcAtOnce = (*env)->GetBooleanField(env, src, IL_imageAtOnce_fID);
|
||||
dstAtOnce = (*env)->GetBooleanField(env, dst, IL_imageAtOnce_fID);
|
||||
|
||||
sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
|
||||
sTrans = jlong_to_ptr((*env)->GetLongField (env, trans, Trans_ID_fID));
|
||||
|
||||
if (sTrans.xf == NULL) {
|
||||
if (sTrans == NULL) {
|
||||
J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Cannot get color transform");
|
||||
@ -617,8 +605,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
|
||||
if (inputBuffer == NULL) {
|
||||
J2dRlsTraceLn(J2D_TRACE_ERROR, "");
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Cannot get input data");
|
||||
// An exception should have already been thrown.
|
||||
return;
|
||||
}
|
||||
|
||||
@ -626,8 +613,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
|
||||
if (outputBuffer == NULL) {
|
||||
releaseILData(env, inputBuffer, srcDType, srcData);
|
||||
JNU_ThrowByName(env, "java/awt/color/CMMException",
|
||||
"Cannot get output data");
|
||||
// An exception should have already been thrown.
|
||||
return;
|
||||
}
|
||||
|
||||
@ -635,10 +621,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
outputRow = (char*)outputBuffer + dstOffset;
|
||||
|
||||
if (srcAtOnce && dstAtOnce) {
|
||||
cmsDoTransform(sTrans.xf, inputRow, outputRow, width * height);
|
||||
cmsDoTransform(sTrans, inputRow, outputRow, width * height);
|
||||
} else {
|
||||
for (i = 0; i < height; i++) {
|
||||
cmsDoTransform(sTrans.xf, inputRow, outputRow, width);
|
||||
cmsDoTransform(sTrans, inputRow, outputRow, width);
|
||||
inputRow += srcNextRowOffset;
|
||||
outputRow += dstNextRowOffset;
|
||||
}
|
||||
@ -656,14 +642,22 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
|
||||
JNIEXPORT jobject JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
|
||||
(JNIEnv *env, jclass cls, jobject pf)
|
||||
{
|
||||
jclass clsLcmsProfile;
|
||||
jobject cmmProfile;
|
||||
jfieldID fid = (*env)->GetFieldID (env,
|
||||
(*env)->GetObjectClass(env, pf),
|
||||
"cmmProfile", "Lsun/java2d/cmm/Profile;");
|
||||
if (fid == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jclass clsLcmsProfile = (*env)->FindClass(env,
|
||||
clsLcmsProfile = (*env)->FindClass(env,
|
||||
"sun/java2d/cmm/lcms/LCMSProfile");
|
||||
if (clsLcmsProfile == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jobject cmmProfile = (*env)->GetObjectField (env, pf, fid);
|
||||
cmmProfile = (*env)->GetObjectField (env, pf, fid);
|
||||
|
||||
if (JNU_IsNull(env, cmmProfile)) {
|
||||
return NULL;
|
||||
@ -687,18 +681,51 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS
|
||||
* unloading
|
||||
*/
|
||||
Trans_renderType_fID = (*env)->GetFieldID (env, Trans, "renderType", "I");
|
||||
if (Trans_renderType_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
Trans_ID_fID = (*env)->GetFieldID (env, Trans, "ID", "J");
|
||||
if (Trans_ID_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
IL_isIntPacked_fID = (*env)->GetFieldID (env, IL, "isIntPacked", "Z");
|
||||
if (IL_isIntPacked_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_dataType_fID = (*env)->GetFieldID (env, IL, "dataType", "I");
|
||||
if (IL_dataType_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_pixelType_fID = (*env)->GetFieldID (env, IL, "pixelType", "I");
|
||||
if (IL_pixelType_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
|
||||
"Ljava/lang/Object;");
|
||||
if (IL_dataArray_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
|
||||
if (IL_width_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
|
||||
if (IL_height_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");
|
||||
if (IL_offset_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_imageAtOnce_fID = (*env)->GetFieldID (env, IL, "imageAtOnce", "Z");
|
||||
if (IL_imageAtOnce_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
|
||||
if (IL_nextRowOffset_fID == NULL) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
|
||||
@ -709,7 +736,7 @@ static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
|
||||
|
||||
if (!cmsSaveProfileToMem(pf, NULL, &pfSize) ||
|
||||
pfSize < sizeof(cmsICCHeader) ||
|
||||
bufferSize < sizeof(cmsICCHeader))
|
||||
bufferSize < (jint)sizeof(cmsICCHeader))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@ -730,9 +757,9 @@ static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
|
||||
|
||||
static cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
|
||||
{
|
||||
cmsICCHeader pfHeader = { 0 };
|
||||
cmsICCHeader pfHeader;
|
||||
|
||||
if (pBuffer == NULL || bufferSize < sizeof(cmsICCHeader)) {
|
||||
if (pBuffer == NULL || bufferSize < (jint)sizeof(cmsICCHeader)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -765,13 +792,14 @@ static cmsHPROFILE _writeCookedTag(const cmsHPROFILE pfTarget,
|
||||
cmsInt32Number i;
|
||||
cmsHPROFILE pfSanity = NULL;
|
||||
|
||||
cmsICCHeader hdr = { 0 };
|
||||
cmsICCHeader hdr;
|
||||
|
||||
cmsHPROFILE p = cmsCreateProfilePlaceholder(NULL);
|
||||
|
||||
if (NULL == p) {
|
||||
return NULL;
|
||||
}
|
||||
memset(&hdr, 0, sizeof(cmsICCHeader));
|
||||
|
||||
// Populate the placeholder's header according to target profile
|
||||
hdr.flags = cmsGetHeaderFlags(pfTarget);
|
||||
|
@ -661,7 +661,12 @@ OGLBlitLoops_Blit(JNIEnv *env,
|
||||
(sy2-sy1) != (jint)(dy2-dy1) ||
|
||||
oglc->extraAlpha != 1.0f;
|
||||
break;
|
||||
|
||||
#ifdef MACOSX
|
||||
case OGLC_VENDOR_ATI:
|
||||
// see 8024461
|
||||
viaTexture = JNI_TRUE;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
// just use the glDrawPixels() codepath
|
||||
viaTexture = JNI_FALSE;
|
||||
|
@ -108,10 +108,6 @@ public class FontConfigManager {
|
||||
public FontConfigManager() {
|
||||
}
|
||||
|
||||
public static String[] getFontConfigNames() {
|
||||
return fontConfigNames;
|
||||
}
|
||||
|
||||
/* Called from code that needs to know what are the AA settings
|
||||
* that apps using FC would pick up for the default desktop font.
|
||||
* Note apps can change the default desktop font. etc, so this
|
||||
@ -182,7 +178,6 @@ public class FontConfigManager {
|
||||
t0 = System.nanoTime();
|
||||
}
|
||||
|
||||
String[] fontConfigNames = FontConfigManager.getFontConfigNames();
|
||||
FcCompFont[] fontArr = new FcCompFont[fontConfigNames.length];
|
||||
|
||||
for (int i = 0; i< fontArr.length; i++) {
|
||||
|
@ -76,8 +76,9 @@ public class MaskTileManager {
|
||||
public void fillMask(XRSurfaceData dst) {
|
||||
|
||||
boolean maskRequired = xrMgr.maskRequired();
|
||||
boolean maskEvaluated = XRUtils.isMaskEvaluated(xrMgr.compRule);
|
||||
|
||||
if (maskRequired) {
|
||||
if (maskRequired && maskEvaluated) {
|
||||
mainTile.calculateDirtyAreas();
|
||||
DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
|
||||
mainTile.translate(-dirtyArea.x, -dirtyArea.y);
|
||||
@ -106,7 +107,15 @@ public class MaskTileManager {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
xrMgr.XRRenderRectangles(dst, mainTile.getRects());
|
||||
/*
|
||||
* If a mask would be required to store geometry (maskRequired)
|
||||
* composition has to be done rectangle-by-rectagle.
|
||||
*/
|
||||
if(xrMgr.isSolidPaintActive()) {
|
||||
xrMgr.XRRenderRectangles(dst, mainTile.getRects());
|
||||
} else {
|
||||
xrMgr.XRCompositeRectangles(dst, mainTile.getRects());
|
||||
}
|
||||
}
|
||||
|
||||
mainTile.reset();
|
||||
|
@ -100,14 +100,13 @@ public interface XRBackend {
|
||||
int xSrc, int ySrc, int xDst, int yDst,
|
||||
int glyphset, GrowableEltArray elts);
|
||||
|
||||
public int createRadialGradient(Point2D inner, Point2D outer,
|
||||
public int createRadialGradient(float centerX, float centerY,
|
||||
float innerRadius, float outerRadius,
|
||||
float[] fractions, int[] pixels,
|
||||
int repeat, AffineTransform transform);
|
||||
int repeat);
|
||||
|
||||
public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
|
||||
int[] pixels, int repeat,
|
||||
AffineTransform transform);
|
||||
int[] pixels, int repeat);
|
||||
|
||||
public void setGCMode(long gc, boolean copy);
|
||||
|
||||
|
@ -105,17 +105,14 @@ public class XRBackendNative implements XRBackend {
|
||||
XRCreateLinearGradientPaintNative(float[] fractionsArray,
|
||||
short[] pixelsArray,
|
||||
int x1, int y1, int x2, int y2,
|
||||
int numStops, int repeat,
|
||||
int m00, int m01, int m02,
|
||||
int m10, int m11, int m12);
|
||||
int numStops, int repeat);
|
||||
|
||||
private native static int
|
||||
XRCreateRadialGradientPaintNative(float[] fractionsArray,
|
||||
short[] pixelsArray, int numStops,
|
||||
int centerX, int centerY,
|
||||
int innerRadius, int outerRadius,
|
||||
int repeat,
|
||||
int m00, int m01, int m02,
|
||||
int m10, int m11, int m12);
|
||||
int repeat);
|
||||
|
||||
public native void setFilter(int picture, int filter);
|
||||
|
||||
@ -175,40 +172,29 @@ public class XRBackendNative implements XRBackend {
|
||||
}
|
||||
|
||||
public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
|
||||
int[] pixels, int repeat, AffineTransform trx) {
|
||||
int[] pixels, int repeat) {
|
||||
|
||||
short[] colorValues = getRenderColors(pixels);
|
||||
int gradient =
|
||||
XRCreateLinearGradientPaintNative(fractions, colorValues,
|
||||
XDoubleToFixed(p1.getX()), XDoubleToFixed(p1.getY()),
|
||||
XDoubleToFixed(p2.getX()), XDoubleToFixed(p2.getY()),
|
||||
fractions.length, repeat,
|
||||
XDoubleToFixed(trx.getScaleX()),
|
||||
XDoubleToFixed(trx.getShearX()),
|
||||
XDoubleToFixed(trx.getTranslateX()),
|
||||
XDoubleToFixed(trx.getShearY()),
|
||||
XDoubleToFixed(trx.getScaleY()),
|
||||
XDoubleToFixed(trx.getTranslateY()));
|
||||
fractions.length, repeat);
|
||||
return gradient;
|
||||
}
|
||||
|
||||
public int createRadialGradient(Point2D inner, Point2D outer,
|
||||
public int createRadialGradient(float centerX, float centerY,
|
||||
float innerRadius, float outerRadius,
|
||||
float[] fractions, int[] pixels, int repeat,
|
||||
AffineTransform trx) {
|
||||
float[] fractions, int[] pixels, int repeat) {
|
||||
|
||||
short[] colorValues = getRenderColors(pixels);
|
||||
return XRCreateRadialGradientPaintNative
|
||||
(fractions, colorValues, fractions.length,
|
||||
XDoubleToFixed(centerX),
|
||||
XDoubleToFixed(centerY),
|
||||
XDoubleToFixed(innerRadius),
|
||||
XDoubleToFixed(outerRadius),
|
||||
repeat,
|
||||
XDoubleToFixed(trx.getScaleX()),
|
||||
XDoubleToFixed(trx.getShearX()),
|
||||
XDoubleToFixed(trx.getTranslateX()),
|
||||
XDoubleToFixed(trx.getShearY()),
|
||||
XDoubleToFixed(trx.getScaleY()),
|
||||
XDoubleToFixed(trx.getTranslateY()));
|
||||
repeat);
|
||||
}
|
||||
|
||||
public void setGCClipRectangles(long gc, Region clip) {
|
||||
|
@ -54,6 +54,7 @@ public class XRColor {
|
||||
}
|
||||
|
||||
public XRColor(Color color) {
|
||||
setColorValues(color);
|
||||
}
|
||||
|
||||
public void setColorValues(Color color) {
|
||||
|
@ -48,7 +48,12 @@ public class XRCompositeManager {
|
||||
private static boolean enableGradCache = true;
|
||||
private static XRCompositeManager instance;
|
||||
|
||||
XRSurfaceData src;
|
||||
private final static int SOLID = 0;
|
||||
private final static int TEXTURE = 1;
|
||||
private final static int GRADIENT = 2;
|
||||
|
||||
int srcType;
|
||||
XRSolidSrcPict solidSrc32;
|
||||
XRSurfaceData texture;
|
||||
XRSurfaceData gradient;
|
||||
int alphaMask = XRUtils.None;
|
||||
@ -84,7 +89,6 @@ public class XRCompositeManager {
|
||||
|
||||
private XRCompositeManager(XRSurfaceData surface) {
|
||||
con = new XRBackendNative();
|
||||
// con = XRBackendJava.getInstance();
|
||||
|
||||
String gradProp =
|
||||
AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@ -109,14 +113,7 @@ public class XRCompositeManager {
|
||||
public void initResources(XRSurfaceData surface) {
|
||||
int parentXid = surface.getXid();
|
||||
|
||||
int solidPixmap = con.createPixmap(parentXid, 32, 1, 1);
|
||||
int solidSrcPictXID = con.createPicture(solidPixmap,
|
||||
XRUtils.PictStandardARGB32);
|
||||
con.setPictureRepeat(solidSrcPictXID, XRUtils.RepeatNormal);
|
||||
con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc,
|
||||
XRColor.FULL_ALPHA, 0, 0, 1, 1);
|
||||
solidSrcPict = new XRSurfaceData.XRInternalSurfaceData(con,
|
||||
solidSrcPictXID, null);
|
||||
solidSrc32 = new XRSolidSrcPict(con, parentXid);
|
||||
setForeground(0);
|
||||
|
||||
int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1);
|
||||
@ -135,9 +132,7 @@ public class XRCompositeManager {
|
||||
}
|
||||
|
||||
public void setForeground(int pixel) {
|
||||
solidColor.setColorValues(pixel, false);
|
||||
con.renderRectangle(solidSrcPict.picture, XRUtils.PictOpSrc,
|
||||
solidColor, 0, 0, 1, 1);
|
||||
solidColor.setColorValues(pixel, true);
|
||||
}
|
||||
|
||||
public void setGradientPaint(XRSurfaceData gradient) {
|
||||
@ -145,16 +140,16 @@ public class XRCompositeManager {
|
||||
con.freePicture(this.gradient.picture);
|
||||
}
|
||||
this.gradient = gradient;
|
||||
src = gradient;
|
||||
srcType = GRADIENT;
|
||||
}
|
||||
|
||||
public void setTexturePaint(XRSurfaceData texture) {
|
||||
this.texture = texture;
|
||||
src = texture;
|
||||
this.srcType = TEXTURE;
|
||||
}
|
||||
|
||||
public void XRResetPaint() {
|
||||
src = solidSrcPict;
|
||||
srcType = SOLID;
|
||||
}
|
||||
|
||||
public void validateCompositeState(Composite comp, AffineTransform xform,
|
||||
@ -175,7 +170,7 @@ public class XRCompositeManager {
|
||||
validatedComp = comp;
|
||||
}
|
||||
|
||||
if (sg2d != null && validatedPixel != sg2d.pixel) {
|
||||
if (sg2d != null && (validatedPixel != sg2d.pixel || updatePaint)) {
|
||||
validatedPixel = sg2d.pixel;
|
||||
setForeground(validatedPixel);
|
||||
}
|
||||
@ -191,14 +186,14 @@ public class XRCompositeManager {
|
||||
validatedPaint = paint;
|
||||
}
|
||||
|
||||
if (src != solidSrcPict) {
|
||||
if (srcType != SOLID) {
|
||||
AffineTransform at = (AffineTransform) xform.clone();
|
||||
try {
|
||||
at.invert();
|
||||
} catch (NoninvertibleTransformException e) {
|
||||
at.setToIdentity();
|
||||
}
|
||||
src.validateAsSource(at, -1, -1);
|
||||
getCurrentSource().validateAsSource(at, -1, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,13 +229,13 @@ public class XRCompositeManager {
|
||||
|
||||
public boolean maskRequired() {
|
||||
return (!xorEnabled)
|
||||
&& ((src != solidSrcPict)
|
||||
|| (src == solidSrcPict && solidColor.alpha != 0xffff) || (extraAlpha != 1.0f));
|
||||
&& ((srcType != SOLID)
|
||||
|| (srcType == SOLID && (solidColor.alpha != 0xffff) || (extraAlpha != 1.0f)));
|
||||
}
|
||||
|
||||
public void XRComposite(int src, int mask, int dst, int srcX, int srcY,
|
||||
int maskX, int maskY, int dstX, int dstY, int width, int height) {
|
||||
int cachedSrc = (src == XRUtils.None) ? this.src.picture : src;
|
||||
int cachedSrc = (src == XRUtils.None) ? getCurrentSource().picture : src;
|
||||
int cachedX = srcX;
|
||||
int cachedY = srcY;
|
||||
|
||||
@ -276,7 +271,7 @@ public class XRCompositeManager {
|
||||
renderReferenceY = (int) Math.floor(XRUtils
|
||||
.XFixedToDouble(renderReferenceY));
|
||||
|
||||
con.renderCompositeTrapezoids(compRule, src.picture,
|
||||
con.renderCompositeTrapezoids(compRule, getCurrentSource().picture,
|
||||
XRUtils.PictStandardA8, dst, renderReferenceX,
|
||||
renderReferenceY, trapList);
|
||||
}
|
||||
@ -294,15 +289,46 @@ public class XRCompositeManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void XRCompositeRectangles(XRSurfaceData dst, GrowableRectArray rects) {
|
||||
int srcPict = getCurrentSource().picture;
|
||||
|
||||
for(int i=0; i < rects.getSize(); i++) {
|
||||
int x = rects.getX(i);
|
||||
int y = rects.getY(i);
|
||||
int width = rects.getWidth(i);
|
||||
int height = rects.getHeight(i);
|
||||
|
||||
con.renderComposite(compRule, srcPict, XRUtils.None, dst.picture, x, y, 0, 0, x, y, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
protected XRSurfaceData getCurrentSource() {
|
||||
switch(srcType) {
|
||||
case SOLID:
|
||||
return solidSrc32.prepareSrcPict(validatedPixel);
|
||||
case TEXTURE:
|
||||
return texture;
|
||||
case GRADIENT:
|
||||
return gradient;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void compositeBlit(XRSurfaceData src, XRSurfaceData dst, int sx,
|
||||
int sy, int dx, int dy, int w, int h) {
|
||||
con.renderComposite(compRule, src.picture, alphaMask, dst.picture, sx,
|
||||
sy, 0, 0, dx, dy, w, h);
|
||||
}
|
||||
|
||||
public void compositeText(XRSurfaceData dst, int sx, int sy,
|
||||
int glyphSet, int maskFormat, GrowableEltArray elts) {
|
||||
con.XRenderCompositeText(compRule, src.picture, dst.picture,
|
||||
public void compositeText(XRSurfaceData dst, int sx, int sy, int glyphSet,
|
||||
int maskFormat, GrowableEltArray elts) {
|
||||
/*
|
||||
* Try to emulate the SRC blend mode with SRC_OVER.
|
||||
* We bail out during pipe validation for cases where this is not possible.
|
||||
*/
|
||||
byte textCompRule = (compRule != XRUtils.PictOpSrc) ? compRule : XRUtils.PictOpOver;
|
||||
con.XRenderCompositeText(textCompRule, getCurrentSource().picture, dst.picture,
|
||||
maskFormat, sx, sy, 0, 0, glyphSet, elts);
|
||||
}
|
||||
|
||||
@ -315,7 +341,11 @@ public class XRCompositeManager {
|
||||
}
|
||||
|
||||
public boolean isTexturePaintActive() {
|
||||
return src == texture;
|
||||
return srcType == TEXTURE;
|
||||
}
|
||||
|
||||
public boolean isSolidPaintActive() {
|
||||
return srcType == SOLID;
|
||||
}
|
||||
|
||||
public XRColor getAlphaColor() {
|
||||
|
@ -38,6 +38,7 @@ import sun.java2d.pipe.*;
|
||||
*/
|
||||
|
||||
public class XRDrawImage extends DrawImage {
|
||||
|
||||
@Override
|
||||
protected void renderImageXform(SunGraphics2D sg, Image img,
|
||||
AffineTransform tx, int interpType, int sx1, int sy1, int sx2,
|
||||
@ -45,20 +46,24 @@ public class XRDrawImage extends DrawImage {
|
||||
SurfaceData dstData = sg.surfaceData;
|
||||
SurfaceData srcData = dstData.getSourceSurfaceData(img,
|
||||
SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor);
|
||||
int compRule = ((AlphaComposite) sg.composite).getRule();
|
||||
float extraAlpha = ((AlphaComposite) sg.composite).getAlpha();
|
||||
|
||||
if (srcData != null && !isBgOperation(srcData, bgColor)
|
||||
&& interpType <= AffineTransformOp.TYPE_BILINEAR) {
|
||||
&& interpType <= AffineTransformOp.TYPE_BILINEAR
|
||||
&& (XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(compRule))
|
||||
|| (XRUtils.isTransformQuadrantRotated(tx)) && extraAlpha == 1.0f))
|
||||
{
|
||||
SurfaceType srcType = srcData.getSurfaceType();
|
||||
SurfaceType dstType = dstData.getSurfaceType();
|
||||
|
||||
TransformBlit blit = TransformBlit.getFromCache(srcType,
|
||||
sg.imageComp, dstType);
|
||||
|
||||
if (blit != null) {
|
||||
blit.Transform(srcData, dstData, sg.composite,
|
||||
sg.getCompClip(), tx, interpType, sx1, sy1, 0, 0, sx2
|
||||
- sx1, sy2 - sy1);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@ public class XRMaskBlit extends MaskBlit {
|
||||
|
||||
int maskPict = maskBuffer.getMaskBuffer().
|
||||
uploadMask(width, height, maskscan, maskoff, mask);
|
||||
maskBuffer.XRComposite(x11sd.getPicture(), maskPict, x11sd.picture,
|
||||
maskBuffer.XRComposite(x11sd.getPicture(), maskPict, x11dst.getPicture(),
|
||||
srcx, srcy, 0, 0, dstx, dsty, width, height);
|
||||
maskBuffer.getMaskBuffer().clearUploadMask(maskPict, width, height);
|
||||
} finally {
|
||||
|
@ -178,9 +178,6 @@ class XRPMScaledBlit extends ScaledBlit {
|
||||
super(srcType, CompositeType.AnyAlpha, dstType);
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: This breaks scales with non-integer coordinates!?!?!
|
||||
*/
|
||||
public void Scale(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx1, int sy1, int sx2, int sy2, double dx1, double dy1,
|
||||
double dx2, double dy2) {
|
||||
try {
|
||||
@ -199,19 +196,14 @@ class XRPMScaledBlit extends ScaledBlit {
|
||||
sy1 *= yScale;
|
||||
sy2 *= yScale;
|
||||
|
||||
dx1 = Math.ceil(dx1 - 0.5);
|
||||
dy1 = Math.ceil(dy1 - 0.5);
|
||||
dx2 = Math.ceil(dx2 - 0.5);
|
||||
dy2 = Math.ceil(dy2 - 0.5);
|
||||
|
||||
AffineTransform xForm = AffineTransform.getScaleInstance(1 / xScale, 1 / yScale);
|
||||
|
||||
x11sdSrc.validateAsSource(xForm, XRUtils.RepeatNone, XRUtils.FAST); /*
|
||||
* TODO:
|
||||
* padded
|
||||
* blit
|
||||
* required
|
||||
* :
|
||||
* -
|
||||
* /
|
||||
* ?
|
||||
* ?
|
||||
*/
|
||||
x11sdSrc.validateAsSource(xForm, XRUtils.RepeatNone, XRUtils.FAST);
|
||||
x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, (int) sx1, (int) sy1, (int) dx1, (int) dy1, (int) (dx2 - dx1), (int) (dy2 - dy1));
|
||||
} finally {
|
||||
SunToolkit.awtUnlock();
|
||||
@ -234,43 +226,55 @@ class XRPMTransformedBlit extends TransformBlit {
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculates the composite-rectangle required for transformed blits. This
|
||||
* method is functionally equal to: Shape shp =
|
||||
* xform.createTransformedShape(rect); Rectangle bounds = shp.getBounds();
|
||||
* but performs significantly better.
|
||||
* Returns true if the destination shape is parallel to x/y axis
|
||||
* Calculates the composition-rectangle required for transformed blits.
|
||||
* For composite operations where the composition-rectangle defines
|
||||
* the modified destination area, coordinates are rounded.
|
||||
* Otherwise the composition window rectangle is sized large enough
|
||||
* to not clip away any pixels.
|
||||
*/
|
||||
protected boolean adjustCompositeBounds(AffineTransform tr, int dstx, int dsty, int width, int height) {
|
||||
protected void adjustCompositeBounds(boolean isQuadrantRotated, AffineTransform tr,
|
||||
int dstx, int dsty, int width, int height) {
|
||||
srcCoords[0] = dstx;
|
||||
srcCoords[1] = dsty;
|
||||
srcCoords[2] = dstx + width;
|
||||
srcCoords[3] = dsty;
|
||||
srcCoords[4] = dstx + width;
|
||||
srcCoords[5] = dsty + height;
|
||||
srcCoords[6] = dstx;
|
||||
srcCoords[7] = dsty + height;
|
||||
srcCoords[3] = dsty + height;
|
||||
|
||||
tr.transform(srcCoords, 0, dstCoords, 0, 4);
|
||||
double minX, minY, maxX, maxY;
|
||||
if (isQuadrantRotated) {
|
||||
tr.transform(srcCoords, 0, dstCoords, 0, 2);
|
||||
|
||||
double minX = Math.min(dstCoords[0], Math.min(dstCoords[2], Math.min(dstCoords[4], dstCoords[6])));
|
||||
double minY = Math.min(dstCoords[1], Math.min(dstCoords[3], Math.min(dstCoords[5], dstCoords[7])));
|
||||
double maxX = Math.max(dstCoords[0], Math.max(dstCoords[2], Math.max(dstCoords[4], dstCoords[6])));
|
||||
double maxY = Math.max(dstCoords[1], Math.max(dstCoords[3], Math.max(dstCoords[5], dstCoords[7])));
|
||||
minX = Math.min(dstCoords[0], dstCoords[2]);
|
||||
minY = Math.min(dstCoords[1], dstCoords[3]);
|
||||
maxX = Math.max(dstCoords[0], dstCoords[2]);
|
||||
maxY = Math.max(dstCoords[1], dstCoords[3]);
|
||||
|
||||
minX = Math.round(minX);
|
||||
minY = Math.round(minY);
|
||||
maxX = Math.round(maxX);
|
||||
maxY = Math.round(maxY);
|
||||
minX = Math.ceil(minX - 0.5);
|
||||
minY = Math.ceil(minY - 0.5);
|
||||
maxX = Math.ceil(maxX - 0.5);
|
||||
maxY = Math.ceil(maxY - 0.5);
|
||||
} else {
|
||||
srcCoords[4] = dstx;
|
||||
srcCoords[5] = dsty + height;
|
||||
srcCoords[6] = dstx + width;
|
||||
srcCoords[7] = dsty;
|
||||
|
||||
tr.transform(srcCoords, 0, dstCoords, 0, 4);
|
||||
|
||||
minX = Math.min(dstCoords[0], Math.min(dstCoords[2], Math.min(dstCoords[4], dstCoords[6])));
|
||||
minY = Math.min(dstCoords[1], Math.min(dstCoords[3], Math.min(dstCoords[5], dstCoords[7])));
|
||||
maxX = Math.max(dstCoords[0], Math.max(dstCoords[2], Math.max(dstCoords[4], dstCoords[6])));
|
||||
maxY = Math.max(dstCoords[1], Math.max(dstCoords[3], Math.max(dstCoords[5], dstCoords[7])));
|
||||
|
||||
minX = Math.floor(minX);
|
||||
minY = Math.floor(minY);
|
||||
maxX = Math.ceil(maxX);
|
||||
maxY = Math.ceil(maxY);
|
||||
}
|
||||
|
||||
compositeBounds.x = (int) minX;
|
||||
compositeBounds.y = (int) minY;
|
||||
compositeBounds.width = (int) (maxX - minX);
|
||||
compositeBounds.height = (int) (maxY - minY);
|
||||
|
||||
boolean is0or180 = (dstCoords[1] == dstCoords[3]) && (dstCoords[2] == dstCoords[4]);
|
||||
boolean is90or270 = (dstCoords[0] == dstCoords[2]) && (dstCoords[3] == dstCoords[5]);
|
||||
|
||||
return is0or180 || is90or270;
|
||||
}
|
||||
|
||||
public void Transform(SurfaceData src, SurfaceData dst, Composite comp, Region clip, AffineTransform xform,
|
||||
@ -280,9 +284,13 @@ class XRPMTransformedBlit extends TransformBlit {
|
||||
|
||||
XRSurfaceData x11sdDst = (XRSurfaceData) dst;
|
||||
XRSurfaceData x11sdSrc = (XRSurfaceData) src;
|
||||
XRCompositeManager xrMgr = XRCompositeManager.getInstance(x11sdSrc);
|
||||
|
||||
float extraAlpha = ((AlphaComposite) comp).getAlpha();
|
||||
int filter = XRUtils.ATransOpToXRQuality(hint);
|
||||
boolean isAxisAligned = adjustCompositeBounds(xform, dstx, dsty, width, height);
|
||||
boolean isQuadrantRotated = XRUtils.isTransformQuadrantRotated(xform);
|
||||
|
||||
adjustCompositeBounds(isQuadrantRotated, xform, dstx, dsty, width, height);
|
||||
|
||||
x11sdDst.validateAsDestination(null, clip);
|
||||
x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
|
||||
@ -298,21 +306,26 @@ class XRPMTransformedBlit extends TransformBlit {
|
||||
trx.setToIdentity();
|
||||
}
|
||||
|
||||
boolean omitMask = (filter == XRUtils.FAST)
|
||||
|| (isAxisAligned && ((AlphaComposite) comp).getAlpha() == 1.0f);
|
||||
|
||||
if (!omitMask) {
|
||||
if (filter != XRUtils.FAST && (!isQuadrantRotated || extraAlpha != 1.0f)) {
|
||||
XRMaskImage mask = x11sdSrc.maskBuffer.getMaskImage();
|
||||
|
||||
// For quadrant-transformed blits geometry is not stored inside the mask
|
||||
// therefore we can use a repeating 1x1 mask for applying extra alpha.
|
||||
int maskPicture = isQuadrantRotated ? xrMgr.getExtraAlphaMask()
|
||||
: mask.prepareBlitMask(x11sdDst, maskTX, width, height);
|
||||
|
||||
x11sdSrc.validateAsSource(trx, XRUtils.RepeatPad, filter);
|
||||
int maskPicture = mask.prepareBlitMask(x11sdDst, maskTX, width, height);
|
||||
x11sdDst.maskBuffer.con.renderComposite(XRCompositeManager.getInstance(x11sdSrc).getCompRule(), x11sdSrc.picture, maskPicture, x11sdDst.picture,
|
||||
0, 0, 0, 0, compositeBounds.x, compositeBounds.y, compositeBounds.width, compositeBounds.height);
|
||||
x11sdDst.maskBuffer.con.renderComposite(xrMgr.getCompRule(), x11sdSrc.picture,
|
||||
maskPicture, x11sdDst.picture, 0, 0, 0, 0, compositeBounds.x, compositeBounds.y,
|
||||
compositeBounds.width, compositeBounds.height);
|
||||
} else {
|
||||
int repeat = filter == XRUtils.FAST ? XRUtils.RepeatNone : XRUtils.RepeatPad;
|
||||
|
||||
x11sdSrc.validateAsSource(trx, repeat, filter);
|
||||
x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, 0, 0, compositeBounds.x, compositeBounds.y, compositeBounds.width, compositeBounds.height);
|
||||
|
||||
// compositeBlit takes care of extra alpha
|
||||
x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, 0, 0, compositeBounds.x,
|
||||
compositeBounds.y, compositeBounds.width, compositeBounds.height);
|
||||
}
|
||||
} finally {
|
||||
SunToolkit.awtUnlock();
|
||||
@ -329,9 +342,7 @@ class XrSwToPMBlit extends Blit {
|
||||
}
|
||||
|
||||
public void Blit(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx, int sy, int dx, int dy, int w, int h) {
|
||||
/*
|
||||
* If the blit is write-only (putimge), no need for a temporary VI.
|
||||
*/
|
||||
// If the blit is write-only (putimge), no need for a temporary VI.
|
||||
if (CompositeType.SrcOverNoEa.equals(comp) && (src.getTransparency() == Transparency.OPAQUE)) {
|
||||
Blit opaqueSwToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, dst.getSurfaceType());
|
||||
opaqueSwToSurfaceBlit.Blit(src, dst, comp, clip, sx, sy, dx, dy, w, h);
|
||||
|
@ -29,10 +29,9 @@ import java.awt.*;
|
||||
import java.awt.MultipleGradientPaint.*;
|
||||
import java.awt.geom.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
import sun.java2d.*;
|
||||
import sun.java2d.loops.*;
|
||||
import sun.java2d.pipe.*;
|
||||
import sun.java2d.xr.XRSurfaceData.XRInternalSurfaceData;
|
||||
|
||||
abstract class XRPaints {
|
||||
static XRCompositeManager xrCompMan;
|
||||
@ -108,27 +107,16 @@ abstract class XRPaints {
|
||||
void setXRPaint(SunGraphics2D sg2d, Paint pt) {
|
||||
GradientPaint paint = (GradientPaint) pt;
|
||||
|
||||
int[] pixels = convertToIntArgbPixels(new Color[] { paint.getColor1(), paint.getColor2() }, false);
|
||||
|
||||
float fractions[] = new float[2];
|
||||
fractions[0] = 0;
|
||||
fractions[1] = 1;
|
||||
int repeat = paint.isCyclic() ? XRUtils.RepeatReflect : XRUtils.RepeatPad;
|
||||
float fractions[] = {0, 1};
|
||||
int[] pixels = convertToIntArgbPixels(new Color[] { paint.getColor1(), paint.getColor2() });
|
||||
|
||||
Point2D pt1 = paint.getPoint1();
|
||||
Point2D pt2 = paint.getPoint2();
|
||||
|
||||
AffineTransform at = (AffineTransform) sg2d.transform.clone();
|
||||
try {
|
||||
at.invert();
|
||||
} catch (NoninvertibleTransformException ex) {
|
||||
at.setToIdentity();
|
||||
}
|
||||
|
||||
int repeat = paint.isCyclic() ? XRUtils.RepeatReflect : XRUtils.RepeatPad;
|
||||
|
||||
XRBackend con = xrCompMan.getBackend();
|
||||
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at);
|
||||
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
|
||||
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat);
|
||||
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient));
|
||||
}
|
||||
}
|
||||
|
||||
@ -142,26 +130,22 @@ abstract class XRPaints {
|
||||
|
||||
@Override
|
||||
boolean isPaintValid(SunGraphics2D sg2d) {
|
||||
return true;
|
||||
return ((LinearGradientPaint) sg2d.getPaint()).getColorSpace() == ColorSpaceType.SRGB;
|
||||
}
|
||||
|
||||
@Override
|
||||
void setXRPaint(SunGraphics2D sg2d, Paint pt) {
|
||||
LinearGradientPaint paint = (LinearGradientPaint) pt;
|
||||
boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
|
||||
|
||||
Color[] colors = paint.getColors();
|
||||
Point2D pt1 = paint.getStartPoint();
|
||||
Point2D pt2 = paint.getEndPoint();
|
||||
|
||||
|
||||
AffineTransform at = paint.getTransform();
|
||||
at.preConcatenate(sg2d.transform);
|
||||
|
||||
int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
|
||||
float[] fractions = paint.getFractions();
|
||||
int[] pixels = convertToIntArgbPixels(colors, linear);
|
||||
int[] pixels = convertToIntArgbPixels(colors);
|
||||
|
||||
AffineTransform at = paint.getTransform();
|
||||
try {
|
||||
at.invert();
|
||||
} catch (NoninvertibleTransformException ex) {
|
||||
@ -169,8 +153,10 @@ abstract class XRPaints {
|
||||
}
|
||||
|
||||
XRBackend con = xrCompMan.getBackend();
|
||||
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at);
|
||||
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
|
||||
int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat);
|
||||
XRInternalSurfaceData x11sd = new XRSurfaceData.XRInternalSurfaceData(con, gradient);
|
||||
x11sd.setStaticSrcTx(at);
|
||||
xrCompMan.setGradientPaint(x11sd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -179,136 +165,101 @@ abstract class XRPaints {
|
||||
@Override
|
||||
boolean isPaintValid(SunGraphics2D sg2d) {
|
||||
RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint;
|
||||
return grad.getFocusPoint().equals(grad.getCenterPoint());
|
||||
return grad.getFocusPoint().equals(grad.getCenterPoint())
|
||||
&& grad.getColorSpace() == ColorSpaceType.SRGB;
|
||||
}
|
||||
|
||||
@Override
|
||||
void setXRPaint(SunGraphics2D sg2d, Paint pt) {
|
||||
RadialGradientPaint paint = (RadialGradientPaint) pt;
|
||||
boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
|
||||
Color[] colors = paint.getColors();
|
||||
Point2D center = paint.getCenterPoint();
|
||||
Point2D focus = paint.getFocusPoint();
|
||||
|
||||
int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
|
||||
float[] fractions = paint.getFractions();
|
||||
int[] pixels = convertToIntArgbPixels(colors, linear);
|
||||
int[] pixels = convertToIntArgbPixels(colors);
|
||||
float radius = paint.getRadius();
|
||||
|
||||
// save original (untransformed) center and focus points
|
||||
double cx = center.getX();
|
||||
double cy = center.getY();
|
||||
double fx = focus.getX();
|
||||
double fy = focus.getY();
|
||||
float cx = (float) center.getX();
|
||||
float cy = (float) center.getY();
|
||||
|
||||
AffineTransform at = paint.getTransform();
|
||||
at.preConcatenate(sg2d.transform);
|
||||
focus = at.transform(focus, focus);
|
||||
|
||||
// transform unit circle to gradient coords; we start with the
|
||||
// unit circle (center=(0,0), focus on positive x-axis, radius=1)
|
||||
// and then transform into gradient space
|
||||
at.translate(cx, cy);
|
||||
at.rotate(fx - cx, fy - cy);
|
||||
// at.scale(radius, radius);
|
||||
|
||||
// invert to get mapping from device coords to unit circle
|
||||
try {
|
||||
at.invert();
|
||||
} catch (Exception e) {
|
||||
at.setToScale(0.0, 0.0);
|
||||
} catch (NoninvertibleTransformException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
focus = at.transform(focus, focus);
|
||||
|
||||
// clamp the focus point so that it does not rest on, or outside
|
||||
// of, the circumference of the gradient circle
|
||||
fx = Math.min(focus.getX(), 0.99);
|
||||
|
||||
XRBackend con = xrCompMan.getBackend();
|
||||
int gradient = con.createRadialGradient(new Point2D.Float(0, 0), new Point2D.Float(0, 0), 0, radius, fractions, pixels, repeat, at);
|
||||
xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
|
||||
int gradient = con.createRadialGradient(cx, cy, 0, radius, fractions, pixels, repeat);
|
||||
XRInternalSurfaceData x11sd = new XRSurfaceData.XRInternalSurfaceData(con, gradient);
|
||||
x11sd.setStaticSrcTx(at);
|
||||
xrCompMan.setGradientPaint(x11sd);
|
||||
}
|
||||
}
|
||||
|
||||
private static class XRTexture extends XRPaints {
|
||||
|
||||
private XRSurfaceData getAccSrcSurface(XRSurfaceData dstData, BufferedImage bi) {
|
||||
// REMIND: this is a hack that attempts to cache the system
|
||||
// memory image from the TexturePaint instance into an
|
||||
// XRender pixmap...
|
||||
SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
throw new InternalError("Surface not cachable");
|
||||
}
|
||||
}
|
||||
|
||||
return (XRSurfaceData) srcData;
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isPaintValid(SunGraphics2D sg2d) {
|
||||
TexturePaint paint = (TexturePaint) sg2d.paint;
|
||||
BufferedImage bi = paint.getImage();
|
||||
XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface();
|
||||
|
||||
SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
// REMIND: this is a hack that attempts to cache the system
|
||||
// memory image from the TexturePaint instance into an
|
||||
// OpenGL texture...
|
||||
srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return getAccSrcSurface(dstData, bi) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
void setXRPaint(SunGraphics2D sg2d, Paint pt) {
|
||||
TexturePaint paint = (TexturePaint) pt;
|
||||
|
||||
BufferedImage bi = paint.getImage();
|
||||
SurfaceData dstData = sg2d.surfaceData;
|
||||
SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
|
||||
// REMIND: this hack tries to ensure that we have a cached texture
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
srcData = dstData.getSourceSurfaceData(paint.getImage(), SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
|
||||
if (!(srcData instanceof XRSurfaceData)) {
|
||||
throw new InternalError("Surface not cachable");
|
||||
}
|
||||
}
|
||||
|
||||
XRSurfaceData x11SrcData = (XRSurfaceData) srcData;
|
||||
|
||||
AffineTransform at = (AffineTransform) sg2d.transform.clone();
|
||||
Rectangle2D anchor = paint.getAnchorRect();
|
||||
|
||||
XRSurfaceData dstData = (XRSurfaceData) sg2d.surfaceData;
|
||||
XRSurfaceData srcData = (XRSurfaceData) getAccSrcSurface(dstData, bi);
|
||||
|
||||
AffineTransform at = new AffineTransform();
|
||||
at.translate(anchor.getX(), anchor.getY());
|
||||
at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight()));
|
||||
|
||||
try {
|
||||
at.invert();
|
||||
} catch (NoninvertibleTransformException ex) {
|
||||
at.setToIdentity(); /* TODO: Right thing to do in this case? */
|
||||
at.setToIdentity();
|
||||
}
|
||||
srcData.setStaticSrcTx(at);
|
||||
|
||||
x11SrcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
|
||||
xrCompMan.setTexturePaint(((XRSurfaceData) srcData));
|
||||
srcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
|
||||
xrCompMan.setTexturePaint(srcData);
|
||||
}
|
||||
}
|
||||
|
||||
public int[] convertToIntArgbPixels(Color[] colors, boolean linear) {
|
||||
public int[] convertToIntArgbPixels(Color[] colors) {
|
||||
int[] pixels = new int[colors.length];
|
||||
for (int i = 0; i < colors.length; i++) {
|
||||
pixels[i] = colorToIntArgbPixel(colors[i], linear);
|
||||
pixels[i] = colorToIntArgbPixel(colors[i]);
|
||||
}
|
||||
return pixels;
|
||||
}
|
||||
|
||||
public int colorToIntArgbPixel(Color c, boolean linear) {
|
||||
public int colorToIntArgbPixel(Color c) {
|
||||
int rgb = c.getRGB();
|
||||
|
||||
int a = rgb >>> 24;
|
||||
int r = (rgb >> 16) & 0xff;
|
||||
int g = (rgb >> 8) & 0xff;
|
||||
int b = (rgb) & 0xff;
|
||||
if (linear) {
|
||||
r = BufferedPaints.convertSRGBtoLinearRGB(r);
|
||||
g = BufferedPaints.convertSRGBtoLinearRGB(g);
|
||||
b = BufferedPaints.convertSRGBtoLinearRGB(b);
|
||||
}
|
||||
|
||||
a *= xrCompMan.getExtraAlpha();
|
||||
|
||||
return ((a << 24) | (r << 16) | (g << 8) | (b));
|
||||
int a = (int) Math.round(xrCompMan.getExtraAlpha() * (rgb >>> 24));
|
||||
return ((a << 24) | (rgb & 0x00FFFFFF));
|
||||
}
|
||||
}
|
||||
|
57
jdk/src/solaris/classes/sun/java2d/xr/XRSolidSrcPict.java
Normal file
57
jdk/src/solaris/classes/sun/java2d/xr/XRSolidSrcPict.java
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.xr;
|
||||
|
||||
public class XRSolidSrcPict {
|
||||
XRBackend con;
|
||||
|
||||
XRSurfaceData srcPict;
|
||||
XRColor xrCol;
|
||||
int curPixVal = -1;
|
||||
|
||||
public XRSolidSrcPict(XRBackend con, int parentXid) {
|
||||
this.con = con;
|
||||
|
||||
xrCol = new XRColor();
|
||||
int solidPixmap = con.createPixmap(parentXid, 32, 1, 1);
|
||||
int solidSrcPictXID = con.createPicture(solidPixmap, XRUtils.PictStandardARGB32);
|
||||
con.setPictureRepeat(solidSrcPictXID, XRUtils.RepeatNormal);
|
||||
con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc, XRColor.FULL_ALPHA, 0, 0, 1, 1);
|
||||
srcPict = new XRSurfaceData.XRInternalSurfaceData(con, solidSrcPictXID);
|
||||
}
|
||||
|
||||
public XRSurfaceData prepareSrcPict(int pixelVal) {
|
||||
if(pixelVal != curPixVal) {
|
||||
xrCol.setColorValues(pixelVal, false);
|
||||
con.renderRectangle(srcPict.picture, XRUtils.PictOpSrc, xrCol, 0, 0, 1, 1);
|
||||
this.curPixVal = pixelVal;
|
||||
}
|
||||
|
||||
return srcPict;
|
||||
}
|
||||
|
||||
}
|
@ -109,6 +109,7 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
return XRSurfaceDataProxy.createProxy(srcData, graphicsConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validatePipe(SunGraphics2D sg2d) {
|
||||
TextPipe textpipe;
|
||||
boolean validated = false;
|
||||
@ -117,14 +118,8 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
* The textpipe for now can't handle TexturePaint when extra-alpha is
|
||||
* specified nore XOR mode
|
||||
*/
|
||||
if (sg2d.compositeState < SunGraphics2D.COMP_XOR &&
|
||||
(sg2d.paintState < SunGraphics2D.PAINT_TEXTURE ||
|
||||
sg2d.composite == null ||
|
||||
!(sg2d.composite instanceof AlphaComposite) ||
|
||||
((AlphaComposite) sg2d.composite).getAlpha() == 1.0f))
|
||||
if ((textpipe = getTextPipe(sg2d)) == null)
|
||||
{
|
||||
textpipe = xrtextpipe;
|
||||
} else {
|
||||
super.validatePipe(sg2d);
|
||||
textpipe = sg2d.textpipe;
|
||||
validated = true;
|
||||
@ -184,13 +179,38 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
sg2d.imagepipe = xrDrawImage;
|
||||
}
|
||||
|
||||
protected MaskFill getMaskFill(SunGraphics2D sg2d) {
|
||||
if (sg2d.paintState > SunGraphics2D.PAINT_ALPHACOLOR &&
|
||||
!XRPaints.isValid(sg2d))
|
||||
{
|
||||
return null;
|
||||
protected TextPipe getTextPipe(SunGraphics2D sg2d) {
|
||||
boolean supportedPaint = sg2d.compositeState <= SunGraphics2D.COMP_ALPHA
|
||||
&& (sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR || sg2d.composite == null);
|
||||
|
||||
boolean supportedCompOp = false;
|
||||
if (sg2d.composite instanceof AlphaComposite) {
|
||||
int compRule = ((AlphaComposite) sg2d.composite).getRule();
|
||||
supportedCompOp = XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(compRule))
|
||||
|| (compRule == AlphaComposite.SRC
|
||||
&& sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR);
|
||||
}
|
||||
return super.getMaskFill(sg2d);
|
||||
|
||||
return (supportedPaint && supportedCompOp) ? xrtextpipe : null;
|
||||
}
|
||||
|
||||
protected MaskFill getMaskFill(SunGraphics2D sg2d) {
|
||||
AlphaComposite aComp = null;
|
||||
if(sg2d.composite != null
|
||||
&& sg2d.composite instanceof AlphaComposite) {
|
||||
aComp = (AlphaComposite) sg2d.composite;
|
||||
}
|
||||
|
||||
boolean supportedPaint = sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR
|
||||
|| XRPaints.isValid(sg2d);
|
||||
|
||||
boolean supportedCompOp = false;
|
||||
if(aComp != null) {
|
||||
int rule = aComp.getRule();
|
||||
supportedCompOp = XRUtils.isMaskEvaluated(XRUtils.j2dAlphaCompToXR(rule));
|
||||
}
|
||||
|
||||
return (supportedPaint && supportedCompOp) ? super.getMaskFill(sg2d) : null;
|
||||
}
|
||||
|
||||
public RenderLoops getRenderLoops(SunGraphics2D sg2d) {
|
||||
@ -395,6 +415,7 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
|
||||
boolean transformInUse = false;
|
||||
AffineTransform validatedSourceTransform = new AffineTransform();
|
||||
AffineTransform staticSrcTx = null;
|
||||
int validatedRepeat = XRUtils.RepeatNone;
|
||||
int validatedFilter = XRUtils.FAST;
|
||||
|
||||
@ -423,13 +444,24 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
}
|
||||
} else if (!transformInUse ||
|
||||
(transformInUse && !sxForm.equals(validatedSourceTransform))) {
|
||||
|
||||
validatedSourceTransform.setTransform(sxForm.getScaleX(),
|
||||
sxForm.getShearY(),
|
||||
sxForm.getShearX(),
|
||||
sxForm.getScaleY(),
|
||||
sxForm.getTranslateX(),
|
||||
sxForm.getTranslateY());
|
||||
renderQueue.setPictureTransform(picture, validatedSourceTransform);
|
||||
|
||||
AffineTransform srcTransform = validatedSourceTransform;
|
||||
if(staticSrcTx != null) {
|
||||
// Apply static transform set when used as texture or gradient.
|
||||
// Create a copy to not modify validatedSourceTransform as
|
||||
// this would confuse the validation logic.
|
||||
srcTransform = new AffineTransform(validatedSourceTransform);
|
||||
srcTransform.preConcatenate(staticSrcTx);
|
||||
}
|
||||
|
||||
renderQueue.setPictureTransform(picture, srcTransform);
|
||||
transformInUse = true;
|
||||
}
|
||||
|
||||
@ -547,15 +579,10 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
}
|
||||
|
||||
public static class XRInternalSurfaceData extends XRSurfaceData {
|
||||
public XRInternalSurfaceData(XRBackend renderQueue, int pictXid,
|
||||
AffineTransform transform) {
|
||||
public XRInternalSurfaceData(XRBackend renderQueue, int pictXid) {
|
||||
super(renderQueue);
|
||||
this.picture = pictXid;
|
||||
this.validatedSourceTransform = transform;
|
||||
|
||||
if (validatedSourceTransform != null) {
|
||||
transformInUse = true;
|
||||
}
|
||||
this.transformInUse = false;
|
||||
}
|
||||
|
||||
public boolean canSourceSendExposures(int x, int y, int w, int h) {
|
||||
@ -677,4 +704,8 @@ public abstract class XRSurfaceData extends XSurfaceData {
|
||||
public XRGraphicsConfig getGraphicsConfig() {
|
||||
return graphicsConfig;
|
||||
}
|
||||
|
||||
public void setStaticSrcTx(AffineTransform staticSrcTx) {
|
||||
this.staticSrcTx = staticSrcTx;
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ package sun.java2d.xr;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.MultipleGradientPaint.*;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.image.*;
|
||||
import sun.java2d.loops.*;
|
||||
import static java.awt.AlphaComposite.*;
|
||||
@ -258,4 +259,21 @@ public class XRUtils {
|
||||
public static int clampToUShort(int x) {
|
||||
return (x > 65535 ? 65535 : (x < 0) ? 0 : x);
|
||||
}
|
||||
|
||||
public static boolean isTransformQuadrantRotated(AffineTransform tr) {
|
||||
return ((tr.getType() & (AffineTransform.TYPE_GENERAL_ROTATION |
|
||||
AffineTransform.TYPE_GENERAL_TRANSFORM)) == 0);
|
||||
}
|
||||
|
||||
public static boolean isMaskEvaluated(byte xrCompRule) {
|
||||
switch (xrCompRule) {
|
||||
case PictOpOver:
|
||||
case PictOpOverReverse:
|
||||
case PictOpAtop:
|
||||
case PictOpXor:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -237,8 +237,9 @@ public class CUPSPrinter {
|
||||
|
||||
/**
|
||||
* Get CUPS default printer using IPP.
|
||||
* Returns 2 values - index 0 is printer name, index 1 is the uri.
|
||||
*/
|
||||
public static String getDefaultPrinter() {
|
||||
static String[] getDefaultPrinter() {
|
||||
try {
|
||||
URL url = new URL("http", getServer(), getPort(), "");
|
||||
final HttpURLConnection urlConnection =
|
||||
@ -264,8 +265,8 @@ public class CUPSPrinter {
|
||||
AttributeClass.ATTRIBUTES_CHARSET,
|
||||
AttributeClass.ATTRIBUTES_NATURAL_LANGUAGE,
|
||||
new AttributeClass("requested-attributes",
|
||||
AttributeClass.TAG_KEYWORD,
|
||||
"printer-name")
|
||||
AttributeClass.TAG_URI,
|
||||
"printer-uri")
|
||||
};
|
||||
|
||||
if (IPPPrintService.writeIPPRequest(os,
|
||||
@ -273,6 +274,7 @@ public class CUPSPrinter {
|
||||
attCl)) {
|
||||
|
||||
HashMap defaultMap = null;
|
||||
String[] printerInfo = new String[2];
|
||||
InputStream is = urlConnection.getInputStream();
|
||||
HashMap[] responseMap = IPPPrintService.readIPPResponse(
|
||||
is);
|
||||
@ -293,21 +295,30 @@ public class CUPSPrinter {
|
||||
* special behaviour for this built in.
|
||||
*/
|
||||
if (UnixPrintServiceLookup.isMac()) {
|
||||
return UnixPrintServiceLookup.
|
||||
printerInfo[0] = UnixPrintServiceLookup.
|
||||
getDefaultPrinterNameSysV();
|
||||
printerInfo[1] = null;
|
||||
return (String[])printerInfo.clone();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AttributeClass attribClass = (AttributeClass)
|
||||
defaultMap.get("printer-name");
|
||||
|
||||
if (attribClass != null) {
|
||||
String nameStr = attribClass.getStringValue();
|
||||
printerInfo[0] = attribClass.getStringValue();
|
||||
attribClass = (AttributeClass)defaultMap.get("device-uri");
|
||||
if (attribClass != null) {
|
||||
printerInfo[1] = attribClass.getStringValue();
|
||||
} else {
|
||||
printerInfo[1] = null;
|
||||
}
|
||||
os.close();
|
||||
urlConnection.disconnect();
|
||||
return nameStr;
|
||||
return (String [])printerInfo.clone();
|
||||
}
|
||||
}
|
||||
os.close();
|
||||
@ -322,7 +333,7 @@ public class CUPSPrinter {
|
||||
/**
|
||||
* Get list of all CUPS printers using IPP.
|
||||
*/
|
||||
public static String[] getAllPrinters() {
|
||||
static String[] getAllPrinters() {
|
||||
try {
|
||||
URL url = new URL("http", getServer(), getPort(), "");
|
||||
|
||||
|
@ -366,6 +366,7 @@ public class IPPPrintService implements PrintService, SunPrinterJobService {
|
||||
" IPPPrintService, myURL="+
|
||||
myURL+" Exception= "+
|
||||
e);
|
||||
throw new IllegalArgumentException("invalid url");
|
||||
}
|
||||
|
||||
isCupsPrinter = isCups;
|
||||
@ -1145,6 +1146,8 @@ public class IPPPrintService implements PrintService, SunPrinterJobService {
|
||||
// REMIND: check attribute values
|
||||
return (T)PDLOverrideSupported.NOT_ATTEMPTED;
|
||||
}
|
||||
} else if (category == PrinterURI.class) {
|
||||
return (T)(new PrinterURI(myURI));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
@ -48,6 +48,7 @@ import javax.print.attribute.PrintRequestAttributeSet;
|
||||
import javax.print.attribute.PrintServiceAttribute;
|
||||
import javax.print.attribute.PrintServiceAttributeSet;
|
||||
import javax.print.attribute.standard.PrinterName;
|
||||
import javax.print.attribute.standard.PrinterURI;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.net.URL;
|
||||
@ -203,6 +204,33 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
}
|
||||
}
|
||||
|
||||
private int addPrintServiceToList(ArrayList printerList, PrintService ps) {
|
||||
int index = printerList.indexOf(ps);
|
||||
// Check if PrintService with same name is already in the list.
|
||||
if (CUPSPrinter.isCupsRunning() && index != -1) {
|
||||
// Bug in Linux: Duplicate entry of a remote printer
|
||||
// and treats it as local printer but it is returning wrong
|
||||
// information when queried using IPP. Workaround is to remove it.
|
||||
// Even CUPS ignores these entries as shown in lpstat or using
|
||||
// their web configuration.
|
||||
PrinterURI uri = (PrinterURI)ps.getAttribute(PrinterURI.class);
|
||||
if (uri.getURI().getHost().equals("localhost")) {
|
||||
IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, ignoring the new local printer: "+ps);
|
||||
return index; // Do not add this.
|
||||
}
|
||||
PrintService oldPS = (PrintService)(printerList.get(index));
|
||||
uri = (PrinterURI)oldPS.getAttribute(PrinterURI.class);
|
||||
if (uri.getURI().getHost().equals("localhost")) {
|
||||
IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, removing existing local printer: "+oldPS);
|
||||
printerList.remove(oldPS);
|
||||
} else {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
printerList.add(ps);
|
||||
return (printerList.size() - 1);
|
||||
}
|
||||
|
||||
|
||||
// refreshes "printServices"
|
||||
public synchronized void refreshServices() {
|
||||
@ -246,8 +274,7 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
}
|
||||
if ((defaultPrintService != null)
|
||||
&& printers[p].equals(getPrinterDestName(defaultPrintService))) {
|
||||
printerList.add(defaultPrintService);
|
||||
defaultIndex = printerList.size() - 1;
|
||||
defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
|
||||
} else {
|
||||
if (printServices == null) {
|
||||
IPPPrintService.debug_println(debugPrefix+
|
||||
@ -255,9 +282,10 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
|
||||
if (CUPSPrinter.isCupsRunning()) {
|
||||
try {
|
||||
printerList.add(new IPPPrintService(printers[p],
|
||||
printerURIs[p],
|
||||
true));
|
||||
addPrintServiceToList(printerList,
|
||||
new IPPPrintService(printers[p],
|
||||
printerURIs[p],
|
||||
true));
|
||||
} catch (Exception e) {
|
||||
IPPPrintService.debug_println(debugPrefix+
|
||||
" getAllPrinters Exception "+
|
||||
@ -282,10 +310,10 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
if (j == printServices.length) { // not found?
|
||||
if (CUPSPrinter.isCupsRunning()) {
|
||||
try {
|
||||
printerList.add(new IPPPrintService(
|
||||
printers[p],
|
||||
printerURIs[p],
|
||||
true));
|
||||
addPrintServiceToList(printerList,
|
||||
new IPPPrintService(printers[p],
|
||||
printerURIs[p],
|
||||
true));
|
||||
} catch (Exception e) {
|
||||
IPPPrintService.debug_println(debugPrefix+
|
||||
" getAllPrinters Exception "+
|
||||
@ -312,9 +340,7 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
|
||||
//if defaultService is not found in printerList
|
||||
if (defaultIndex == -1 && defaultPrintService != null) {
|
||||
//add default to the list
|
||||
printerList.add(defaultPrintService);
|
||||
defaultIndex = printerList.size() - 1;
|
||||
defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
|
||||
}
|
||||
|
||||
printServices = (PrintService[])printerList.toArray(
|
||||
@ -563,11 +589,14 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
|
||||
// clear defaultPrintService
|
||||
defaultPrintService = null;
|
||||
String psuri = null;
|
||||
|
||||
IPPPrintService.debug_println("isRunning ? "+
|
||||
(CUPSPrinter.isCupsRunning()));
|
||||
if (CUPSPrinter.isCupsRunning()) {
|
||||
defaultPrinter = CUPSPrinter.getDefaultPrinter();
|
||||
String[] printerInfo = CUPSPrinter.getDefaultPrinter();
|
||||
defaultPrinter = printerInfo[0];
|
||||
psuri = printerInfo[1];
|
||||
} else {
|
||||
if (isMac() || isSysV()) {
|
||||
defaultPrinter = getDefaultPrinterNameSysV();
|
||||
@ -590,12 +619,17 @@ public class UnixPrintServiceLookup extends PrintServiceLookup
|
||||
if (defaultPrintService == null) {
|
||||
if (CUPSPrinter.isCupsRunning()) {
|
||||
try {
|
||||
PrintService defaultPS =
|
||||
new IPPPrintService(defaultPrinter,
|
||||
PrintService defaultPS;
|
||||
if (psuri != null) {
|
||||
defaultPS = new IPPPrintService(defaultPrinter,
|
||||
psuri, true);
|
||||
} else {
|
||||
defaultPS = new IPPPrintService(defaultPrinter,
|
||||
new URL("http://"+
|
||||
CUPSPrinter.getServer()+":"+
|
||||
CUPSPrinter.getPort()+"/"+
|
||||
defaultPrinter));
|
||||
}
|
||||
defaultPrintService = defaultPS;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
@ -523,12 +523,10 @@ JNIEXPORT jint JNICALL
|
||||
Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
|
||||
(JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
|
||||
jshortArray pixelsArray, jint x1, jint y1, jint x2, jint y2,
|
||||
jint numStops, jint repeat,
|
||||
jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
|
||||
jint numStops, jint repeat) {
|
||||
jint i;
|
||||
jshort* pixels;
|
||||
jfloat* fractions;
|
||||
XTransform tr;
|
||||
XRenderPictureAttributes pict_attr;
|
||||
Picture gradient = 0;
|
||||
XRenderColor *colors;
|
||||
@ -594,8 +592,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
|
||||
(*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
|
||||
|
||||
if (gradient != 0) {
|
||||
BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
|
||||
XRenderSetPictureTransform (awt_display, gradient, &tr);
|
||||
pict_attr.repeat = repeat;
|
||||
XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
|
||||
}
|
||||
@ -608,12 +604,11 @@ JNIEXPORT jint JNICALL
|
||||
Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
|
||||
(JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
|
||||
jshortArray pixelsArray, jint numStops,
|
||||
jint innerRadius, jint outerRadius, jint repeat,
|
||||
jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
|
||||
jint centerX, jint centerY,
|
||||
jint innerRadius, jint outerRadius, jint repeat) {
|
||||
jint i;
|
||||
jshort* pixels;
|
||||
jfloat* fractions;
|
||||
XTransform tr;
|
||||
XRenderPictureAttributes pict_attr;
|
||||
Picture gradient = 0;
|
||||
XRenderColor *colors;
|
||||
@ -637,11 +632,11 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
|
||||
return -1; //TODO release pixels first
|
||||
}
|
||||
|
||||
grad.inner.x = 0;
|
||||
grad.inner.y = 0;
|
||||
grad.inner.x = centerX;
|
||||
grad.inner.y = centerY;
|
||||
grad.inner.radius = innerRadius;
|
||||
grad.outer.x = 0;
|
||||
grad.outer.y = 0;
|
||||
grad.outer.x = centerX;
|
||||
grad.outer.y = centerY;
|
||||
grad.outer.radius = outerRadius;
|
||||
|
||||
/*TODO optimized & malloc check*/
|
||||
@ -682,8 +677,6 @@ Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
|
||||
|
||||
|
||||
if (gradient != 0) {
|
||||
BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
|
||||
XRenderSetPictureTransform (awt_display, gradient, &tr);
|
||||
pict_attr.repeat = repeat;
|
||||
XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
|
||||
}
|
||||
|
@ -183,10 +183,6 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
|
||||
/**
|
||||
* Values must match those defined in wingdi.h & commdlg.h
|
||||
*/
|
||||
private static final int PD_ALLPAGES = 0x00000000;
|
||||
private static final int PD_SELECTION = 0x00000001;
|
||||
private static final int PD_PAGENUMS = 0x00000002;
|
||||
private static final int PD_NOSELECTION = 0x00000004;
|
||||
private static final int PD_COLLATE = 0x00000010;
|
||||
private static final int PD_PRINTTOFILE = 0x00000020;
|
||||
private static final int DM_ORIENTATION = 0x00000001;
|
||||
@ -1639,63 +1635,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
|
||||
}
|
||||
}
|
||||
|
||||
//returns 1-based index for "From" page
|
||||
private final int getFromPageAttrib() {
|
||||
if (attributes != null) {
|
||||
PageRanges pageRangesAttr =
|
||||
(PageRanges)attributes.get(PageRanges.class);
|
||||
if (pageRangesAttr != null) {
|
||||
int[][] range = pageRangesAttr.getMembers();
|
||||
return range[0][0];
|
||||
}
|
||||
}
|
||||
return getMinPageAttrib();
|
||||
}
|
||||
|
||||
//returns 1-based index for "To" page
|
||||
private final int getToPageAttrib() {
|
||||
if (attributes != null) {
|
||||
PageRanges pageRangesAttr =
|
||||
(PageRanges)attributes.get(PageRanges.class);
|
||||
if (pageRangesAttr != null) {
|
||||
int[][] range = pageRangesAttr.getMembers();
|
||||
return range[range.length-1][1];
|
||||
}
|
||||
}
|
||||
return getMaxPageAttrib();
|
||||
}
|
||||
|
||||
private final int getMinPageAttrib() {
|
||||
if (attributes != null) {
|
||||
SunMinMaxPage s =
|
||||
(SunMinMaxPage)attributes.get(SunMinMaxPage.class);
|
||||
if (s != null) {
|
||||
return s.getMin();
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
private final int getMaxPageAttrib() {
|
||||
if (attributes != null) {
|
||||
SunMinMaxPage s =
|
||||
(SunMinMaxPage)attributes.get(SunMinMaxPage.class);
|
||||
if (s != null) {
|
||||
return s.getMax();
|
||||
}
|
||||
}
|
||||
|
||||
Pageable pageable = getPageable();
|
||||
if (pageable != null) {
|
||||
int numPages = pageable.getNumberOfPages();
|
||||
if (numPages <= Pageable.UNKNOWN_NUMBER_OF_PAGES) {
|
||||
numPages = MAX_UNKNOWN_PAGES;
|
||||
}
|
||||
return ((numPages == 0) ? 1 : numPages);
|
||||
}
|
||||
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
private final boolean getDestAttrib() {
|
||||
return (mDestination != null);
|
||||
@ -1847,20 +1787,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
|
||||
return mAttMediaTray;
|
||||
}
|
||||
|
||||
private final int getSelectAttrib() {
|
||||
if (attributes != null) {
|
||||
SunPageSelection pages =
|
||||
(SunPageSelection)attributes.get(SunPageSelection.class);
|
||||
if (pages == SunPageSelection.RANGE) {
|
||||
return PD_PAGENUMS;
|
||||
} else if (pages == SunPageSelection.SELECTION) {
|
||||
return PD_SELECTION;
|
||||
} else if (pages == SunPageSelection.ALL) {
|
||||
return PD_ALLPAGES;
|
||||
}
|
||||
}
|
||||
return PD_NOSELECTION;
|
||||
}
|
||||
|
||||
|
||||
private final boolean getPrintToFileEnabled() {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
|
@ -53,26 +53,73 @@ static const ADAPTER_INFO badHardware[] = {
|
||||
|
||||
// Intel HD
|
||||
// Clarkdale (Desktop) GMA HD Lines
|
||||
{ 0x8086, 0x0042, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0042, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0042, D_VERSION(6,14,10,5394), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0042, D_VERSION(8,15,10,2993), OS_VISTA | OS_WINDOWS7 },
|
||||
// Arrandale (Mobile) GMA HD Lines
|
||||
{ 0x8086, 0x0046, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0046, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
// Sandy Bridge GMA HD Lines
|
||||
{ 0x8086, 0x0102, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0102, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0106, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0106, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0112, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0112, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0116, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0116, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0122, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0122, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0126, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0126, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x010A, D_VERSION(6,14,10,5337), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x010A, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0046, D_VERSION(6,14,10,5394), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0046, D_VERSION(8,15,10,2993), OS_VISTA | OS_WINDOWS7 },
|
||||
|
||||
// Sandy Bridge HD Graphics 3000/2000
|
||||
{ 0x8086, 0x0102, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0102, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0106, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0106, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0112, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0112, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0116, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0116, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0122, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0122, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0126, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0126, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x010A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x010A, D_VERSION(9,17,10,3223), OS_VISTA | OS_WINDOWS7 },
|
||||
|
||||
// Ivy Bridge
|
||||
{ 0x8086, 0x0162, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0162, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0166, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0166, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x016A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x016A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0152, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0152, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0156, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0156, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x015A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x015A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
|
||||
// Haswell
|
||||
{ 0x8086, 0x0402, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0402, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0406, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0406, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0412, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0412, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0416, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0416, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x041E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x041E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x040A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x040A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x041A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x041A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A06, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A06, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A16, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A16, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A26, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A26, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A2E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A2E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A1E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A1E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0A0E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0A0E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0D26, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0D26, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x0D22, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x0D22, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 },
|
||||
|
||||
// Reason: workaround for 6620073, 6612195
|
||||
// Intel 740
|
||||
@ -123,33 +170,33 @@ static const ADAPTER_INFO badHardware[] = {
|
||||
{ 0x8086, 0x2A13, NO_VERSION, OS_ALL },
|
||||
|
||||
// Eaglelake (Desktop) GMA 4500 Lines
|
||||
{ 0x8086, 0x2E42, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E42, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E43, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E43, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E92, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E92, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E93, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E93, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E12, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E12, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E13, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E13, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E42, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E42, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E43, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E43, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E92, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E92, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E93, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E93, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E12, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E12, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E13, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E13, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
// Eaglelake (Desktop) GMA X4500 Lines
|
||||
{ 0x8086, 0x2E32, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E32, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E33, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E33, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E22, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E22, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E32, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E32, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E33, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E33, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E22, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E22, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
// Eaglelake (Desktop) GMA X4500HD Lines
|
||||
{ 0x8086, 0x2E23, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E23, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2E23, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2E23, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
// Cantiga (Mobile) GMA 4500MHD Lines
|
||||
{ 0x8086, 0x2A42, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2A42, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2A43, D_VERSION(6,14,10,5303), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2A43, D_VERSION(8,15,10,2302), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2A42, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2A42, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
{ 0x8086, 0x2A43, D_VERSION(6,14,10,5420), OS_WINXP | OS_WINXP_64 },
|
||||
{ 0x8086, 0x2A43, D_VERSION(8,15,10,2869), OS_VISTA | OS_WINDOWS7 },
|
||||
|
||||
// ATI Mobility Radeon X1600, X1400, X1450, X1300, X1350
|
||||
// Reason: workaround for 6613066, 6687166
|
||||
|
126
jdk/test/java/awt/GradientPaint/GradientTransformTest.java
Normal file
126
jdk/test/java/awt/GradientPaint/GradientTransformTest.java
Normal file
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.*;
|
||||
import java.awt.MultipleGradientPaint.*;
|
||||
import java.awt.geom.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8023483
|
||||
* @summary tests if the transform-parameter is applied correctly when creating
|
||||
* a gradient.
|
||||
* @author ceisserer
|
||||
*/
|
||||
public class GradientTransformTest extends Frame {
|
||||
BufferedImage srcImg;
|
||||
Image dstImg;
|
||||
|
||||
public GradientTransformTest() {
|
||||
srcImg = createSrcImage();
|
||||
dstImg = getGraphicsConfiguration().createCompatibleVolatileImage(20,
|
||||
20);
|
||||
}
|
||||
|
||||
protected void renderToVI(BufferedImage src, Image dst) {
|
||||
Graphics2D g = (Graphics2D) dst.getGraphics();
|
||||
|
||||
g.setColor(Color.WHITE);
|
||||
g.fillRect(0, 0, dst.getWidth(null), dst.getHeight(null));
|
||||
|
||||
AffineTransform at = new AffineTransform();
|
||||
at.translate(-100, 0);
|
||||
|
||||
g.setPaint(new LinearGradientPaint(new Point2D.Float(100, 0),
|
||||
new Point2D.Float(120, 0), new float[] { 0.0f, 0.75f, 1.0f },
|
||||
new Color[] { Color.red, Color.green, Color.blue },
|
||||
CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, at));
|
||||
|
||||
g.fillRect(-10, -10, 30, 30);
|
||||
}
|
||||
|
||||
public void paint(Graphics g1) {
|
||||
Graphics2D g = (Graphics2D) g1;
|
||||
renderToVI(createSrcImage(), dstImg);
|
||||
g.drawImage(dstImg, 20, 20, null);
|
||||
}
|
||||
|
||||
public void showFrame() {
|
||||
setSize(500, 500);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public void test() {
|
||||
renderToVI(createSrcImage(), dstImg);
|
||||
|
||||
BufferedImage validationImg = new BufferedImage(20, 20,
|
||||
BufferedImage.TYPE_INT_RGB);
|
||||
Graphics2D valG = (Graphics2D) validationImg.getGraphics();
|
||||
valG.drawImage(dstImg, 0, 0, null);
|
||||
|
||||
// Loop over all pixel, and count the different pixel values
|
||||
// encountered.
|
||||
boolean gradientTranslated = false;
|
||||
for (int x = 0; x < validationImg.getWidth() && !gradientTranslated; x++) {
|
||||
for (int y = 0; y < validationImg.getHeight()
|
||||
&& !gradientTranslated; y++) {
|
||||
int rgb = validationImg.getRGB(x, y);
|
||||
if (rgb != -65279) {
|
||||
gradientTranslated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gradientTranslated) {
|
||||
System.out.println("Passed!");
|
||||
} else {
|
||||
throw new RuntimeException("Test FAILED!");
|
||||
}
|
||||
}
|
||||
|
||||
protected BufferedImage createSrcImage() {
|
||||
BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
|
||||
Graphics2D g = (Graphics2D) bi.getGraphics();
|
||||
g.setColor(Color.YELLOW);
|
||||
g.fillRect(0, 0, 10, 10);
|
||||
g.setColor(Color.black);
|
||||
g.drawLine(0, 0, 10, 10);
|
||||
return bi;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean show = (args.length > 0 && "-show".equals(args[0]));
|
||||
final GradientTransformTest t = new GradientTransformTest();
|
||||
|
||||
if (show) {
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
t.showFrame();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
t.test();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.*;
|
||||
import java.awt.MultipleGradientPaint.*;
|
||||
import java.awt.geom.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8023483
|
||||
* @summary tests wether the colorspace-parameter is applied correctly when
|
||||
* creating a gradient.
|
||||
* @author ceisserer
|
||||
*/
|
||||
public class LinearColorSpaceGradientTest extends Frame {
|
||||
BufferedImage srcImg;
|
||||
Image dstImg;
|
||||
|
||||
public LinearColorSpaceGradientTest() {
|
||||
srcImg = createSrcImage();
|
||||
dstImg = getGraphicsConfiguration().createCompatibleVolatileImage(20,
|
||||
20);
|
||||
}
|
||||
|
||||
protected void renderToVI(BufferedImage src, Image dst) {
|
||||
Graphics2D g = (Graphics2D) dst.getGraphics();
|
||||
|
||||
g.setColor(Color.WHITE);
|
||||
g.fillRect(0, 0, dst.getWidth(null), dst.getHeight(null));
|
||||
|
||||
AffineTransform at = new AffineTransform();
|
||||
g.setPaint(new LinearGradientPaint(new Point2D.Float(0, 0),
|
||||
new Point2D.Float(20, 0), new float[] { 0.0f, 1.0f },
|
||||
new Color[] { Color.green, Color.blue }, CycleMethod.NO_CYCLE,
|
||||
ColorSpaceType.LINEAR_RGB, at));
|
||||
|
||||
g.fillRect(-10, -10, 30, 30);
|
||||
}
|
||||
|
||||
public void paint(Graphics g1) {
|
||||
Graphics2D g = (Graphics2D) g1;
|
||||
renderToVI(createSrcImage(), dstImg);
|
||||
g.drawImage(dstImg, 20, 20, null);
|
||||
}
|
||||
|
||||
public void showFrame() {
|
||||
setSize(500, 500);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public void test() {
|
||||
renderToVI(createSrcImage(), dstImg);
|
||||
|
||||
BufferedImage validationImg = new BufferedImage(20, 20,
|
||||
BufferedImage.TYPE_INT_RGB);
|
||||
Graphics2D valG = (Graphics2D) validationImg.getGraphics();
|
||||
valG.drawImage(dstImg, 0, 0, null);
|
||||
|
||||
int b = validationImg.getRGB(10, 10) & 0x000000FF;
|
||||
|
||||
if (b > 150) {
|
||||
System.out.println("Passed!");
|
||||
} else {
|
||||
throw new RuntimeException("Test FAILED!");
|
||||
}
|
||||
}
|
||||
|
||||
protected BufferedImage createSrcImage() {
|
||||
BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
|
||||
Graphics2D g = (Graphics2D) bi.getGraphics();
|
||||
g.setColor(Color.YELLOW);
|
||||
g.fillRect(0, 0, 10, 10);
|
||||
g.setColor(Color.black);
|
||||
g.drawLine(0, 0, 10, 10);
|
||||
return bi;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean show = (args.length > 0 && "-show".equals(args[0]));
|
||||
|
||||
final LinearColorSpaceGradientTest t = new LinearColorSpaceGradientTest();
|
||||
if (show) {
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
t.showFrame();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
t.test();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 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,8 +23,8 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4851363
|
||||
* @summary Tests the save to file dialog has a title
|
||||
* @bug 4851363 8025988 8025990
|
||||
* @summary Tests the save to file dialog has a title.
|
||||
* @run main/manual=yesno/othervm SaveDialogTitleTest
|
||||
*/
|
||||
|
||||
@ -37,12 +37,21 @@ public class SaveDialogTitleTest {
|
||||
System.out.print("Once the dialog appears, press OK and the ");
|
||||
System.out.print("Save to File dialog should appear and it ");
|
||||
System.out.println("must have a window title else the test fails.");
|
||||
System.out.println("To test 8025988: Range should be selected with pages 3 to 8.");
|
||||
System.out.println("To test 8025990: Paper should be Legal and in Landscape.");
|
||||
Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
JobAttributes jobAttributes = new JobAttributes();
|
||||
jobAttributes.setDestination(JobAttributes.DestinationType.FILE);
|
||||
jobAttributes.setDefaultSelection(JobAttributes.DefaultSelectionType.RANGE);
|
||||
jobAttributes.setPageRanges(new int[][]{new int[]{3,8}});
|
||||
PageAttributes page = new PageAttributes();
|
||||
page.setMedia(PageAttributes.MediaType.LEGAL);
|
||||
page.setOrientationRequested(PageAttributes.
|
||||
OrientationRequestedType.LANDSCAPE);
|
||||
|
||||
PrintJob printJob =
|
||||
tk.getPrintJob(new Frame(), "Save Title Test",
|
||||
jobAttributes, null);
|
||||
jobAttributes, page);
|
||||
if (printJob != null) { // in case user cancels.
|
||||
printJob.end();
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 800535
|
||||
* @bug 800535 8022536
|
||||
* @summary JDK7 Printing: CJK and Latin Text in string overlap
|
||||
* @run main/manual=yesno PrintLatinCJKTest
|
||||
*/
|
||||
@ -49,6 +49,8 @@ public class PrintLatinCJKTest implements Printable, ActionListener {
|
||||
private PageFormat pf;
|
||||
|
||||
static String info =
|
||||
"To test 8022536, if a remote printer is the system default,"+
|
||||
"it should show in the dialog as the selected printer.\n"+
|
||||
"You need a printer for this test. If you have none, let "+
|
||||
"the test pass. If there is a printer, press Print, send "+
|
||||
"the output to the printer, and examine it. It should have "+
|
||||
|
144
jdk/test/java/awt/print/PrinterJob/PrintToDir.java
Normal file
144
jdk/test/java/awt/print/PrinterJob/PrintToDir.java
Normal file
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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 4973278 8015586
|
||||
@run main PrintToDir
|
||||
@summary Must throw exception when printing to an invalid filename - a dir.
|
||||
*/
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.awt.*;
|
||||
import java.awt.geom.*;
|
||||
import java.awt.print.*;
|
||||
import javax.print.PrintService;
|
||||
import javax.print.attribute.*;
|
||||
import javax.print.attribute.standard.*;
|
||||
import java.util.PropertyPermission;
|
||||
|
||||
public class PrintToDir extends Frame implements Printable {
|
||||
|
||||
boolean firstTime = true;
|
||||
double sx, sy;
|
||||
Shape clip, firstClip;
|
||||
|
||||
TextField tf = new TextField();
|
||||
Label tfLabel = new Label ("File Name");
|
||||
Panel p = new Panel (new GridLayout(2,2));
|
||||
Button b = new Button("Print");
|
||||
|
||||
PrintToDir() {
|
||||
add("South", p);
|
||||
p.add(tfLabel);
|
||||
p.add(tf);
|
||||
p.add(b);
|
||||
setSize(300, 300);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public int print(Graphics g, PageFormat pf, int pageIndex) {
|
||||
Graphics2D g2 = (Graphics2D)g;
|
||||
if (pageIndex>=1) {
|
||||
return Printable.NO_SUCH_PAGE;
|
||||
}
|
||||
g2.drawString("hello world", 100, 100);
|
||||
return Printable.PAGE_EXISTS;
|
||||
}
|
||||
|
||||
void doPrintJob(String fileStr) {
|
||||
PageAttributes pa = new PageAttributes();
|
||||
JobAttributes ja = new JobAttributes();
|
||||
ja.setDialog(JobAttributes.DialogType.NONE);
|
||||
ja.setDestination(JobAttributes.DestinationType.FILE);
|
||||
ja.setFileName(fileStr);
|
||||
try {
|
||||
PrintJob pjob = Toolkit.getDefaultToolkit().getPrintJob(this,
|
||||
"PrintDialog Testing", ja, pa);
|
||||
if (pjob != null) {
|
||||
System.out.println("Printjob successfully created: " + pjob);
|
||||
Graphics g = pjob.getGraphics();
|
||||
this.printAll(g);
|
||||
g.dispose();
|
||||
pjob.end();
|
||||
}
|
||||
System.out.println("Printing completed");
|
||||
} catch (IllegalArgumentException e) {
|
||||
System.out.println("PrintJob passed.");
|
||||
return;
|
||||
}
|
||||
throw new RuntimeException("PrintJob::IllegalArgumentException expected but not thrown. \nTEST FAILED");
|
||||
}
|
||||
|
||||
public static void doPrinterJob(String fileStr, OrientationRequested o) {
|
||||
PrinterJob pj = PrinterJob.getPrinterJob();
|
||||
PrintService ps = pj.getPrintService();
|
||||
if (ps == null) {
|
||||
System.out.println("No print service found.");
|
||||
return;
|
||||
}
|
||||
pj.setPrintable(new PrintToDir());
|
||||
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
|
||||
aset.add(o);
|
||||
File f = new File(fileStr);
|
||||
// f.deleteOnExit();
|
||||
URI dest = f.toURI();
|
||||
Destination d = new Destination(dest);
|
||||
if (ps.isAttributeValueSupported(d, null, null)) {
|
||||
aset.add(d);
|
||||
try {
|
||||
pj.print(aset);
|
||||
} catch (PrinterException e) {
|
||||
System.out.println("PrinterJob passed.");
|
||||
return;
|
||||
}
|
||||
throw new RuntimeException("PrinterJob:PrinterException expected but not thrown. \nTEST FAILED");
|
||||
} else {
|
||||
System.out.println("Destination attribute is not a supported value. PrinterJob passed.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String arg[]) {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
System.out.println("Security manager detected");
|
||||
try {
|
||||
security.checkPermission(new FilePermission("<<ALL FILES>>", "read,write"));
|
||||
security.checkPermission(new PropertyPermission("user.dir", "read"));
|
||||
} catch (SecurityException se) {
|
||||
System.out.println("Security requirement not obtained. TEST PASSED");
|
||||
return;
|
||||
}
|
||||
}
|
||||
String[] testStr = {".", ""};
|
||||
for (int i=0; i<testStr.length; i++) {
|
||||
System.out.println("Testing file name = \""+testStr[i]+"\"");
|
||||
doPrinterJob(testStr[i], OrientationRequested.PORTRAIT);
|
||||
PrintToDir ptd = new PrintToDir();
|
||||
ptd.doPrintJob(testStr[i]);
|
||||
ptd.dispose();
|
||||
}
|
||||
System.out.println("TEST PASSED");
|
||||
}
|
||||
|
||||
}
|
@ -30,7 +30,7 @@
|
||||
* @author Mandy Chung
|
||||
*
|
||||
* @build ThreadStateTest
|
||||
* @run main ThreadStateTest
|
||||
* @run main/othervm -Xmixed ThreadStateTest
|
||||
*/
|
||||
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
|
61
jdk/test/javax/print/TextFlavorTest.java
Normal file
61
jdk/test/javax/print/TextFlavorTest.java
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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 6334074 8022536
|
||||
@summary test supported text flavors reported properly
|
||||
@run main TextFlavorTest
|
||||
*/
|
||||
|
||||
import javax.print.*;
|
||||
import javax.print.attribute.standard.*;
|
||||
import javax.print.attribute.*;
|
||||
import java.io.*;
|
||||
|
||||
public class TextFlavorTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
PrintService service[] =
|
||||
PrintServiceLookup.lookupPrintServices(null, null);
|
||||
|
||||
if (service.length == 0) {
|
||||
System.out.println("No print service found.");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int y = 0; y < service.length; y ++) {
|
||||
DocFlavor flavors[] = service[y].getSupportedDocFlavors();
|
||||
if (flavors == null) continue;
|
||||
for (int x = 0; x < flavors.length; x ++) {
|
||||
if (!service[y].isDocFlavorSupported(flavors[x])) {
|
||||
String msg = "DocFlavor " + flavors[x] +
|
||||
" is not supported by service "+ service[y];
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6689025
|
||||
* @bug 6689025 8023483
|
||||
* @summary Tests that transformed Paints are rendered correctly
|
||||
* @author Dmitri.Trembovetski@sun.com: area=Graphics
|
||||
* @run main/othervm TransformedPaintTest
|
||||
|
Loading…
Reference in New Issue
Block a user