This commit is contained in:
Lana Steuck 2013-10-31 15:45:57 -07:00
commit be32b11e5b
41 changed files with 1409 additions and 565 deletions

View File

@ -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

View File

@ -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);
}
}
/*

View File

@ -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;

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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() {

View File

@ -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.

View File

@ -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.

View File

@ -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);

View File

@ -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;

View File

@ -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++) {

View File

@ -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();

View File

@ -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);

View File

@ -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) {

View File

@ -54,6 +54,7 @@ public class XRColor {
}
public XRColor(Color color) {
setColorValues(color);
}
public void setColorValues(Color color) {

View File

@ -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() {

View File

@ -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;
}
}

View File

@ -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 {

View File

@ -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);

View File

@ -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));
}
}

View 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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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(), "");

View File

@ -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;
}

View File

@ -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) {
}

View File

@ -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);
}

View File

@ -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();

View File

@ -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

View 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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}

View File

@ -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 "+

View 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");
}
}

View File

@ -30,7 +30,7 @@
* @author Mandy Chung
*
* @build ThreadStateTest
* @run main ThreadStateTest
* @run main/othervm -Xmixed ThreadStateTest
*/
import java.util.concurrent.locks.LockSupport;

View 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.");
}
}

View File

@ -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