# HG changeset patch # User lana # Date 1369871688 25200 # Node ID 94c0b51089af79d996f76cfbe9ff49698070e8b9 # Parent 9367be329f29152e16fa2f78424c409d9bc9c1ec# Parent d76d0c992e34f44b987b6a0837cc3c7f46c2fb7f Merge diff -r 9367be329f29 -r 94c0b51089af jdk/make/sun/awt/FILES_c_unix.gmk --- a/jdk/make/sun/awt/FILES_c_unix.gmk Thu May 23 10:47:50 2013 -0700 +++ b/jdk/make/sun/awt/FILES_c_unix.gmk Wed May 29 16:54:48 2013 -0700 @@ -171,3 +171,13 @@ GLXSurfaceData.c \ AccelGlyphCache.c \ CUPSfuncs.c + +ifeq ($(PLATFORM), macosx) +FILES_NO_MOTIF_objc = \ + AWTFont.m \ + AWTStrike.m \ + CCharToGlyphMapper.m \ + CGGlyphImages.m \ + CGGlyphOutlines.m \ + CoreTextSupport.m +endif # PLATFORM diff -r 9367be329f29 -r 94c0b51089af jdk/make/sun/awt/FILES_export_unix.gmk --- a/jdk/make/sun/awt/FILES_export_unix.gmk Thu May 23 10:47:50 2013 -0700 +++ b/jdk/make/sun/awt/FILES_export_unix.gmk Wed May 29 16:54:48 2013 -0700 @@ -187,3 +187,14 @@ java/awt/dnd/DnDConstants.java \ sun/awt/CausedFocusEvent.java +ifeq ($(PLATFORM), macosx) +ifeq ($(HEADLESS), true) +FILES_export += \ + sun/awt/SunHints.java \ + sun/font/CCharToGlyphMapper.java \ + sun/font/CFont.java \ + sun/font/CFontManager.java \ + sun/font/CStrike.java \ + sun/font/CStrikeDisposer.java +endif # HEADLESS +endif # PLATFORM diff -r 9367be329f29 -r 94c0b51089af jdk/make/sun/awt/mawt.gmk --- a/jdk/make/sun/awt/mawt.gmk Thu May 23 10:47:50 2013 -0700 +++ b/jdk/make/sun/awt/mawt.gmk Wed May 29 16:54:48 2013 -0700 @@ -43,6 +43,10 @@ # compiled based on the motif version. FILES_c = $(FILES_NO_MOTIF_c) +ifeq ($(PLATFORM), macosx) +FILES_objc = $(FILES_NO_MOTIF_objc) +endif # PLATFORM + ifeq ($(PLATFORM), solaris) ifneq ($(ARCH), amd64) FILES_reorder += reorder-$(ARCH) @@ -97,6 +101,10 @@ vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)/image vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/robot_child +ifeq ($(PLATFORM), macosx) +vpath %.m $(call NativeSrcDirList,,native/sun/font) +endif # PLATFORM + # # Libraries to link in. # @@ -192,13 +200,21 @@ $(EVENT_MODEL) ifeq ($(PLATFORM), macosx) -CPPFLAGS += -I$(CUPS_HEADERS_PATH) +CPPFLAGS += -I$(CUPS_HEADERS_PATH) \ + $(call NativeSrcDirList,-I,native/sun/awt) \ + $(call NativeSrcDirList,-I,native/sun/font) ifndef HEADLESS CPPFLAGS += -I$(MOTIF_DIR)/include \ -I$(OPENWIN_HOME)/include LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB) - +else +LDFLAGS += -framework Accelerate \ + -framework ApplicationServices \ + -framework Cocoa \ + -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ + -framework JavaNativeFoundation \ + -framework JavaRuntimeSupport endif # !HEADLESS endif # PLATFORM diff -r 9367be329f29 -r 94c0b51089af jdk/makefiles/CompileNativeLibraries.gmk --- a/jdk/makefiles/CompileNativeLibraries.gmk Thu May 23 10:47:50 2013 -0700 +++ b/jdk/makefiles/CompileNativeLibraries.gmk Wed May 29 16:54:48 2013 -0700 @@ -2314,6 +2314,10 @@ $(JDK_TOPDIR)/src/solaris/native/sun/java2d/opengl \ $(JDK_TOPDIR)/src/solaris/native/sun/java2d/x11 +ifeq ($(OPENJDK_TARGET_OS),macosx) + LIBAWT_HEADLESS_DIRS+=$(JDK_TOPDIR)/src/macosx/native/sun/font +endif + LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \ -DX11_PATH=\"$(X11_PATH)\" -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" \ $(CUPS_CFLAGS) \ @@ -2328,6 +2332,12 @@ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/jdga \ $(foreach dir,$(LIBAWT_HEADLESS_DIRS),-I$(dir)) +ifeq ($(OPENJDK_TARGET_OS),macosx) + LIBAWT_HEADLESS_CFLAGS+=\ + -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ + -F/System/Library/Frameworks/ApplicationServices.framework/Frameworks +endif + LIBAWT_HEADLESS_FILES:=\ awt_Font.c \ HeadlessToolkit.c \ @@ -2356,6 +2366,16 @@ AccelGlyphCache.c \ CUPSfuncs.c +ifeq ($(OPENJDK_TARGET_OS),macosx) + LIBAWT_HEADLESS_FILES+=\ + AWTFont.m \ + AWTStrike.m \ + CCharToGlyphMapper.m \ + CGGlyphImages.m \ + CGGlyphOutlines.m \ + CoreTextSupport.m +endif + LIBAWT_HEADLESS_REORDER:= ifeq ($(OPENJDK_TARGET_OS), solaris) ifneq ($(OPENJDK_TARGET_CPU), x86_64) @@ -2382,7 +2402,13 @@ REORDER:=$(LIBAWT_HEADLESS_REORDER), \ LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\ LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\ - LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava,\ + LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava \ + -framework Accelerate \ + -framework ApplicationServices \ + -framework Cocoa \ + -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ + -framework JavaNativeFoundation \ + -framework JavaRuntimeSupport,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless,\ DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) diff -r 9367be329f29 -r 94c0b51089af jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Wed May 29 16:54:48 2013 -0700 @@ -36,6 +36,7 @@ import javax.print.*; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.standard.PageRanges; import sun.java2d.*; import sun.print.*; @@ -173,6 +174,19 @@ if (nsPrintInfo != null) { fNSPrintInfo = nsPrintInfo.getValue(); } + + PageRanges pageRangesAttr = (PageRanges)attributes.get(PageRanges.class); + if (isSupportedValue(pageRangesAttr, attributes)) { + SunPageSelection rangeSelect = (SunPageSelection)attributes.get(SunPageSelection.class); + // If rangeSelect is not null, we are using AWT's print dialog that has + // All, Selection, and Range radio buttons + if (rangeSelect == null || rangeSelect == SunPageSelection.RANGE) { + int[][] range = pageRangesAttr.getMembers(); + // setPageRange will set firstPage and lastPage as called in getFirstPage + // and getLastPage + setPageRange(range[0][0] - 1, range[0][1] - 1); + } + } } volatile boolean onEventThread; @@ -225,7 +239,6 @@ * the end of the document. Note that firstPage * and lastPage are 0 based page indices. */ - int numPages = mDocument.getNumberOfPages(); int firstPage = getFirstPage(); int lastPage = getLastPage(); @@ -242,42 +255,53 @@ userCancelled = false; } - if (EventQueue.isDispatchThread()) { - // This is an AWT EventQueue, and this print rendering loop needs to block it. - - onEventThread = true; + //Add support for PageRange + PageRanges pr = (attributes == null) ? null + : (PageRanges)attributes.get(PageRanges.class); + int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers(); + int loopi = 0; + do { + if (EventQueue.isDispatchThread()) { + // This is an AWT EventQueue, and this print rendering loop needs to block it. - printingLoop = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public SecondaryLoop run() { - return Toolkit.getDefaultToolkit() - .getSystemEventQueue() - .createSecondaryLoop(); - } - }); + onEventThread = true; + + printingLoop = AccessController.doPrivileged(new PrivilegedAction() { + @Override + public SecondaryLoop run() { + return Toolkit.getDefaultToolkit() + .getSystemEventQueue() + .createSecondaryLoop(); + } + }); - try { - // Fire off the print rendering loop on the AppKit thread, and don't have - // it wait and block this thread. - if (printLoop(false, firstPage, lastPage)) { - // Start a secondary loop on EDT until printing operation is finished or cancelled - printingLoop.enter(); + try { + // Fire off the print rendering loop on the AppKit thread, and don't have + // it wait and block this thread. + if (printLoop(false, firstPage, lastPage)) { + // Start a secondary loop on EDT until printing operation is finished or cancelled + printingLoop.enter(); + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); + } else { + // Fire off the print rendering loop on the AppKit, and block this thread + // until it is done. + // But don't actually block... we need to come back here! + onEventThread = false; + + try { + printLoop(true, firstPage, lastPage); + } catch (Exception e) { + e.printStackTrace(); + } } - } else { - // Fire off the print rendering loop on the AppKit, and block this thread - // until it is done. - // But don't actually block... we need to come back here! - onEventThread = false; - - try { - printLoop(true, firstPage, lastPage); - } catch (Exception e) { - e.printStackTrace(); + if (++loopi < prMembers.length) { + firstPage = prMembers[loopi][0]-1; + lastPage = prMembers[loopi][1] -1; } - } + } while (loopi < prMembers.length); } finally { synchronized (this) { // NOTE: Native code shouldn't allow exceptions out while diff -r 9367be329f29 -r 94c0b51089af jdk/src/macosx/native/sun/font/AWTFont.m --- a/jdk/src/macosx/native/sun/font/AWTFont.m Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/macosx/native/sun/font/AWTFont.m Wed May 29 16:54:48 2013 -0700 @@ -395,6 +395,7 @@ #pragma mark --- Miscellaneous JNI --- +#ifndef HEADLESS /* * Class: sun_awt_PlatformFont * Method: initIDs @@ -416,3 +417,4 @@ (JNIEnv *env, jclass cls) { } +#endif diff -r 9367be329f29 -r 94c0b51089af jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Wed May 29 16:54:48 2013 -0700 @@ -634,6 +634,8 @@ cmsFloat64Number dnum = 0.0; int sign = 1; + if (Buffer == NULL) return 0.0; + if (*Buffer == '-' || *Buffer == '+') { sign = (*Buffer == '-') ? -1 : 1; diff -r 9367be329f29 -r 94c0b51089af jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Wed May 29 16:54:48 2013 -0700 @@ -1021,6 +1021,8 @@ mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable); cmsFreeToneCurveTriple(LabTable); + if (mpe == NULL) return NULL; + mpe ->Implements = cmsSigLabV2toV4; return mpe; } diff -r 9367be329f29 -r 94c0b51089af jdk/src/solaris/classes/sun/print/IPPPrintService.java --- a/jdk/src/solaris/classes/sun/print/IPPPrintService.java Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/solaris/classes/sun/print/IPPPrintService.java Wed May 29 16:54:48 2013 -0700 @@ -1023,6 +1023,13 @@ // this is already supported in UnixPrintJob catList.add(Destination.class); + + // It is unfortunate that CUPS doesn't provide a way to query + // if printer supports collation but since most printers + // now supports collation and that most OS has a way + // of setting it, it is a safe assumption to just always + // include SheetCollate as supported attribute. + catList.add(SheetCollate.class); } // With the assumption that Chromaticity is equivalent to diff -r 9367be329f29 -r 94c0b51089af jdk/src/windows/classes/sun/awt/windows/WPathGraphics.java --- a/jdk/src/windows/classes/sun/awt/windows/WPathGraphics.java Thu May 23 10:47:50 2013 -0700 +++ b/jdk/src/windows/classes/sun/awt/windows/WPathGraphics.java Wed May 29 16:54:48 2013 -0700 @@ -549,6 +549,8 @@ userx += xAdvance; userpos.x += xAdvance; deviceTransform.transform(userpos, devpos); + devx = devpos.x; + devy = devpos.y; } } else { super.drawString(str, x, y, font, frc, targetW); diff -r 9367be329f29 -r 94c0b51089af jdk/test/java/awt/print/PrinterJob/Collate2DPrintingTest.java --- a/jdk/test/java/awt/print/PrinterJob/Collate2DPrintingTest.java Thu May 23 10:47:50 2013 -0700 +++ b/jdk/test/java/awt/print/PrinterJob/Collate2DPrintingTest.java Wed May 29 16:54:48 2013 -0700 @@ -23,7 +23,7 @@ /** * @test - * @bug 6362683 + * @bug 6362683 8012381 * @summary Collation should work. * @run main/manual Collate2DPrintingTest */ diff -r 9367be329f29 -r 94c0b51089af jdk/test/java/awt/print/PrinterJob/PrintLatinCJKTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/print/PrinterJob/PrintLatinCJKTest.java Wed May 29 16:54:48 2013 -0700 @@ -0,0 +1,102 @@ +/* + * 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 800535 + * @summary JDK7 Printing: CJK and Latin Text in string overlap + * @run main/manual=yesno PrintLatinCJKTest + */ + +import java.awt.Font; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.print.PageFormat; +import java.awt.print.Pageable; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JTextArea; + +import javax.swing.SwingUtilities; + +public class PrintLatinCJKTest implements Printable, ActionListener { + + static PrintLatinCJKTest testInstance = new PrintLatinCJKTest(); + private PageFormat pf; + + static String info = + "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 "+ + "text looking like this : \u4e00\u4e01\u4e02\u4e03\u4e04English."; + + public static void showFrame() { + JFrame f = new JFrame(); + JTextArea jta = new JTextArea(info, 4, 30); + jta.setLineWrap(true); + jta.setWrapStyleWord(true); + f.add("Center", jta); + JButton b = new JButton("Print"); + b.addActionListener(testInstance); + f.add("South", b); + f.pack(); + f.setVisible(true); + } + + public int print(Graphics g, PageFormat pf, int pageIndex) + throws PrinterException { + + if (pageIndex > 0) { + return Printable.NO_SUCH_PAGE; + } + g.translate((int) pf.getImageableX(), (int) pf.getImageableY()); + g.setFont(new Font("Dialog", Font.PLAIN, 36)); + g.drawString("\u4e00\u4e01\u4e02\u4e03\u4e04English", 20, 100); + return Printable.PAGE_EXISTS; + } + + public void actionPerformed(ActionEvent e) { + try { + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintable(testInstance); + if (job.printDialog()) { + job.print(); + } + } catch (PrinterException ex) { + ex.printStackTrace(); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + showFrame(); + } + }); + } +}