From 9a88c53bf3f17897356531c943b1613f38a1f9d2 Mon Sep 17 00:00:00 2001 From: graydon Date: Wed, 16 Feb 2005 20:03:29 +0000 Subject: 2005-02-15 Mark Wielaard * java/awt/BasicStroke.java (hashCode): Check for null dash. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GtkArg.java, gnu/java/awt/peer/gtk/GtkArgList.java: Removed. 2005-02-15 Craig Black * gnu/java/awt/peer/gtk/GtkCheckboxMenuItem.java (postMenuActionEvent): Implement to notify ItemListeners. * java/awt/CheckboxMenuItem.java (dispatchEventImpl): Update state on ItemEvent. * java/awt/MenuItem.java (processActionEvent): Retarget event source. 2005-02-15 Andrew John Hughes * gnu/java/awt/color/ClutProfileConverter.java, gnu/java/awt/peer/ClasspathTextLayoutPeer.java, gnu/java/awt/peer/gtk/GdkFontPeer.java, gnu/java/awt/peer/gtk/GdkGlyphVector.java, gnu/java/awt/peer/gtk/GdkGraphics2D.java, gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java, gnu/java/awt/peer/gtk/GdkPixbufDecoder.java, gnu/java/awt/peer/gtk/GdkRobotPeer.java, gnu/java/awt/peer/gtk/GdkTextLayout.java, gnu/java/awt/peer/gtk/GtkButtonPeer.java, gnu/java/awt/peer/gtk/GtkCheckboxPeer.java, gnu/java/awt/peer/gtk/GtkChoicePeer.java, gnu/java/awt/peer/gtk/GtkComponentPeer.java, gnu/java/awt/peer/gtk/GtkContainerPeer.java, gnu/java/awt/peer/gtk/GtkDialogPeer.java, gnu/java/awt/peer/gtk/GtkFileDialogPeer.java, gnu/java/awt/peer/gtk/GtkFontPeer.java, gnu/java/awt/peer/gtk/GtkFramePeer.java, gnu/java/awt/peer/gtk/GtkLabelPeer.java, gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java, gnu/java/awt/peer/gtk/GtkMenuItemPeer.java, gnu/java/awt/peer/gtk/GtkScrollPanePeer.java, gnu/java/awt/peer/gtk/GtkTextComponentPeer.java, gnu/java/awt/peer/gtk/GtkToolkit.java, gnu/java/awt/peer/gtk/GtkWindowPeer.java, javax/swing/JPopupMenu.java, javax/swing/JSpinner.java, javax/swing/SortingFocusTraversalPolicy.java, javax/swing/SwingUtilities.java, javax/swing/plaf/basic/BasicComboBoxEditor.java, javax/swing/plaf/basic/BasicComboBoxRenderer.java, javax/swing/tree/DefaultMutableTreeNode.java: Removed unused imports and expanded starred imports. 2005-02-15 Mark Wielaard * java/awt/AWTKeyStroke.java (getAWTKeyStroke(String)): Throw IllegalArgumentException when the given String is null. * javax/swing/KeyStroke.java (getKeyStroke(String)): Return null when given keystoke sequence cannot be parsed. * javax/swing/JRootPane.java (setJMenuBar): Remove current menubar if one is installed. Only install the given menubar is not null. * javax/swing/JViewport.java (getViewSize): Return an empty Dimension when the view isn't set or preferred component size when no viewSize is set. * javax/swing/ViewportLayout.java (preferredLayoutSize): Return an empty Dimension when there is no view set. (minimumLayoutSize): Likewise. (layoutContainer): Don't try to layout when there is no view. 2005-02-15 Anthony Green * jni/gtk-peer/gtk_jawt.c (classpath_jawt_get_drawable, classpath_jawt_lock, classpath_jawt_unlock): New functions. * jawt.c (_Jv_JAWT_Lock, _Jv_JAWT_Unlock): New functions. (_Jv_GetDrawingSurface): Set visualID. (_Jv_FreeDrawingSurfaceInfo): Clear visualID. (JAWT_GetAWT): Set Lock and Unlock. * include/jawt_md.h (struct _JAWT_X11DrawingSurfaceInfo): Add visualID. * include/jawt.h (JAWT_VERSION_1_4, JAWT_LOCK_ERROR, JAWT_LOCK_CLIP_CHANGED, JAWT_LOCK_BOUNDS_CHANGED, JAWT_LOCK_SURFACE_CHANGED): New macros. (struct _JAWT): Add Lock and Unlock. 2005-02-15 Thomas Fitzsimmons * jawt.c: New file. * include/jawt.h: Likewise. * include/jawt_md.h: Likewise. * include/Makefile.am (tool_include__HEADERS): Add jawt.h and jawt_md.h files. * jni/classpath/classpath_jawt.h: Likewise. * jni/gtk-peer/gtk_jawt.c: Likewise. * Makefile.am: Build libjawt.so. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GdkGraphics2D.java: Merged file header with classpath CVS head. * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java: Merged code formatting with classpath CVS head. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c: Removed debug code. (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector): Handle special JNI strings with 2 '\0' at the end. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Merged file header with classpath CVS head. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c: Merged code formatting with classpath CVS head. 2005-02-15 Thomas Fitzsimmons * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (create): Use GTK's built-in file system backend. Use GTK_RESPONSE_ACCEPT. (handle_response): Use GTK_RESPONSE_ACCEPT. 2005-02-15 Graydon Hoare * Makefile.am: Fix library build breakage. * Makefile.in: Regenerate. 2005-02-15 Michael Koch * javax/swing/JTabbedPane.java (Page.setDisplayedMnemonicIndex): Handle empty menmonic. 2005-02-15 Michael Koch * javax/swing/tree/DefaultMutableTreeNode.java: Reworked Javadocs all over. (getPathToRoot): Fixed direction of result array initialization. 2005-02-15 Michael Koch * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Fix includes for cairo 0.3.0 snappshot. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: Merged file header from classpath CVS HEAD. 2005-02-15 Craig Black * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (copyState): Pass a JNI global reference to signal handler. (realize_cb): Use and free JNI global reference. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c (create): Pass a JNI global reference to signal handler. (selection_changed): Match declaration. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c (dispose): Do not remove entries from state tables until after widget is destroyed. 2005-02-15 Michael Koch * java/awt/Container.javai (paramString): If layoutMgr is null just return result of super.paramString(). * java/awt/Scrollbar.java: Reformatted. * java/awt/im/InputContext.java (static): Removed redundant initializations. 2005-02-15 Michael Koch * javax/swing/ImageIcon.java, javax/swing/UIManager.java, javax/swing/text/EditorKit.java, javax/swing/text/Segment.java: More whitespace cleanups. 2005-02-15 Michael Koch * gnu/java/awt/EmbeddedWindow.java, gnu/java/awt/image/ImageDecoder.java, gnu/java/awt/peer/gtk/GtkFileDialogPeer.java, java/awt/DefaultKeyboardFocusManager.java, java/awt/Frame.java, java/awt/image/RGBImageFilter.java, javax/swing/AbstractButton.java, javax/swing/ActionMap.java, javax/swing/ComponentInputMap.java, javax/swing/DefaultDesktopManager.java, javax/swing/ImageIcon.java, javax/swing/InputMap.java, javax/swing/JButton.java, javax/swing/JCheckBox.java, javax/swing/JCheckBoxMenuItem.java, javax/swing/JEditorPane.java, javax/swing/JMenu.java, javax/swing/JMenuItem.java, javax/swing/JOptionPane.java, javax/swing/JRootPane.java, javax/swing/JTable.java, javax/swing/MenuSelectionManager.java, javax/swing/RepaintManager.java, javax/swing/ScrollPaneLayout.java, javax/swing/SortingFocusTraversalPolicy.java, javax/swing/UIManager.java, javax/swing/ViewportLayout.java, javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java, javax/swing/plaf/basic/BasicInternalFrameUI.java, javax/swing/plaf/basic/BasicLabelUI.java, javax/swing/plaf/basic/BasicListUI.java, javax/swing/plaf/basic/BasicMenuItemUI.java, javax/swing/plaf/basic/BasicMenuUI.java, javax/swing/plaf/basic/BasicOptionPaneUI.java, javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java, javax/swing/plaf/basic/BasicRootPaneUI.java, javax/swing/plaf/basic/BasicScrollPaneUI.java, javax/swing/plaf/basic/BasicSplitPaneDivider.java, javax/swing/plaf/basic/BasicTextUI.java, javax/swing/table/TableColumnModel.java, javax/swing/text/AbstractDocument.java, javax/swing/text/EditorKit.java, javax/swing/text/Position.java, javax/swing/text/Segment.java, javax/swing/text/StyledEditorKit.java, javax/swing/text/ViewFactory.java: Cleanup whitespace differences to classpath CVS HEAD. 2005-02-15 Graydon Hoare * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java: (finalize): Call finish from here. (produce): Not from here. * Makefile.am (gtk_c_source_files): Remove jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c. * Makefile.in: Regenerate. * gnu/java/awt/peer/gtk/GdkGraphics2D.java (cairoSetFont): (cairoDrawGdkTextLayout): (cairoDrawString): (getPeerTextMetrics): (getPeerFontMetrics): Remove. (setFont): Don't call cairoSetFont. (cairoDrawGlyphVector): Accept font peer argument. (drawGlyphVector): Pass font peer to cairoDrawGlyphVector. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c (ensure_metrics_cairo): (gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont): (gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString): (gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics): (gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics): (metrics_cairo): (metrics_surface): Remove. (gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector): Pass and install font peer. 2005-02-15 Graydon Hoare * Makefile.am: Create "split library" structure. * Makefile.in: Regenerate. 2005-02-15 Graydon Hoare * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c: Release GDK lock during upcalls. 2005-02-15 Graydon Hoare * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c: Remove. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector): (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics): (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics): New methods. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: Remove. * gnu/java/awt/peer/gtk/GdkFontPeer.java (getGlyphVector): (getFontMetrics): (getTextMetrics): New native methods. * gnu/java/awt/peer/gtk/GdkFontMetrics.java: Remove native parts. * gnu/java/awt/peer/gtk/GdkGlyphVector.java: Likewise. * Makefile.am: Remove native entries for GdkFontMetrics, GdkGlyphVector. * Makefile.in: Regenerate. 2005-02-15 Andrew John Hughes * javax/swing/SwingUtilities.java: (getAccessibleAt(java.awt.Component, java.awt.Point)): Implemented and documented. (getAccessibleChild(java.awt.Component, int)): Likewise. (getAccessibleChildrenCount(java.awt.Component)): Likewise. (getAccessibleIndexInParent(java.awt.Component)): Likewise. (getAccessibleStateSet(java.awt.Component)): Likewise. 2005-02-15 Michael Koch * javax/swing/SwingUtilities.java (getFontMetrics): Removed. 2005-02-15 Michael Koch * java/awt/Container.java (paramString): Implemented. * javax/swing/AbstractButton.java (paramString): Implemented. * javax/swing/JComponent.java (paramString): Implemented. * javax/swing/JMenu.java (paramString): Implemented. * javax/swing/JMenuBar.java (paramString): Implemented. * javax/swing/JMenuItem.java (paramString): Implemented. * javax/swing/JPopupMenu.java (paramString): Implemented. 2005-02-15 Michael Koch * javax/swing/JMenu.java (uiClassID): Removed. (JMenu): Set invoker on popup menu. (getUIClassID): Return id directly. (getItemCount): Simply return getMenuComponentCount(). Fixed javadoc. (isTopLevelMenu): Simplified. * javax/swing/JMenuItem.java (uiClassID): Removed. (getUIClassID): Return id directly. * javax/swing/JPopupMenu.java (uiClassID): Removed. (JPopupMenu): Always initialize correctly. (getSubElements): Only return components implementing MenuElement interface. (HeavyWeightPopup.hide): Removed. 2005-02-15 Michael Koch * java/awt/image/ReplicateScaleFilter.java (replicatePixels): Made private. * javax/swing/colorchooser/DefaultRGBChooserPanel.java (DefaultRGBChooserPanel): Made package private. * javax/swing/colorchooser/DefaultSwatchChooserPanel.java (RecentSwatchPanel): Likewise. * javax/swing/event/MouseInputAdapter.java: Reformatted. (MouseInputAdapter): Made abstract. * javax/swing/tree/DefaultMutableTreeNode.java (random): Removed. (growTree): Likewise. 2005-02-15 Michael Koch * java/awt/dnd/DropTarget.java (addDropTargetListener): Clarified comments. 2005-02-15 Michael Koch * javax/swing/JComponent.java (getComponentGraphics): Removed accidently commited code. 2005-02-15 Graydon Hoare * java/awt/dnd/DropTarget.java (addDropTargetListener): Despite documentation, do not throw. * javax/swing/JComponent.java: Set a default DropTarget. 2005-02-15 Michael Koch * javax/swing/AbstractAction.java (ENABLED_PROPERTY): Removed. (setEnabled): Replaced constant with real string. * javax/swing/AbstractButton.java (createActionPropertyChangeListener.propertyChange): Likewise. * javax/swing/JComboBox.java (DEFAULT_MAXIMUM_ROW_COUNT): Made private. (EDITABLE_CHANGED_PROPERTY): Removed. (MAXIMUM_ROW_COUNT_CHANGED_PROPERTY):Likewise. (ENABLED_CHANGED_PROPERTY):Likewise. (RENDERER_CHANGED_PROPERTY):Likewise. (EDITOR_CHANGED_PROPERTY):Likewise. (MODEL_CHANGED_PROPERTY):Likewise. (uiClassID):Likewise. (getUIClassID): Replaced constant with real string. (setModel):Likewise. (setEditable):Likewise. (setMaximumRowCount):Likewise. (setRenderer):Likewise. (setEditor):Likewise. (setEnabled):Likewise. * javax/swing/JLabel.java (DISABLED_ICON_CHANGED_PROPERTY): Removed. (DISPLAYED_MNEMONIC_CHANGED_PROPERTY): Likewise. (DISPLAYED_MNEMONIC_INDEX_CHANGED_PROPERTY): Likewise. (HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY): Likewise. (HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY): Likewise. (ICON_CHANGED_PROPERTY): Likewise. (ICON_TEXT_GAP_CHANGED_PROPERTY): Likewise. (LABEL_FOR_CHANGED_PROPERTY): Likewise. (TEXT_CHANGED_PROPERTY): Likewise. (VERTICAL_ALIGNMENT_CHANGED_PROPERTY): Likewise. (VERTICAL_TEXT_POSITION_CHANGED_PROPERTY): Likewise. (setText): Replaced constant with real string. (setIcon): Likewise. (setDisabledIcon): Likewise. (setDisplayedMnemonic): Likewise. (setIconTextGap): Likewise. (setVerticalAlignment): Likewise. (setHorizontalAlignment): Likewise. (setVerticalTextPosition): Likewise. (setHorizontalTextPosition): Likewise. (setLabelFor): Replaced constant with real string. Fire property change event after property got changed. * javax/swing/JList.java (CELL_RENDERER_PROPERTY_CHANGED): Likewise. (FIXED_CELL_HEIGHT_PROPERTY_CHANGED): Likewise. (FIXED_CELL_WIDTH_PROPERTY_CHANGED): Likewise. (LAYOUT_ORIENTATION_PROPERTY_CHANGED): Likewise. (MODEL_PROPERTY_CHANGED): Likewise. (PROTOTYPE_CELL_VALUE_PROPERTY_CHANGED): Likewise. (SELECTION_BACKGROUND_PROPERTY_CHANGED): Likewise. (SELECTION_FOREGROUND_PROPERTY_CHANGED): Likewise. (SELECTION_MODEL_PROPERTY_CHANGED): Likewise. (setFixedCellWidth): Reimplemented. (setFixedCellHeight): Exit if new value is identical. Replaced constant with real string. (setSelectionBackground): Likewise. (setSelectionForeground): Likewise. (setPrototypeCellValue): Likewise. (setCellRenderer): Replaced constant with real string. (setModel): Likewise. (setSelectionModel): Likewise. * javax/swing/JMenuBar.java (BORDER_PAINTED_CHANGED_PROPERTY): Removed. (MODEL_CHANGED_PROPERTY): Likewise. (MARGIN_CHANGED_PROPERTY): Likewise. (setBorderPainted): Reimplemented. (setMargin): Likewise. (setSelectionModel): Replaced constant with real string. * javax/swing/JPopupMenu.java (LABEL_CHANGED_PROPERTY): Removed. (VISIBLE_CHANGED_PROPERTY): Likewise. (borderPainted): Likewise. (setLabel): Replaced constant with real string. (setVisible): Exit if new value is identical. Replaced constant with real string. * javax/swing/JProgressBar.java (BORDER_PAINTED_CHANGED_PROPERTY): Removed. (ORIENTATION_CHANGED_PROPERTY): Likewise. (STRING_CHANGED_PROPERTY): Likewise. (STRING_PAINTED_CHANGED_PROPERTY): Likewise. (INDETERMINATE_CHANGED_PROPERTY): Likewise. (setOrientation): Replaced constant with real string. (setStringPainted): Likewise. (setString): Likewise. (setBorderPainted): Likewise. (setIndeterminate): Likewise. * javax/swing/JScrollBar.java (BLOCK_INCREMENT_CHANGED_PROPERTY): Removed. (MODEL_CHANGED_PROPERTY): Likewise. (ORIENTATION_CHANGED_PROPERTY): Likewise. (setOrientation): Replaced constant with real string. (setModel): Likewise. (setUnitIncrement): Likewise. (setBlockIncrement): Likewise. * javax/swing/JScrollPane.java (COLUMN_HEADER_CHANGED_PROPERTY): Removed. (COMPONENT_ORIENTATION_CHANGED_PROPERTY): Likewise. (HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY): Likewise. (HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY): Likewise. (LAYOUT_CHANGED_PROPERTY): Likewise. (ROW_HEADER_CHANGED_PROPERTY): Likewise. (VERTICAL_SCROLLBAR_CHANGED_PROPERTY): Likewise. (VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY): Likewise. (VIEWPORT_CHANGED_PROPERTY): Likewise. (VIEWPORT_BORDER_CHANGED_PROPERTY): Likewise. (WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY): Likewise. (setComponentOrientation): Replaced constant with real string. (setColumnHeader): Likewise. (setHorizontalScrollBar): Likewise. (setHorizontalScrollBarPolicy): Likewise. (setRowHeader): Likewise. (setVerticalScrollBar): Likewise. (setVerticalScrollBarPolicy): Likewise. (setWheelScrollingEnabled): Likewise. (setViewport): Likewise. (setViewportBorder): Likewise. * javax/swing/JSlider.java (INVERTED_CHANGED_PROPERTY): Removed. (LABEL_TABLE_CHANGED_PROPERTY): Likewise. (MAJOR_TICK_SPACING_CHANGED_PROPERTY): Likewise. (MINOR_TICK_SPACING_CHANGED_PROPERTY): Likewise. (MODEL_CHANGED_PROPERTY): Likewise. (ORIENTATION_CHANGED_PROPERTY): Likewise. (PAINT_LABELS_CHANGED_PROPERTY): Likewise. (PAINT_TICKS_CHANGED_PROPERTY): Likewise. (setModel): Replaced constant with real string. (setOrientation): Likewise. (setLabelTable): Likewise. (setInverted): Likewise. (setMajorTickSpacing): Likewise. (setMinorTickSpacing): Likewise. (setPaintTicks): Likewise. (setPaintLabels): Likewise. * javax/swing/JTabbedPane.java (MODEL_CHANGED_PROPERTY): Removed. (TAB_PLACEMENT_CHANGED_PROPERTY): Likewise. (TAB_LAYOUT_POLICY_CHANGED_PROPERTY): Likewise. (setModel): Replaced constant with real string. (setTabPlacement): Likewise. (setTabLayoutPolicy): Likewise. * javax/swing/JToolBar.java (ORIENTATION_CHANGED_PROPERTY): Removed. (FLOATABLE_CHANGED_PROPERTY): Likewise. (BORDER_PAINTED_CHANGED_PROPERTY): Likewise. (MARGIN_CHANGED_PROPERTY): Likewise. (ROLLOVER_CHANGED_PROPERTY): Likewise. (setRollover): Replaced constant with real string. (setMargin): Likewise. (setBorderPainted): Likewise. (setFloatable): Likewise. (setOrientation): Likewise. * javax/swing/plaf/basic/BasicComboBoxUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicComboPopup.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicMenuBarUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicProgressBarUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicScrollBarUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicSliderUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicTabbedPaneUI.java (PropertyChangeHandler.propertyChange): Likewise. * javax/swing/plaf/basic/BasicToolBarUI.java (PropertyChangeHandler.propertyChange): Likewise. 2005-02-15 Michael Koch * javax/swing/DefaultButtonModel.java (changeState): Made private. * javax/swing/DefaultDesktopManager.java (setWasIcon): Fixed second argument to be java.lang.Boolean. * javax/swing/JLayeredPane.java (layerToRange): Made private. (incrLayer): Likewise. (decrLayer): Likewise. * javax/swing/JTable.java (dragEnabled): Likewise. (preferredViewportSize): Renamed from preferredScrollableViewportSize. * javax/swing/KeyStroke.java (Keystroke): Made private. * javax/swing/TransferHandler.java (COMMAND_COPY): Likewise. (COMMAND_CUT): Likewise. (COMMAND_PASTE): Likewise. 2005-02-15 Michael Koch * javax/swing/JTextField.java (postActionEvent): Use text in field when actionCommand is null. (getActionCommand): Removed. 2005-02-15 Michael Koch * javax/swing/AbstractSet.java: Removed. * Makefile.am: Removed javax/swing/AbstractSet.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * java/awt/Window.java (AccessibleWindow.getAccessibleStateSet): Fixed method name. * java/awt/dnd/DnDConstants.java (DnDConstants): New private constructor. 2005-02-15 Michael Koch * javax/swing/DefaultCellRenderer.java: Removed. * Makefile.am: Removed javax/swing/DefaultCellRenderer.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/AbstractButton.java (fireItemStateChanged): Made protected. (fireActionPerformed): Likewise. (fireStateChanged): Likewise. * javax/swing/DefaultButtonModel.java (fireItemStateChanged): Likewise. (fireActionPerformed): Likewise. (fireStateChanged): Likewise. * javax/swing/JApplet.java (JApplet): Removed. (frameInit): Likewise. (setRootPane): Made protected. (createRootPane): Likewise. * javax/swing/JComponent.java (getClientProperty): Likewise. (putClientProperty): Likewise. * javax/swing/JEditorPane.java (getContentType): Likewise. (setContentType): Likewise. * javax/swing/JFrame.java (setRootPane): Likewise. (createRootPane): Likewise. * javax/swing/JInternalFrame.java (getFocusCycleRootAncestor): Made final. Added @since tag. (isFocusCycleRoot): Likewise. (getWarningString): Made final. * javax/swing/JScrollBar.java (changeListener): Removed. (changeEvent): Likewise. (createChangeListener): Likewise. (fireStateChanged): Likewise. (addChangeListener): Likewise. (removeChangeListener): Likewise. (getChangeListeners): Likewise. * javax/swing/JScrollPane.java (createViewport): Made protected. * javax/swing/JViewport.java (addImpl): Likewise. (setBorder): New method. * javax/swing/JWindow.java (setRootPane): Made protected. (createRootPane): Likewise. * javax/swing/plaf/basic/BasicButtonUI.java (installListeners): Likewise. (uninstallListeners): Likewise. * javax/swing/plaf/basic/BasicProgressBarUI.java (incrementAnimationIndex): Likewise. * javax/swing/plaf/basic/BasicTabbedPaneUI.java (createLayoutManager): Likewise. * javax/swing/table/DefaultTableCellRenderer.java (firePropertyChange): Likewise. * javax/swing/table/JTableHeader.java (AccessibleJTableHeaderEntry.AccessibleJTableHeaderEntry): New constructor. * javax/swing/text/PlainDocument.java (reindex): Made private. * javax/swing/text/PlainView.java (drawLine): Made protected. (getTabSize): Likewise. * javax/swing/text/View.java (setSize): Removed. (preferenceChanged): New method. (getBreakWeight): Likewise. (breakView): Likewise. (getViewIndex): Likewise. 2005-02-15 Michael Koch * javax/swing/JScrollPane.java (ScrollBar): Made class protected. * javax/swing/JSpinner.java (JSpinner): Added @since tag. (listenerList): Removed. * javax/swing/JTable.java (setValueAt): New method. (getColumn): Likewise. * javax/swing/JWindow.java (rootPaneCheckingEnabled): Renamed from checking. 2005-02-15 Michael Koch * javax/swing/plaf/basic/BasicTextUI.java (RootView.modelToView): Made it public and return a java.awt.Shape. Handle null subview. (uninstall): Set textComponent to null when its not possible used anymore. * javax/swing/text/View.java (setParent): Use better argument name. (getContainer): Get parent via getParent(). (getViewFactory): Likewise. (getAttributes): Get element via getElement(). (getStartOffset): Likewise. (getEndOffset): Likewise. (getResizeWeight): New method. (getMaximumSpan): Likewise. (getMinimumSpan): Likewise. (setSize): Likewise. (getGraphics): Likewise. 2005-02-15 Andrew John Hughes * java/awt/Checkbox.java: (AccessibleAWTCheckbox()): Added public constructor to call superclass. * java/awt/Choice.java: (AccessibleAWTChoice): Added class documentation. (AccessibleAWTChoice()): Added public constructor to call superclass. (AccessibleAWTChoice.getAccessibleAction()): Documented. (AccessibleAWTChoice.getAccessibleRole()): Documented, and changed role to COMBO_BOX. (AccessibleAWTChoice.getAccessibleActionCount()): Documented. (AccessibleAWTChoice.getAccessibleActionDescription(int)): Documented. (AccessibleAWTChoice.doAccessibleAction(int)): Documented. 2005-02-15 Graydon Hoare Michael Koch * javax/swing/LayoutFocusTraversalPolicy.java, javax/swing/SortingFocusTraversalPolicy.java: New classes. * Makefile.am: Added new classes. * Makefike.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/DebugGraphics.java: Mostly implemented. 2005-02-15 Michael Koch * javax/swing/SwingUtilities.java (findFocusOwner): New method. 2005-02-15 Michael Koch * javax/swing/text/DefaultEditorKit.java (read): Added '\n' after each line. * javax/swing/text/PlainView.java (modelToView): Update metrics. (drawLine): Use offsets from element. (paint): Update metrics. Draw all lines. 2005-02-15 Andrew John Hughes * java/awt/Checkbox.java: (AccessibleAWTCheckbox): Added class documentation * java/awt/Scrollbar.java: (AccessibleAWTScrollBar): typo corrected and docs added (AccessibleAWTScrollBar.getAccessibleRole()): documented (AccessibleAWTScrollBar.getAccessibleStateSet()): likewise (AccessibleAWTScrollBar.getAccessibleValue()): likewise (AccessibleAWTScrollBar.getCurrentAccessibleValue()): likewise (AccessibleAWTScrollBar.setCurrentAccessibleValue(int)): likewise (AccessibleAWTScrollBar.getMinimumAccessibleValue()): likewise (AccessibleAWTScrollBar.getMaximumAccessibleValue()): likewise (getAccessibleContext()): name of accessible class corrected 2005-02-15 Mark Wielaard * java/awt/BasicStroke.java (hashCode): Implement. (equals): Document. 2005-02-15 Michael Koch * java/awt/print/PrinterJob.java (pageDialog): Throws java.awt.HeadlessException. (printDialog): Likewise. 2005-02-15 Mark Wielaard * jni/gtk-peer/gtkpeer.h (gdk_env): Fix prototype. 2005-02-15 Michael Koch * javax/swing/JTable.java (getValueAt): New method. * javax/swing/table/JTableHeader.java (columnAtPoint): New method. 2005-02-15 Michael Koch * javax/swing/JTextField.java (actions): New field. (static): Initalize actions field. (getActions): New method. 2005-02-15 Andrew John Hughes * java/awt/Checkbox.java: (AccessibleAWTCheckbox): name capitalization corrected and serialization UID added. (AccessibleAWTCheckbox.itemStateChanged(java.awt.event.ItemEvent)): documented. (AccessibleAWTCheckbox.getAccessibleAction()): likewise (AccessibleAWTCheckbox.getAccessibleValue()): likewise (AccessibleAWTCheckbox.getAccessibleActionCount()): likewise (AccessibleAWTCheckbox.getAccessibleActionDescription(int)): likewise (AccessibleAWTCheckbox.doAccessibleAction(int)): likewise (AccessibleAWTCheckbox.getCurrentAccessibleValue()): likewise (AccessibleAWTCheckbox.setCurrentAccessibleValue(int)): likewise (AccessibleAWTCheckbox.getMinimumAccessibleValue()): likewise (AccessibleAWTCheckbox.getMaximumAccessibleValue()): likewise (AccessibleAWTCheckbox.getAccessibleRole()): likewise (AccessibleAWTCheckbox.getAccessibleStateSet()): implemented and documented (getAccessibleContext()): name of accessible class corrected 2005-02-15 Sven de Marothy * java/awt/geom/doc-files/Area-1.png, java/awt/geom/doc-files/Ellipse-1.png, java/awt/geom/doc-files/GeneralPath-1.png: New files. 2005-02-15 Graydon Hoare * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (env_union): Use union to avoid type-punning warning. 2005-02-15 Michael Koch * javax/swing/DefaultListSelectionModel.java (clone): New method. 2005-02-15 Mark Wielaard Reported by Martin Platter * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile): Correct method signature of gtkSetFilename. 2005-02-15 Arnaud Vandyck * javax/swing/text/StringContent.java: New file. 2005-02-15 Michael Koch * Makefile.am: Added javax/swing/text/StringContent.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * gnu/java/awt/ClasspathToolkit.java: Import statements reworked. (imageCache): Made it of type java.util.HashMap. 2005-02-15 Michael Koch * javax/imageio/stream/MemoryCacheImageInputStream.java: Reworked import statements. 2005-02-15 Graydon Hoare * jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c: * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c: Rewrite uses of extern variable to be function calls. * jni/gtk-peer/gtkpeer.h (gdk_env): Change declaration to function, from extern variable. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gdk_env): Remove variable, add new function. (java_vm): Add new variable. (Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit): Initialize java_vm rather than old gdk_env variable. 2005-02-15 David Gilbert * javax/swing/DefaultListModel.java (add): fire correct event, (addElement): corrected interval indices in event, (clear): corrected upper bound for interval, only fire event if list is not empty, (setSize): fire appropriate event. 2005-02-15 Graydon Hoare * gnu/awt/xlib/XEventLoop.java: Add non-blocking event mode. * gnu/awt/xlib/XToolkit.java: Likewise. * gnu/gcj/xlib/XAnyEvent.java: Likewise. * gnu/gcj/xlib/natXAnyEvent.cc: Likewise. * gnu/java/awt/ClasspathToolkit.java: Likewise. * gnu/java/awt/peer/gtk/GtkToolkit.java: Likewise. * java/awt/EventQueue.java (getNextEvent): Adjust event loop to switch to native mode after 100ms. * javax/swing/Timer.java (drainEvents): Reuse Runnable. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c (Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose): Wake up event thread. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (Java_gnu_java_awt_peer_gtk_GtkToolkit_iterateNativeQueue): Adjust event loop to switch to java mode after 100ms. 2005-02-15 Graydon Hoare * jni.cc (_Jv_JNI_RegisterNatives): Re-add sync, which was accidentally removed in last change. 2005-02-15 Michael Koch * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c, gnu/java/awt/peer/gtk/GtkMainThread.java: Removed. 2005-02-15 Graydon Hoare * include/jni.h (_Jv_JNIEnv::bottom_locals): New field. * include/jvm.h (_Jv_FreeJNIEnv): Declare. * java/lang/natThread.cc (finalize_native): Call _Jv_FreeJNIEnv. * jni.cc: Reuse bottom frame between calls, avoid clearing frame when no local references are made. 2005-02-15 Michael Koch * javax/swing/UIDefaults.java (UIDefaults): Fixed typo in javadoc (Thanks to Thomas Zander for reporting) Fixed HTML entity and removed a redundant comma. 2005-02-15 Michael Koch * javax/swing/text/DefaultEditorKit.java (deinstall): Removed. (install): Likewise. 2005-02-15 Michael Koch * javax/swing/UIDefaults.java (put): Handle value of null. 2005-02-15 Michael Koch * java/awt/Robot.java, java/awt/Scrollbar.java, java/awt/print/PrinterJob.java, javax/swing/JTable.java, javax/swing/text/AbstractDocument.java: Reworked import statements. 2005-02-15 Michael Koch * javax/swing/JEditorPane.java (read): Implemented. (write): Likewise. * javax/swing/text/DefaultEditorKit.java (page): Renamed from page_url. Made private. (editorKit): Renamed from kit. Made private. (ctype): Removed. (JEditorPane): All constructors reimplemented. (getContentType): Use content type from editor kit. (getEditorKit): Return editorKit. (getEditorKitForContentType):Likewise. (getPage): Return page. (setContentType): Reimplemented. (setEditorKit): Likewise. (setEditorKitForContentType): Removed wrong implementation. (setPage): Implemented. 2005-02-15 Thomas Fitzsimmons * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c (nativeSetIconImageFromData): Re-add native implementation. 2005-02-15 David Gilbert * javax/swing/table/DefaultTableModel.java (DefaultTableModel()): Added Javadocs. (DefaultTableModel(int, int)): Fixed implementation. (DefaultTableModel(Vector, int)): Throw IllegalArgumentException for negative rowCount. (DefaultTableModel(Object[], int)): Added Javadocs. (DefaultTableModel(Vector, Vector)): Likewise. (DefaultTableModel(Object[][], Object[])): Likewise. (getDataVector): Likewise. (setDataVector(Vector, Vector)): Likewise. (setDataVector(Object[][], Object[])): Likewise. (newDataAvailable): Likewise. (newRowsAdded): Likewise. (rowsRemoved): Likewise. (setColumnIdentifiers(Vector)): Allow for null argument. (setColumnIdentifiers(Object[])): Added Javadocs. (setNumRows): Likewise. (setRowCount): Adds new rows if necessary, and sends more specific TableModelEvent. (setColumnCount): Allow for null columnIdentifiers. (addColumn(Object)): Added Javadocs. (addColumn(Object, Vector)): Handle null columnData. (addColumn(Object, Object[])): Handle columnData with more or less entries than rows in the table. (addRow(Vector)): Fire appropriate event. (addRow(Object[])): Added Javadocs. (insertRow(int, Vector)): Fire appropriate event. (insertRow(int, Object[])): Added Javadocs. (moveRow): Reimplemented. (removeRow(int)): Fire appropriate event. (getColumnCount): Allow for null columnIdentifiers. (getColumnName): Now returns empty string when column index is too large. (isCellEditable): Added Javadocs. (getValueAt): Likewise. (setValueAt): Fire more specific event. (convertToVector): Added Javadocs. * javax/swing/table/TableModel.java Added Javadocs. 2005-02-15 Thomas Fitzsimmons * libgcj.spec.in (lib): Add -l-javax-imageio. 2005-02-15 Thomas Fitzsimmons * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Replace direct references to event queue q with method call q(). * gnu/java/awt/peer/gtk/GtkDialogPeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkFramePeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkWindowPeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkGenericPeer.java: Likewise. (q): New method. 2005-02-15 Graydon Hoare * gnu/java/awt/ClasspathToolkit.java (registerImageIOSpis): New method. * gnu/java/awt/image/ImageDecoder.java (imageDecoder): New constructor using InputStream (startProduction): Handle existing InputStream. * gnu/java/awt/peer/gtk/GdkGraphics2D.java (findSimpleIntegerArray): Make public and static. (updateBufferedImage): Set each pixel, in a loop. * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java: Implement ImageIO SPI classes. (createBufferedImage): Rewrite in terms of SPI classes. * gnu/java/awt/peer/gtk/GtkToolkit.java (registerImageIOSpis): New method. * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Borrow a patch from aph, applied to trunk, which lets JNI call interface methods properly. * javax/imageio/ImageIO.java (WriterFormatFilter.filter): Fix copy-and-paste typos. (WriterMIMETypeFilter.filter): Likewise. (ImageReaderIterator): Pass extension argument through to SPI. (getReadersByFilter): Likewise. (getWritersByFilter): Likewise. (getImageReadersByFormatName): Likewise. (getImageReadersByMIMEType): Likewise. (getImageReadersBySuffix): Likewise. (getImageWritersByFormatName): Likewise. (getImageWritersByMIMEType): Likewise. (getImageWritersBySuffix): Likewise. (read): Implement. (write): Implement. * javax/imageio/ImageReader.java (progressListeners): Initialize. (setInput): Implement. * javax/imageio/ImageWriter.java (progressListeners): Initialize. (warningListeners): Likewise. (warningLocales): Likewise. (setOutput): Test "isInstance" rather than class equality. * javax/imageio/spi/IIORegistry.java (static): Add reader and writer SPIs. (IIORegistry): Call ClasspathToolkit.registerImageIOSpis. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c (query_formats): New function. (save_to_stream): Likewise. (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): Likewise. 2005-02-15 Thomas Fitzsimmons * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c (mouseWheel): Call XFlush. (keyPress): Likewise. (keyRelease): Likewise. 2005-02-15 Olga Rodimina * javax/swing/JTable.java (columnAtPoint): New Method. Implemented. (rowAtPoint): Likewise. (countSelections): Fixed few small count errors. (getSelections): Likewise. (setSelectionMode): Set selection mode for column selection model in addition to row selection model. * javax/swing/plaf/basic/BasicTableUI.java: (getRowForPoint): Removed. Replaced by JTable.rowAtPoint(). (getColForPoint): Removed. Replaced by JTable.columnAtPoint(). (updateSelection): Updated to call JTable.columnAtPoint and JTable.rowAtPoint. * javax/swing/table/DefaultTableColumnModel.java: (getSelectedColumns): Implemented. (getSelectedColumnCount): Implemented. 2005-02-15 Graydon Hoare * Makefile.am (jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c) (gnu/java/awt/peer/gtk/GtkMainThread.java) : Remove. * Makefile.in: Regenerate. * gnu/awt/xlib/XEventLoop.java: Fix to match thread model. * gnu/awt/xlib/XFramePeer.java: Likewise. * gnu/awt/xlib/XToolkit.java: Likewise. * gnu/gcj/xlib/XAnyEvent.java: Likewise. * gnu/gcj/xlib/natXAnyEvent.cc: Likewise. * gnu/java/awt/ClasspathToolkit.java (nativeQueueEmpty) (wakeNativeQueue) (iterateNativeQueue): New methods. * gnu/java/awt/peer/gtk/GtkMainThread.java: Remove. * gnu/java/awt/peer/gtk/GtkToolkit.java (gtkInit): Absorb from defunct GtkMainThread class. (static): Run gtkInit in static startup block. (GtkToolkit): Remove construction of GtkMainThread and queue. (getSystemEventQueueImpl): Construct queue when requested. (nativeQueueEmpty) (wakeNativeQueue) (iterateNativeQueue): New methods. * java/awt/Component.java (removeNotify): Remove race. * java/awt/EventDispatchThread.java (EventDispatchThread): Don't start on construction. (run): Remove isInterrupted check. * java/awt/EventQueue.java (shutdown): New flag. (isShutdown): New method checking J2SE shutdown condition. (setShutdown): New method. (getNextEvent): Restructure to use ClasspathToolkit. (postEvent): Activate new thread on posting, wake thread on post of possible shutdown condition event. * java/awt/Frame.java (Frame): Call noteFrame in all constructors. (fireDummyEvent): New helper method. (addNotify): Fire a dummy event to wake up queue. (removeNotify): Fire a dummy event to wake up queue. (noteFrame): New method. (weakFrames): New static field. (getFrames): Implement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Remove. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c: Move everything from GtkMainThread into this file (Java_gnu_java_awt_peer_gtk_GtkToolkit_iterateNativeQueue) (Java_gnu_java_awt_peer_gtk_GtkToolkit_wakeNativeQueue) (Java_gnu_java_awt_peer_gtk_GtkToolkit_nativeQueueEmpty): New functions to implement single-threaded queue semantics. 2005-02-15 Michael Koch * javax/swing/plaf/metal/MetalLookAndFeel.java (getControlTextFont): New method. (getMenuTextFont): Likewise. (getSubTextFont): Likewise. (getSystemTextFont): Likewise. (getUserTextFont): Likewise. (getWindowTitleFont): Likewise. 2005-02-15 Michael Koch * javax/swing/text/AbstractDocument.java (documentFilter): New field. (getDocumentFilter): New method. (setDocumentFilter): Likewise. (dump): Likewise. 2005-02-15 Michael Koch * javax/swing/JTree.java (DynamicUtilTreeNode.hasChildren): Clarify javadoc. 2005-02-15 Michael Koch * javax/swing/text/AbstractDocument.java (AbstractElement.getLength): Fixed off-by-one error. (AbstractElement.children): Made abstract. (AbstractElement.getAllowsChildren): Likewise. (AbstractElement.getElement): Likewise. (AbstractElement.dumpElement): New private method. (AbstractElement.dump): New method. (BranchElememt.getName): Fixed implementation. (BranchElememt.toString): Likewise. (BranchElememt.getElement): Fixed arguments. (LeafElement.getName): Fixed implementation. (LeafElement.toString): Likewise. * javax/swing/text/GapContent.java (GapContent): Put default content into buffer. * javax/swing/text/PlainDocument.java (reindex): Use empty attribute sets instead of null. (createDefaultRoot): Reimplemented. (insertUpdate): Call super method. (removeUpdate): Likewise. (getParagraphElement): Implemented. 2005-02-15 Michael Koch * gnu/java/awt/ClasspathToolkit.java (createRobot): Throws java.awt.AWTException. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c: Added '__attribute__((unused))' to all unused method arguments. 2005-02-15 Michael Koch * javax/swing/DefaultBoundedRangeModel.java (fireValueChanged): Fixed off-by-one error. 2005-02-15 Thomas Fitzsimmons * Makefile.am (gtk_c_source_files): Add GdkRobotPeer.c. (gtk_awt_peer_sources): Add GdkScreenGraphicsDevice.java and GdkRobotPeer.java. (lib_gnu_java_awt_peer_gtk_la_CFLAGS): Add X flags. (lib_gnu_java_awt_peer_gtk_la_LDFLAGS): Add XTest flags. * gnu/awt/xlib/XToolkit.java (createRobot): New method. * gnu/java/awt/ClasspathToolkit.java (createRobot): New method. * gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java (getDefaultScreenDevice): Implement. * gnu/java/awt/peer/gtk/GdkRobotPeer.java: New file. * gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java: Likewise. * gnu/java/awt/peer/gtk/GtkToolkit.java (createRobot): New method. * java/awt/Robot.java: Implement. * java/awt/peer/RobotPeer.java: Rename parameters. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c: New file. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (awt_keycode_to_keysym): Make non-static. * jni/gtk-peer/gtkpeer.h (AWT_BUTTON1_MASK, AWT_BUTTON2_MASK, AWT_BUTTON3_MASK): Declare constants. (awt_keycode_to_keysym): Declare. * Makefile.am (AM_MAKEFLAGS): Set KEYS variable. * testsuite/libjava.mauve/mauve.exp (test_mauve): If KEYS exists and is non-empty pass its value to "make check". (test_mauve_sim): Likewise. 2005-02-15 Michael Koch * javax/imageio/IIOParam.java (setSourceBands): New method. (setSourceSubsampling): Likewise. * javax/imageio/ImageReadParam.java (setDestination): Likewise. (setDestinationBands): Likewise. (setSourceProgressivePasses): Likewise. * javax/imageio/metadata/IIOInvalidTreeException.java (serialVersionUID): New static field. * javax/imageio/metadata/IIOMetadataNode.java (IIOMetadataNode): Don't explicitely implement org.w3c.dom.Node. (parent): Dont initailize with default value explicitely. (Object): Likewise. (removeAttribute): Doesn't throws org.w3c.dom.DOMException. (removeAttributeNode): Likewise. (removeAttributeNS): Likewise. (setAttribute): Likewise. (setAttributeNode): Likewise. (setAttributeNodeNS): Likewise. (setAttributeNS): Likewise. (appendChild): Likewise. (getNodeValue): Likewise. (insertBefore): Likewise. (removeChild): Likewise. (replaceChild): Likewise. (setPrefix): Likewise. 2005-02-15 Michael Koch * javax/swing/LookAndFeel.java (getDesktopPropertyValue): New method. 2005-02-15 Michael Koch * javax/swing/JTree.java (hasChildren): New instance field. 2005-02-15 Michael Koch * javax/swing/JComponent.java (getToolTipText): New method. (getTitledBorderText): Likewise. (getAccessibleKeyBinding): Likewise. (getVerifyInputWhenFocusTarget): Likewise. (setVerifyInputWhenFocusTarget): Likewise. (verifyInputWhenFocusTarget): New instance field. 2005-02-15 Michael Koch * javax/swing/DefaultListSelectionModel.java (fireValueChanged): New method. 2005-02-15 Michael Koch * javax/swing/DefaultBoundedRangeModel.java: Fixed javadocs all over. (fireStateChanged): Simplified. * javax/swing/BoundedRangeModel.java: Reformatted. 2005-02-15 Michael Koch * javax/swing/JRootPane.java (setMenuBar): Added @deprecated tag. (getMenuBar): Likewise. * javax/swing/JTable.java (sizeColumnsToFit): Likewise. 2005-02-15 Paul Jenner * javax/swing/ImageIcon.java (setImage): Implemented. 2005-02-15 Michael Koch * javax/swing/JTable.java: Removed unused imports. 2005-02-15 Olga Rodimina (prepareRenderer): Get column's index in dataModel instead of column's view index. (getColumnCount): return count of the columns in ColumnModel, not in dataModel. (removeColumn): Implemented. (moveColumm): Likewise. (setRowHeight): throw IllegalArgumentException if height is less then 1. * javax/swing/table/DefaultTableColumnModel.java: Add javadocs. (DefaultTableColumnModel):Add call to createSelectionModel(). (addColumn): Fire columnAdded event to registered listeners. (removeColumn): Fire columnRemoved event to registered listeners. (moveColumn): Fire columnMoved event to registered listeners. (setColumnMargin): Fire ColumnMarginChanged event to registered listeners. (getColumnIndex): Changed parameter name. (setColumnSelectionAllowed): Likewise. (fireColumnAdded): Implemented. (fireColumnRemoved): Likewise. (fireColumnMoved): Likewise. (fireColumnMarginChanged): Likewise. (getListeners): Changed parameter name. (propertyChange): Implemented. (valueChanged): Changed parameter name. (createSelectionModel): Implemented. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GtkToolkit.java: Explicitely import used classes. (getLocalGraphicsEnvironment): Simplify. * java/awt/Window.java (Window): Enable code to get the default GraphicsConfiguration. 2005-02-15 Michael Koch * javax/swing/plaf/metal/DefaultMetalTheme.java (CONTROL_TEXT_FONT): New static field. (MENU_TEXT_FONT): Likewise. (SUB_TEXT_FONT): Likewise. (SYSTEM_TEXT_FONT): Likewise. (USER_TEXT_FONT): Likewise. (WINDOW_TITLE_FONT): Likewise. (getControlTextFont): New method. (getMenuTextFont): Likewise. (getSubTextFont): Likewise. (getSystemTextFont): Likewise. (getUserTextFont): Likewise. (getWindowTitleFont): Likewise. * javax/swing/plaf/metal/MetalTheme.java (BLACK): Initialize with Color.BLACK. (WHITE): Initialize with Color.WHITE. (getInactiveControlTextColor): Return getControlDisabled(). (getMenuDisabledForeground): Return getSecondary3(). (getControlTextFont): New abstract method. (getMenuTextFont): Likewise. (getSubTextFont): Likewise. (getSystemTextFont): Likewise. (getUserTextFont): Likewise. (getWindowTitleFont): Likewise. 2005-02-15 Michael Koch * javax/swing/JFormattedTextField.java (getFocusLostBehavior): Fixed typo in method name. (setFocusLostBehavior): Likewise. 2005-02-15 Michael Koch * javax/swing/TransferHandler.java: Reworked import statements. 2005-02-15 Jerry Quinn * java/awt/Button.java, java/awt/Canvas.java, java/awt/Checkbox.java, java/awt/CheckboxMenuItem.java, java/awt/Choice.java, java/awt/Dialog.java, java/awt/Frame.java, java/awt/Label.java, java/awt/List.java, java/awt/Menu.java, java/awt/MenuBar.java, java/awt/MenuItem.java, java/awt/PopupMenu.java, java/awt/ScrollPane.java, java/awt/Scrollbar.java, java/awt/TextArea.java, java/awt/Window.java (getAccessibleContext): Clean up comments. Reformat. * java/awt/Button.java, java/awt/Checkbox.java, java/awt/Choice.java, java/awt/Menu.java, java/awt/PopupMenu.java, java/awt/TextArea.java (getAccessibleContext): Only create new accessible once. * java/awt/TextComponent.java (getAccessibleContext): Implement. 2005-02-15 Michael Koch * java/awt/Button.java, javax/swing/JApplet.java, javax/swing/JFormattedTextField.java, javax/swing/JWindow.java, javax/swing/JTree.java, javax/swing/plaf/basic/BasicEditorPaneUI.java, javax/swing/plaf/basic/BasicTextPaneUI.java, javax/swing/plaf/basic/BasicTreeUI.java: Reworked import statements. 2005-02-15 Michael Koch * Makefile.am: Put javax.imageio into its own library and link it against lib-org-w3c-dom.la to fix bootstrapping. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/text/TextAction.java (getTextComponent): Simplified. Added Javadoc. (augmentList): Implemented. Added Javadoc. (getFocusedComponent): Added javadoc. 2005-02-15 Jerry Quinn * java/awt/Scrollbar.java (AccessibleAWTScrollbar, getAccessibleContext): Implement. * java/awt/ScrollPane.java (AccessibleAWTScrollPane, getAccessibleContext): Implement. 2005-02-15 Jerry Quinn * java/awt/Dialog.java (AccessibleAWTFrame, getAccessibleContext): Implement. * java/awt/Frame.java (AccessibleAWTFrame, getAccessibleContext): Implement. * java/awt/Window.java (getAccessibleContext): Fix comment. Remove extra import. 2005-02-15 Jerry Quinn * java/awt/Window.java (AccessibleAWTWindow): Implement. (isActive, isFocused, getAccessibleContext): Implement. 2005-02-15 Jerry Quinn * java/awt/MenuItem.java (getAccessibleContext): Implement. * java/awt/MenuComponent.java (accessibleContext): Make package visible. * java/awt/CheckboxMenuItem.java (getAccessibleContext, AccessibleAWTCheckboxMenuItem): Implement. 2005-02-15 Jerry Quinn * java/awt/List.java: Implement AccessibleAWTList, AccessibleAWTListChild. 2005-02-15 Jerry Quinn * java/awt/Choice.java: Add implements declaration for Accessible. 2005-02-15 Jerry Quinn * javax/imageio/metadata/IIOInvalidTreeException.java: Use Node instead of Object. 2005-02-15 Jerry Quinn * javax/imageio/metadata/IIOMetadataNode.java: Add Node to implemented interface list. 2005-02-15 Jerry Quinn * javax/imageio/metadata/IIOMetadataNode.java: Implement. * javax/imageio/metadata/IIOAttr.java: New class. * javax/imageio/metadata/IIONamedNodeMap.java: New class. * javax/imageio/metadata/IIONodeList.java: New class. * Makefile.am: Added new files. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/AbstractAction.java, javax/swing/AbstractCellEditor.java, javax/swing/AbstractListModel.java, javax/swing/DefaultBoundedRangeModel.java, javax/swing/DefaultButtonModel.java, javax/swing/DefaultCellEditor.java, javax/swing/DefaultComboBoxModel.java, javax/swing/DefaultDesktopManager.java, javax/swing/JMenu.java, javax/swing/JSlider.java, javax/swing/KeyStroke.java, javax/swing/OverlayLayout.java, javax/swing/ScrollPaneLayout.java, javax/swing/SizeRequirements.java, javax/swing/ViewportLayout.java: Made serialVersionUID private. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Reformatted. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GdkGraphics2D.java: More reformatting. 2005-02-15 Michael Koch * gnu/java/awt/peer/gtk/GdkGraphics2D.java: Reformatted. 2005-02-15 Jeroen Frijters * java/awt/EventDispatchThread.java, java/awt/Toolkit.java: Don't catch java.lang.ThreadDeath. 2005-02-15 Michael Koch * javax/swing/text/PasswordView.java (drawEchoCharacter): Added javadoc. (drawSelectedText): Likewise. (drawUnselectedText): Likewise. 2005-02-15 Michael Koch * javax/swing/JRootPane.java (windowDecorationStyle): New field. (setMenuBar): New method. (getMenuBar): Likewise. (getWindowDecorationStyle): Likewise. (setWindowDecorationStyle): Likewise. 2005-02-15 Michael Koch * javax/swing/DefaultListSelectionModel.java (leadAnchorNotificationEnabled): Made protected. 2005-02-15 Michael Koch * javax/swing/InternalFrameFocusTraversalPolicy.java: New file. * Makefile.am: Added InternalFrameFocusTraversalPolicy.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/JFormattedTextField.java: Implemented. * javax/swing/JWindow.java (JWindow): New constructors. (initWindow): Renamed from initFrame. * javax/swing/UIDefaults.java (ActiveValue): Made interface static. (LazyValue): Likewise. * javax/swing/plaf/basic/BasicInternalFrameTitlePane.java (TitlePaneLayout.TitlePaneLayout): New constructor. * javax/swing/plaf/basic/BasicSliderUI.java (ChangeHandler): Made public. (FocusHandler): Likewise. (PropertyChangeHandler): Likewise. (ScrollListener): Likewise. * javax/swing/plaf/basic/BasicTabbedPaneUI.java (FocusHandler): Likewise. (MouseHandler): Likewise. * javax/swing/plaf/basic/BasicTextPaneUI.java (BasicTextPaneUI): Extend BasicEditorPaneUI. * javax/swing/plaf/basic/BasicToolBarUI.java (BasicToolBarUI): Simplified. Reworked javadoc. (canDock): Simplified. Make public. (DockingListener): Made public. * javax/swing/text/JTextComponent.java (navigationFilter): New field. (getNavigationFilter): New method. (setNavigationFilter): Likewise. 2005-02-15 Michael Koch * javax/swing/plaf/metal/MetalTheme.java (getControlTextColor): Return getControlInfo(). (getHighlightedTextColor): Return getControlTextColor(). 2005-02-15 Michael Koch * javax/swing/plaf/basic/BasicButtonListener.java (BasicButtonListener): New constructor. * javax/swing/plaf/basic/BasicButtonUI.java (createButtonListener): Usw new BasicButtonListener constructor. 2005-02-15 Michael Koch * javax/imageio/event/package.html, javax/imageio/metadata/package.html: New files. 2005-02-15 Michael Koch * java/awt/image/MemoryImageSource.java: Reformatted. 2005-02-15 Michael Koch * javax/swing/tree/TreeCellEditor.java: Refomatted. 2005-02-15 Jeroen Frijters * java/awt/color/ICC_Profile.java (finalize): Removed pointless field assignments. 2005-02-15 Michael Koch * javax/swing/plaf/basic/BasicEditorPaneUI.java: New file. * Makefile.am: Added javax/swing/plaf/basic/BasicEditorPaneUI.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/text/DefaultStyledDocument.java: New file. * Makefile.am: Added javax/swing/text/DefaultStyledDocument.java. * Makefile.in: Regenerated. 2005-02-15 Michael Koch * javax/swing/JFileChooser.java (showDialog): Return CANCEL_OPTION for now. (showOpenDialog): Likewise. (showSaveDialog): Likewise. 2005-02-15 Michael Koch * javax/swing/JApplet.java (HIDE_ON_CLOSE): Removed. (EXIT_ON_CLOSE): Likewise. (DISPOSE_ON_CLOSE): Likewise. (DO_NOTHING_ON_CLOSE): Likewise. (close_action): Likewise. (getDefaultCloseOperation): Likewise. (setDefaultCloseOperation): Likewise. (processWindowEvent): Likewise. (getPreferredSize): Simplified. * javax/swing/JInternalFrame.java (setDefaultCloseOperation): Fixed throwing exception on wrong argument value. * javax/swing/JWindow.java (HIDE_ON_CLOSE): Removed. (EXIT_ON_CLOSE): Likewise. (DISPOSE_ON_CLOSE): Likewise. (DO_NOTHING_ON_CLOSE): Likewise. (close_action): Likewise. (processKeyEvent): Likewise. (setDefaultCloseOperation): Likewise. (getPreferredSize): Simplified. 2005-02-15 Michael Koch * javax/swing/JTextField.java (getPreferredSize): Re-implemented. 2005-02-15 Michael Koch * javax/swing/JLabel.java (setDisplayedMnemonic): Use only upper case characters. (setDisplayedMnemonicIndex): Handle index == -1 and fire PropertyChangeEvent after property got set to the new index. 2005-02-15 Robert Schuster * javax/swing/JComboBox.java: (JComboBox): Removed selection of the first item in the model. 2005-02-15 Robert Schuster * javax/swing/JComboBox.java added support for no item being selected (JComboBox): select first or nothing depending on element count (setModel): cleaned up unneeded "this." usage, added more docs, made exception behavior match that of the JDK (setLighWeightPopupEnabled): removed unneeded "this." usage (setEditable): dito (setMaximumRowCount): dito (setRenderer): dito (setPrototypeDisplayValue): dito (getSelectedItem): simplified, added more user doc (setSelectedIndex): corrected exception behavior, added more user doc (getSelectedIndex): fixed hardcoded dependency on DefaultComboBoxModel, added performance warning to user doc (addItem): fixed exception behavior, added user doc (insertItemAt): dito (removeItem): dito (removeItemAt): dito (removeAll): fixed exception behavior, added user doc, added support for model not being instance of DefaultComboBoxModel (getSelectedItemObjects): simplified (getItemCount): fixed dependency on DefaultComboBoxModel (getItemAt): fixed dependency on MutableComboBoxModel * javax/swing/DefaultComboBoxModel.java: (setSelectedItem): updates selected item only if new value is null or known (match JDK behavior) * javax/swing/plaf/basic/BasicComboBoxUI.java: (paintCurrentValue): renders "" if no item is selected 2005-02-15 Michael Koch * javax/swing/plaf/metal/MetalTheme.java, javax/swing/plaf/metal/DefaultMetalTheme.java: New files. * javax/swing/plaf/metal/MetalLookAndFeel.java * Makefile.am: Added the new files. * Makefile.in: Regenerated. 2005-02-15 Olga Rodimina * javax/swing/JTable.java (editorComp): New field. (JTable): Initialize local variables and call updateUI (selectionBackground): Make protected. (selectionForeground): Likewise. (initializeLocalVars): Create default editors and renderers, initialize editingColumn, editingRow variables. (createDefaultEditors): New Method. (createDefaultRenderers): Likewise. (createDefaultListSelectionModel): Removed (createDefaultSelectionModel): New Method. (createDefaultTableHeader): Likewise (removeColumn): Likewise. (getEditingColumn): Likewise. (setEditingColumn): Likewise. (getEditingRow): Likewise. (setEditingRow): Likewise. (getEditorComponent): Likewise. (isEditing): Likewise. (setDefaultEditor): Likewise. (addColumnSelectionInterval): Likewise. (addRowSelectionInterval): Likewise. (setColumnSelectionInterval): Likewise. (setRowSelectionInterval): Likewise. (removeColumnSelectionInterval): Likewise. (removeRowSelectionInterval): Likewise. (isColumnSelected): Likewise. (isRowSelected): Likewise. (isCellSelected): Likewise. (selectAll): Likewise. 2005-02-15 Michael Koch * javax/swing/JTable.java (addColumn): New method. (getColumnClass): Likewise. (getColumnName): Likewise. 2005-02-15 Paul Jenner * javax/swing/TransferHandler.java (createTransferable): Made protected. 2005-02-15 Michael Koch * javax/swing/JTable.java, javax/swing/plaf/basic/BasicTableHeaderUI.java, javax/swing/plaf/basic/BasicTableUI.java: Use fixed get/setIntercellSpacing() methods. 2005-02-15 Michael Koch * javax/swing/JTable.java (getIntercellSpacing): Fixed typo in method name. (setIntercellSpacing): Likewise. 2005-02-15 Michael Koch * javax/swing/text/JTextComponent.java (focusAccelerator): New variable. (getFocusAccelerator): New method. (setFocusAccelerator): Likewise. 2005-02-15 Michael Koch * javax/swing/JComponent.java (setTransferHandler): Made public. Fire property change event. * javax/swing/TransferHandler.java: Implemented. * javax/swing/text/JTextComponent.java (DefaultTransferHandler): New inner class. (defaultTransferHandler): New variable. (copy): New method. (cut): Likewise. (paste): Likewise. (doTransferAction): Likewise. 2005-02-15 Michael Koch * javax/swing/JTree.java (collapsePath): New method. (collapseRow): Likewise. (expandPath): Likewise. (expandRow): Likewise. (checkExpandParents): Likewise. (doExpandParents): Likewise. (setExpandedState): Likewise. (makeVisible): Likewise. 2005-02-15 Michael Koch * javax/swing/JPasswordField.java: Updated javadocs. 2005-02-15 Michael Koch * javax/swing/JLayeredPane.java (getLayer): Fixed return type, made public. (getPosition): Use new getLayer(). (SetPosition): Likewise. (getIndexOf): Likewise. (remove): Likewise. * javax/swing/JInternalFrame.java (getLayer): Use new JLayeredPane.getLayer(). 2005-02-15 Michael Koch * javax/swing/table/TableColumn.java: Added/fixed javadocs over all. (setHeaderValue): Simplified. Do nothing when old value == new value. 2005-02-15 Thomas Fitzsimmons * gnu/java/awt/peer/gtk/GdkGraphics.java (setClip): Protect against null clip region. * gnu/java/awt/peer/gtk/GtkFramePeer.java (create): Call gtkWindowSetResizable. (postConfigureEvent): Only revalidate if frame size has changed. * gnu/java/awt/peer/gtk/GtkWindowPeer.java (postConfigureEvent): Only revalidate if frame size has changed. * java/awt/Component.java (reshape): Only repaint and post component events if component is showing. * java/awt/Container.java (addImpl): Only post container event if container is showing. (remove): Likewise. * java/awt/Window.java (setLocationRelativeTo): Implement. (setBoundsCallback): Only post component events if component is showing. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (clearRect): Protect against null graphics structure. Flush gdk event queue. 2005-02-15 Michael Koch * javax/imageio/ImageReader.java, javax/imageio/ImageTranscoder.java, javax/imageio/ImageWriter.java, javax/imageio/spi/ImageInputStreamSpi.java, javax/imageio/spi/ImageOutputStreamSpi.java, javax/imageio/spi/ServiceRegistry.java, javax/imageio/stream/ImageInputStream.java, javax/imageio/stream/ImageOutputStream.java: Updated. * javax/imageio/IIOException.java, javax/imageio/IIOImage.java, javax/imageio/IIOParam.java, javax/imageio/IIOParamController.java, javax/imageio/ImageIO.java, javax/imageio/ImageReadParam.java, javax/imageio/ImageTypeSpecifier.java, javax/imageio/ImageWriteParam.java, javax/imageio/spi/IIORegistry.java, javax/imageio/spi/ImageReaderSpi.java, javax/imageio/spi/ImageWriterSpi.java, javax/imageio/stream/FileCacheImageInputStream.java, javax/imageio/stream/FileCacheImageOutputStream.java, javax/imageio/stream/FileImageInputStream.java, javax/imageio/stream/FileImageOutputStream.java, javax/imageio/stream/ImageInputStreamImpl.java, javax/imageio/stream/ImageOutputStreamImpl.java, javax/imageio/stream/MemoryCacheImageInputStream.java, javax/imageio/stream/MemoryCacheImageOutputStream.java, javax/imageio/event/IIOReadProgressListener.java, javax/imageio/event/IIOReadUpdateListener.java, javax/imageio/event/IIOReadWarningListener.java, javax/imageio/event/IIOWriteProgressListener.java, javax/imageio/event/IIOWriteWarningListener.java, javax/imageio/metadata/IIOMetadata.java, javax/imageio/metadata/IIOMetadataController.java, javax/imageio/metadata/IIOMetadataFormat.java, javax/imageio/metadata/IIOInvalidTreeException.java, javax/imageio/metadata/IIOMetadataFormatImpl.java, javax/imageio/metadata/IIOMetadataNode.java: New files. * Makefile.am (javax_source_files): Added new files * Makefile.in: Regenerated. 2005-02-15 Graydon Hoare * gnu/java/awt/peer/gtk/GdkGraphics2D.java: Rework painting into BufferedImages * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java: Construct BufferedImage with alpha only when alpha is present in colormodel. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Rework painting into client-side jint arrays. * jni/gtk-peer/gtkcairopeer.h: Likewise. 2005-02-15 Michael Koch * javax/swing/DefaultListCellRenderer.java (serialVersionUID): Made private. (getListCellRendererComponent): Set horizontal alignment. * javax/swing/JLabel.java (setVerticalAlignment): Re-implemented. (setHorizontalAlignment): Do nothing if old value = new value. * javax/swing/JList.java (setCellRenderer): Likewise. (setModel): Re-implemented. (setSelectionModel): Likewise. 2005-02-15 David Gilbert * java/awt/Component.java, java/awt/geom/Rectangle2D.java: Javadoc fixes. 2005-02-15 Michael Koch * javax/swing/AbstractListModel.java (fireContentsChanged): Simplified. (fireIntervalAdded): Likewise. (fireIntervalRemoved): Likewise. * javax/swing/DefaultSingleSelectionModel.java: Reformatted. (fireStateChanged): Simplified. * javax/swing/JPopupMenu.java (setSelectionModel): Set property. 2005-02-15 Michael Koch * java/awt/print/Book.java: Reformatted. 2005-02-15 Michael Koch * java/awt/geom/Area.java (QuadSegment.curveArea): Remove unused variables. (CubicSegment.curveArea): Likewise. 2005-02-15 Michael Koch * javax/swing/JTree.java (ANCHOR_SELECTION_PATH_PROPERTY): Added @since tag. (LEAD_SELECTION_PATH_PROPERTY): Likewise. (EXPANDS_SELECTED_PATHS_PROPERTY): Likewise. (EXPANDED): New constant. (COLLAPSED): Likewise. (nodeStates): New field. (cellEditor): New method. (cellRenderer): Likewise. (selectionModel): Likewise. (treeModel): Likewise. (scrollPathToVisible): Likewise. (scrollRowToVisible): Likewise. (isCollapsed): Likewise. (isExpanded): Likewise. (clearToggledPaths): Likewise. (getDescendantToggledPaths): Likewise. (hasBeenExpanded): Likewise. (isVisible): Likewise. (isPathEditable): Likewise. 2005-02-15 Michael Koch * javax/swing/JLayeredPane.java: Reformatted. 2005-02-15 Michael Koch * javax/swing/tree/DefaultMutableTreeNode.java: Completely Revised. * javax/swing/tree/MutableTreeNode.java: Reformatted. 2005-02-15 Michael Koch * javax/swing/JFormattedTextField.java (setDocument): Call setDocument of super class. Don't fire property change event. 2005-02-15 Sven de Marothy * java/awt/image/IndexColorModel.java: Add FIXME with respect to alpha handling. (getAlpha): Default to returning opaque pixels. * java/awt/image/MultiPixelPackedSampleModel.java (MultiPixelPackedSampleModel): Corrected parameters, order of bit shifts and masks, stride length off by one. 2005-02-15 Michael Koch * javax/swing/JList.java, javax/swing/JTree.java: Added much new methods and fixed much methods setting bound properties. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95115 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/gnu/java/awt/ClasspathToolkit.java | 17 +- libjava/gnu/java/awt/EmbeddedWindow.java | 1 - .../gnu/java/awt/color/ClutProfileConverter.java | 1 - libjava/gnu/java/awt/image/ImageDecoder.java | 42 +- .../gnu/java/awt/peer/ClasspathTextLayoutPeer.java | 7 - libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java | 15 +- libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java | 39 +- libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java | 239 +-- libjava/gnu/java/awt/peer/gtk/GdkGraphics.java | 3 +- libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java | 1614 ++++++++++---------- .../awt/peer/gtk/GdkGraphicsConfiguration.java | 138 ++ .../java/awt/peer/gtk/GdkGraphicsEnvironment.java | 21 +- .../gnu/java/awt/peer/gtk/GdkPixbufDecoder.java | 519 ++++++- libjava/gnu/java/awt/peer/gtk/GdkRobotPeer.java | 94 ++ .../java/awt/peer/gtk/GdkScreenGraphicsDevice.java | 82 + libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java | 1 - libjava/gnu/java/awt/peer/gtk/GtkArg.java | 61 - libjava/gnu/java/awt/peer/gtk/GtkArgList.java | 75 - libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java | 1 - .../java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java | 13 + libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java | 2 - libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java | 1 - .../gnu/java/awt/peer/gtk/GtkComponentPeer.java | 18 +- .../gnu/java/awt/peer/gtk/GtkContainerPeer.java | 2 - libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java | 4 +- .../gnu/java/awt/peer/gtk/GtkFileDialogPeer.java | 4 +- libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java | 1 - libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java | 11 +- libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java | 8 +- libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java | 2 - libjava/gnu/java/awt/peer/gtk/GtkMainThread.java | 111 -- .../java/awt/peer/gtk/GtkMenuComponentPeer.java | 2 - libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java | 2 - .../gnu/java/awt/peer/gtk/GtkScrollPanePeer.java | 1 - .../gnu/java/awt/peer/gtk/GtkScrollbarPeer.java | 2 +- .../java/awt/peer/gtk/GtkTextComponentPeer.java | 5 +- libjava/gnu/java/awt/peer/gtk/GtkToolkit.java | 82 +- libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java | 15 +- 38 files changed, 1880 insertions(+), 1376 deletions(-) create mode 100644 libjava/gnu/java/awt/peer/gtk/GdkGraphicsConfiguration.java create mode 100644 libjava/gnu/java/awt/peer/gtk/GdkRobotPeer.java create mode 100644 libjava/gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java delete mode 100644 libjava/gnu/java/awt/peer/gtk/GtkArg.java delete mode 100644 libjava/gnu/java/awt/peer/gtk/GtkArgList.java delete mode 100644 libjava/gnu/java/awt/peer/gtk/GtkMainThread.java (limited to 'libjava/gnu/java/awt') diff --git a/libjava/gnu/java/awt/ClasspathToolkit.java b/libjava/gnu/java/awt/ClasspathToolkit.java index de97c4a0edf..72302e11c30 100644 --- a/libjava/gnu/java/awt/ClasspathToolkit.java +++ b/libjava/gnu/java/awt/ClasspathToolkit.java @@ -41,16 +41,20 @@ package gnu.java.awt; import gnu.java.awt.peer.ClasspathFontPeer; import gnu.java.awt.peer.ClasspathTextLayoutPeer; -import java.awt.Image; +import java.awt.AWTException; import java.awt.Dimension; import java.awt.DisplayMode; +import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; +import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.Image; import java.awt.Toolkit; import java.awt.font.FontRenderContext; import java.awt.image.ColorModel; import java.awt.image.ImageProducer; +import java.awt.peer.RobotPeer; import java.io.File; import java.io.InputStream; import java.net.MalformedURLException; @@ -90,7 +94,7 @@ public abstract class ClasspathToolkit * #getImage(java.net.URL)}. For images that were loaded via a path * to an image file, the map contains a key with a file URL. */ - private Map imageCache; + private HashMap imageCache; /** @@ -169,7 +173,6 @@ public abstract class ClasspathToolkit * this font peer should have, such as size, weight, family name, or * transformation. */ - public abstract ClasspathFontPeer getClasspathFontPeer (String name, Map attrs); public abstract ClasspathTextLayoutPeer @@ -184,7 +187,6 @@ public abstract class ClasspathToolkit * implement {@link java.awt.font.OpenType} or * {@link java.awt.font.MultipleMaster}. */ - public Font getFont (String name, Map attrs) { return new Font (name, attrs); @@ -350,6 +352,9 @@ public abstract class ClasspathToolkit return null; } + public abstract RobotPeer createRobot (GraphicsDevice screen) + throws AWTException; + /** * Used to register ImageIO SPIs provided by the toolkit. */ @@ -357,4 +362,8 @@ public abstract class ClasspathToolkit public void registerImageIOSpis(IIORegistry reg) { } + + public abstract boolean nativeQueueEmpty(); + public abstract void wakeNativeQueue(); + public abstract void iterateNativeQueue(EventQueue locked, boolean block); } diff --git a/libjava/gnu/java/awt/EmbeddedWindow.java b/libjava/gnu/java/awt/EmbeddedWindow.java index 08bc02755ea..c3cfac48b19 100644 --- a/libjava/gnu/java/awt/EmbeddedWindow.java +++ b/libjava/gnu/java/awt/EmbeddedWindow.java @@ -38,7 +38,6 @@ exception statement from your version. */ package gnu.java.awt; -import gnu.classpath.Configuration; import gnu.java.awt.peer.EmbeddedWindowPeer; import gnu.java.security.action.SetAccessibleAction; diff --git a/libjava/gnu/java/awt/color/ClutProfileConverter.java b/libjava/gnu/java/awt/color/ClutProfileConverter.java index d33a6887eec..5b06f48eed8 100644 --- a/libjava/gnu/java/awt/color/ClutProfileConverter.java +++ b/libjava/gnu/java/awt/color/ClutProfileConverter.java @@ -38,7 +38,6 @@ package gnu.java.awt.color; -import java.awt.color.ColorSpace; import java.awt.color.ICC_Profile; diff --git a/libjava/gnu/java/awt/image/ImageDecoder.java b/libjava/gnu/java/awt/image/ImageDecoder.java index 233dfb1b28d..d279d567467 100644 --- a/libjava/gnu/java/awt/image/ImageDecoder.java +++ b/libjava/gnu/java/awt/image/ImageDecoder.java @@ -74,6 +74,11 @@ public abstract class ImageDecoder implements ImageProducer this.url = url; } + public ImageDecoder (InputStream is) + { + this.input = is; + } + public ImageDecoder (byte[] imagedata, int imageoffset, int imagelength) { data = imagedata; @@ -99,7 +104,7 @@ public abstract class ImageDecoder implements ImageProducer public void startProduction (ImageConsumer ic) { if (!isConsumer(ic)) - addConsumer (ic); + addConsumer(ic); Vector list = (Vector) consumers.clone (); try @@ -108,17 +113,30 @@ public abstract class ImageDecoder implements ImageProducer // ImageDecoder constructors so that exceptions cause // imageComplete to be called with an appropriate error // status. - if (url != null) - input = url.openStream(); - else - { - if (filename != null) - input = new FileInputStream (filename); - else - input = new ByteArrayInputStream (data, offset, length); - } - - produce (list, input); + if (input == null) + { + try + { + if (url != null) + input = url.openStream(); + else + { + if (filename != null) + input = new FileInputStream (filename); + else + input = new ByteArrayInputStream (data, offset, length); + } + produce (list, input); + } + finally + { + input = null; + } + } + else + { + produce (list, input); + } } catch (Exception e) { diff --git a/libjava/gnu/java/awt/peer/ClasspathTextLayoutPeer.java b/libjava/gnu/java/awt/peer/ClasspathTextLayoutPeer.java index 143412caf99..07b4b3eb403 100644 --- a/libjava/gnu/java/awt/peer/ClasspathTextLayoutPeer.java +++ b/libjava/gnu/java/awt/peer/ClasspathTextLayoutPeer.java @@ -38,19 +38,12 @@ exception statement from your version. */ package gnu.java.awt.peer; -import java.awt.Font; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; -import java.text.CharacterIterator; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; -import java.util.Map; -import java.awt.font.TextAttribute; - /** * @author Graydon Hoare diff --git a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java index 3cd2f9a1cd2..e871587a4a9 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java @@ -63,8 +63,6 @@ public class GdkFontMetrics extends FontMetrics static final int TEXT_METRICS_X_ADVANCE = 4; static final int TEXT_METRICS_Y_ADVANCE = 5; - static native void getPeerFontMetrics(GdkFontPeer peer, double [] metrics); - static native void getPeerTextMetrics(GdkFontPeer peer, String str, double [] metrics); public GdkFontMetrics (Font font) { @@ -77,12 +75,7 @@ public class GdkFontMetrics extends FontMetrics font_metrics = new int[5]; double [] hires = new double[5]; - - if (GtkToolkit.useGraphics2D ()) - GdkGraphics2D.getPeerFontMetrics(peer, hires); - else - getPeerFontMetrics (peer, hires); - + peer.getFontMetrics (hires); for (int i = 0; i < 5; ++i) font_metrics[i] = (int) hires[i]; } @@ -90,10 +83,7 @@ public class GdkFontMetrics extends FontMetrics public int stringWidth (String str) { double [] hires = new double[6]; - if (GtkToolkit.useGraphics2D()) - GdkGraphics2D.getPeerTextMetrics(peer, str, hires); - else - getPeerTextMetrics(peer, str, hires); + peer.getTextMetrics(str, hires); return (int) hires [TEXT_METRICS_WIDTH]; } @@ -115,7 +105,6 @@ public class GdkFontMetrics extends FontMetrics public int getLeading () { return 1; -// return metrics[ASCENT] + metrics[DESCENT]; } public int getAscent () diff --git a/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java b/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java index ee051451026..5573a1b4d7f 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java @@ -37,19 +37,21 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.peer.FontPeer; -import java.awt.*; -import java.awt.geom.*; -import java.awt.font.*; + +import gnu.classpath.Configuration; +import gnu.java.awt.peer.ClasspathFontPeer; + +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.font.LineMetrics; +import java.awt.geom.Rectangle2D; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; -import java.util.MissingResourceException; import java.text.CharacterIterator; -import java.text.AttributedCharacterIterator; import java.text.StringCharacterIterator; -import gnu.classpath.Configuration; -import gnu.java.awt.peer.ClasspathFontPeer; public class GdkFontPeer extends ClasspathFontPeer { @@ -81,6 +83,9 @@ public class GdkFontPeer extends ClasspathFontPeer private native void dispose (); private native void setFont (String family, int style, int size, boolean useGraphics2D); + native void getFontMetrics(double [] metrics); + native void getTextMetrics(String str, double [] metrics); + protected void finalize () { if (GtkToolkit.useGraphics2D ()) @@ -158,26 +163,33 @@ public class GdkFontPeer extends ClasspathFontPeer public boolean canDisplay (Font font, char c) { - throw new UnsupportedOperationException (); + // FIXME: inquire with pango + return true; } public int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit) { - throw new UnsupportedOperationException (); + // FIXME: inquire with pango + return -1; } + + private native GdkGlyphVector getGlyphVector(String txt, + Font f, + FontRenderContext ctx); public GlyphVector createGlyphVector (Font font, FontRenderContext ctx, CharacterIterator i) { - return new GdkGlyphVector(font, this, ctx, buildString (i)); + return getGlyphVector(buildString (i), font, ctx); } public GlyphVector createGlyphVector (Font font, FontRenderContext ctx, int[] glyphCodes) { - return new GdkGlyphVector (font, this, ctx, glyphCodes); + return null; + // return new GdkGlyphVector (font, this, ctx, glyphCodes); } public byte getBaselineFor (Font font, char c) @@ -259,7 +271,8 @@ public class GdkFontPeer extends ClasspathFontPeer public Rectangle2D getStringBounds (Font font, CharacterIterator ci, int begin, int limit, FontRenderContext frc) { - throw new UnsupportedOperationException (); + GdkGlyphVector gv = getGlyphVector(buildString (ci, begin, limit), font, frc); + return gv.getVisualBounds(); } public boolean hasUniformLineMetrics (Font font) diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java b/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java index c37de5274ac..4e66a86eb42 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java @@ -38,8 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import gnu.classpath.Configuration; - import java.awt.Font; import java.awt.Rectangle; import java.awt.Shape; @@ -54,36 +52,57 @@ import java.awt.geom.Rectangle2D; public class GdkGlyphVector extends GlyphVector { - static + /* We use a simple representation for glyph vectors here. Glyph i + * consumes 8 doubles: + * + * logical x: extents[ 10*i ] + * logical y: extents[ 10*i + 1 ] + * logical width: extents[ 10*i + 2 ] + * logical height: extents[ 10*i + 3 ] + * + * visual x: extents[ 10*i + 4 ] + * visual y: extents[ 10*i + 5 ] + * visual width: extents[ 10*i + 6 ] + * visual height: extents[ 10*i + 7 ] + * + * origin pos x: extents[ 10*i + 8 ] + * origin pos y: extents[ 10*i + 9 ] + * + * as well as one int, code[i], representing the glyph code in the font. + */ + + double [] extents; + int [] codes; + + Font font; + FontRenderContext fontRenderContext; + + Rectangle2D allLogical; + Rectangle2D allVisual; + + public GdkGlyphVector(double[] extents, int[] codes, Font font, FontRenderContext frc) { - if (Configuration.INIT_LOAD_LIBRARY) + this.extents = extents; + this.codes = codes; + this.font = font; + this.fontRenderContext = frc; + + allLogical = new Rectangle2D.Double(); + allVisual = new Rectangle2D.Double(); + + for (int i = 0; i < codes.length; ++i) { - System.loadLibrary("gtkpeer"); + allLogical.add (new Rectangle2D.Double(extents[10*i ] + extents[10*i + 8], + extents[10*i + 1] + extents[10*i + 9], + extents[10*i + 2], + extents[10*i + 3])); + + allVisual.add (new Rectangle2D.Double(extents[10*i + 4] + extents[10*i + 8], + extents[10*i + 5] + extents[10*i + 9], + extents[10*i + 6], + extents[10*i + 7])); } - - if (GtkToolkit.useGraphics2D ()) - initStaticState (); } - native static void initStaticState (); - private final int native_state = GtkGenericPeer.getUniqueInteger (); - - private Font font; - private FontRenderContext ctx; - - private native void initState (GdkFontPeer peer, FontRenderContext ctx); - private native void setChars (String s); - private native void setGlyphCodes (int codes[]); - private native void dispose (); - private native int glyphCode (int idx); - private native int numGlyphs (); - private native int glyphCharIndex (int idx); - private native double[] allLogicalExtents (); - private native double[] allInkExtents (); - private native double[] glyphLogicalExtents (int idx); - private native double[] glyphInkExtents (int idx); - private native boolean glyphIsHorizontal (int idx); - private native boolean isEqual (GdkGlyphVector ggv); - /* geometric notes: @@ -108,26 +127,14 @@ public class GdkGlyphVector extends GlyphVector */ - - public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, String s) + public double[] getExtents() { - font = f; - ctx = c; - initState (peer, ctx); - setChars (s); + return extents; } - public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, int codes[]) + public int[] getCodes() { - font = f; - ctx = c; - initState (peer, ctx); - setGlyphCodes (codes); - } - - protected void finalize () - { - dispose (); + return codes; } public Font getFont () @@ -137,12 +144,15 @@ public class GdkGlyphVector extends GlyphVector public FontRenderContext getFontRenderContext () { - return ctx; + return fontRenderContext; } public int getGlyphCharIndex (int glyphIndex) { - return glyphCharIndex (glyphIndex); + // FIXME: currently pango does not provide glyph-by-glyph + // reverse mapping information, so we assume a broken 1:1 + // glyph model here. This is plainly wrong. + return glyphIndex; } public int[] getGlyphCharIndices (int beginGlyphIndex, @@ -154,50 +164,44 @@ public class GdkGlyphVector extends GlyphVector ix = new int[numEntries]; for (int i = 0; i < numEntries; i++) - ix[i] = glyphCharIndex (beginGlyphIndex + i); + ix[i] = getGlyphCharIndex (beginGlyphIndex + i); return ix; } public int getGlyphCode (int glyphIndex) { - return glyphCode (glyphIndex); + return codes[glyphIndex]; } public int[] getGlyphCodes (int beginGlyphIndex, int numEntries, int[] codeReturn) { - int ix[] = codeReturn; - if (ix == null) - ix = new int[numEntries]; + if (codeReturn == null) + codeReturn = new int[numEntries]; - for (int i = 0; i < numEntries; i++) - ix[i] = glyphCode (beginGlyphIndex + i); - return ix; + System.arraycopy(codes, beginGlyphIndex, codeReturn, 0, numEntries); + return codeReturn; } - public Shape getGlyphLogicalBounds (int glyphIndex) + public Shape getGlyphLogicalBounds (int i) { - double extents[] = glyphLogicalExtents (glyphIndex); - return new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); + return new Rectangle2D.Double (extents[8*i], extents[8*i + 1], + extents[8*i + 2], extents[8*i + 3]); } - public GlyphMetrics getGlyphMetrics (int glyphIndex) + public GlyphMetrics getGlyphMetrics (int i) { - double extents[] = glyphLogicalExtents (glyphIndex); - Rectangle2D log_bounds = new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); - - extents = glyphInkExtents (glyphIndex); - Rectangle2D ink_bounds = new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); - - boolean is_horizontal = glyphIsHorizontal (glyphIndex); - - return new GlyphMetrics (is_horizontal, - (float)(log_bounds.getWidth() + log_bounds.getX()), - (float)(log_bounds.getHeight() + log_bounds.getY()), - ink_bounds, GlyphMetrics.STANDARD); + // FIXME: pango does not yield vertical layout information at the + // moment. + + boolean is_horizontal = true; + double advanceX = extents[8*i + 2]; // "logical width" == advanceX + double advanceY = 0; + + return new GlyphMetrics (is_horizontal, + (float) advanceX, (float) advanceY, + (Rectangle2D) getGlyphVisualBounds(i), + GlyphMetrics.STANDARD); } public Shape getGlyphOutline (int glyphIndex) @@ -210,20 +214,18 @@ public class GdkGlyphVector extends GlyphVector throw new UnsupportedOperationException (); } - public Rectangle getGlyphPixelBounds (int glyphIndex, + public Rectangle getGlyphPixelBounds (int i, FontRenderContext renderFRC, float x, float y) { - double extents[] = glyphInkExtents(glyphIndex); - return new Rectangle ((int)x, (int)y, (int)extents[2], (int)extents[3]); + return new Rectangle((int) x, (int) y, + (int) extents[8*i + 6], (int) extents[8*i + 7]); } - public Point2D getGlyphPosition (int glyphIndex) + public Point2D getGlyphPosition (int i) { - float[] ret = new float[2 * (glyphIndex + 1)]; - getGlyphPositions (0, glyphIndex + 1, ret); - return new Point2D.Float (ret[2 * glyphIndex], - ret[2 * glyphIndex + 1]); + return new Point2D.Double (extents[10*i + 8], + extents[10*i + 9]); } public float[] getGlyphPositions (int beginGlyphIndex, @@ -234,35 +236,25 @@ public class GdkGlyphVector extends GlyphVector if (fx == null) fx = new float[numEntries * 2]; - - float x = 0.0f; - float y = 0.0f; for (int i = 0; i < numEntries; ++i) { - boolean is_horizontal = glyphIsHorizontal (beginGlyphIndex + i); - double log_extents[] = glyphLogicalExtents (beginGlyphIndex + i); - fx[2*i] = x + (float)log_extents[0]; // x offset - fx[2*i + 1] = y + (float)log_extents[1]; // y offset - if (is_horizontal) - x += (float)log_extents[2]; // x advance ("logical width") in pango-ese - else - y += (float)log_extents[3]; // y advance ("logical height") in pango-ese + fx[2*i ] = (float) extents[10*i + 8]; + fx[2*i + 1] = (float) extents[10*i + 9]; } return fx; } public AffineTransform getGlyphTransform (int glyphIndex) { - // glyphs don't have independent transforms in these simple glyph + // Glyphs don't have independent transforms in these simple glyph // vectors; docs specify null is an ok return here. return null; } - public Shape getGlyphVisualBounds (int glyphIndex) + public Shape getGlyphVisualBounds (int i) { - double extents[] = glyphInkExtents (glyphIndex); - return new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); + return new Rectangle2D.Double(extents[8*i + 4], extents[8*i + 5], + extents[8*i + 6], extents[8*i + 7]); } public int getLayoutFlags () @@ -272,14 +264,12 @@ public class GdkGlyphVector extends GlyphVector public Rectangle2D getLogicalBounds () { - double extents[] = allLogicalExtents (); - return new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); + return allLogical; } public int getNumGlyphs () { - return numGlyphs (); + return codes.length; } public Shape getOutline () @@ -290,26 +280,28 @@ public class GdkGlyphVector extends GlyphVector public Rectangle getPixelBounds (FontRenderContext renderFRC, float x, float y) { - double extents[] = allInkExtents(); - return new Rectangle ((int)x, (int)y, - (int)extents[2], (int)extents[3]); + return new Rectangle((int)x, + (int)y, + (int) allVisual.getWidth(), + (int) allVisual.getHeight()); } public Rectangle2D getVisualBounds () { - double extents[] = allInkExtents(); - return new Rectangle2D.Double (extents[0], extents[1], - extents[2], extents[3]); + return allVisual; } public void performDefaultLayout () { } - public void setGlyphPosition (int glyphIndex, Point2D newPos) + public void setGlyphPosition (int i, Point2D newPos) { - // should we be ok twiddling pango's structure here? - throw new UnsupportedOperationException (); + extents[8*i ] = newPos.getX(); + extents[8*i + 1] = newPos.getY(); + + extents[8*i + 4] = newPos.getX(); + extents[8*i + 5] = newPos.getY(); } public void setGlyphTransform (int glyphIndex, @@ -327,8 +319,31 @@ public class GdkGlyphVector extends GlyphVector if (! (gv instanceof GdkGlyphVector)) return false; - GdkGlyphVector ggv = (GdkGlyphVector)gv; - return isEqual(ggv); + GdkGlyphVector ggv = (GdkGlyphVector) gv; + + if ((ggv.codes.length != this.codes.length) + || (ggv.extents.length != this.extents.length)) + return false; + + if ((ggv.font == null && this.font != null) + || (ggv.font != null && this.font == null) + || (!ggv.font.equals(this.font))) + return false; + + if ((ggv.fontRenderContext == null && this.fontRenderContext != null) + || (ggv.fontRenderContext != null && this.fontRenderContext == null) + || (!ggv.fontRenderContext.equals(this.fontRenderContext))) + return false; + + for (int i = 0; i < ggv.codes.length; ++i) + if (ggv.codes[i] != this.codes[i]) + return false; + + for (int i = 0; i < ggv.extents.length; ++i) + if (ggv.extents[i] != this.extents[i]) + return false; + + return true; } public GlyphJustificationInfo getGlyphJustificationInfo(int idx) diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java index 5aacf5296c6..0811287e9b6 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java @@ -426,7 +426,8 @@ public class GdkGraphics extends Graphics public void setClip (int x, int y, int width, int height) { - if (component != null && ! component.isRealized ()) + if ((component != null && ! component.isRealized ()) + || clip == null) return; clip.x = x; diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java index 82de03d5aec..3bf169cb6f7 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java @@ -1,5 +1,5 @@ -/* GdkGraphics2D.java - Copyright (C) 2003, 2004 Free Software Foundation, Inc. +/* GdkGraphics2D.java -- + Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -40,7 +40,6 @@ package gnu.java.awt.peer.gtk; import gnu.classpath.Configuration; import gnu.java.awt.ClasspathToolkit; -import gnu.java.awt.peer.ClasspathFontPeer; import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -60,17 +59,15 @@ import java.awt.Shape; import java.awt.Stroke; import java.awt.TexturePaint; import java.awt.Toolkit; -import java.awt.color.ColorSpace; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; -import java.awt.font.GlyphJustificationInfo; +import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; -import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; @@ -78,16 +75,17 @@ import java.awt.image.ColorModel; import java.awt.image.CropImageFilter; import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; +import java.awt.image.DirectColorModel; import java.awt.image.FilteredImageSource; -import java.awt.image.ImageConsumer; import java.awt.image.ImageObserver; import java.awt.image.ImagingOpException; -import java.awt.image.SampleModel; +import java.awt.image.MultiPixelPackedSampleModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; +import java.awt.image.SampleModel; import java.awt.image.WritableRaster; -import java.awt.image.renderable.RenderableImage; import java.awt.image.renderable.RenderContext; +import java.awt.image.renderable.RenderableImage; import java.text.AttributedCharacterIterator; import java.util.HashMap; import java.util.Map; @@ -95,7 +93,6 @@ import java.util.Stack; public class GdkGraphics2D extends Graphics2D { - ////////////////////////////////////// ////// State Management Methods ////// ////////////////////////////////////// @@ -103,14 +100,14 @@ public class GdkGraphics2D extends Graphics2D static { if (Configuration.INIT_LOAD_LIBRARY) - { - System.loadLibrary("gtkpeer"); - } + System.loadLibrary("gtkpeer"); - if (GtkToolkit.useGraphics2D ()) - initStaticState (); + if (GtkToolkit.useGraphics2D()) + initStaticState(); } - native static void initStaticState (); + + static native void initStaticState(); + private final int native_state = GtkGenericPeer.getUniqueInteger(); private Paint paint; @@ -120,246 +117,255 @@ public class GdkGraphics2D extends Graphics2D private Shape clip; private AffineTransform transform; private GtkComponentPeer component; - private Font font; + private Font font; private RenderingHints hints; private BufferedImage bimage; - + private boolean pixelConversionRequired; + private int[] pixelBuffer; private Composite comp; - private Stack stateStack; - - native private void initState (GtkComponentPeer component); - native private void initState (int width, int height); - native private void copyState (GdkGraphics2D g); - native public void dispose (); - native private int[] getImagePixels(); - native private void cairoSurfaceSetFilter(int filter); - native void connectSignals (GtkComponentPeer component); - public void finalize () + private native void initState(GtkComponentPeer component); + private native void initState(int width, int height); + private native void initState(int[] pixes, int width, int height); + private native void copyState(GdkGraphics2D g); + public native void dispose(); + private native void cairoSurfaceSetFilter(int filter); + native void connectSignals(GtkComponentPeer component); + + public void finalize() { dispose(); } - public Graphics create () + public Graphics create() { - return new GdkGraphics2D (this); + return new GdkGraphics2D(this); } - public Graphics create (int x, int y, int width, int height) + public Graphics create(int x, int y, int width, int height) { - return new GdkGraphics2D (width, height); + return new GdkGraphics2D(width, height); } - GdkGraphics2D (GdkGraphics2D g) + GdkGraphics2D(GdkGraphics2D g) { paint = g.paint; stroke = g.stroke; - setRenderingHints (g.hints); + setRenderingHints(g.hints); if (g.fg.getAlpha() != -1) - fg = new Color (g.fg.getRed (), g.fg.getGreen (), - g.fg.getBlue (), g.fg.getAlpha ()); - else - fg = new Color (g.fg.getRGB ()); + fg = new Color(g.fg.getRed(), g.fg.getGreen(), g.fg.getBlue(), + g.fg.getAlpha()); + else + fg = new Color(g.fg.getRGB()); if (g.bg.getAlpha() != -1) - bg = new Color(g.bg.getRed (), g.bg.getGreen (), - g.bg.getBlue (), g.bg.getAlpha ()); + bg = new Color(g.bg.getRed(), g.bg.getGreen(), g.bg.getBlue(), + g.bg.getAlpha()); else - bg = new Color (g.bg.getRGB ()); + bg = new Color(g.bg.getRGB()); if (g.clip == null) clip = null; else - clip = new Rectangle (g.getClipBounds ()); + clip = new Rectangle(g.getClipBounds()); if (g.transform == null) - transform = new AffineTransform (); + transform = new AffineTransform(); else - transform = new AffineTransform (g.transform); + transform = new AffineTransform(g.transform); font = g.font; component = g.component; - copyState (g); - - setColor (fg); - setBackground (bg); - setPaint (paint); - setStroke (stroke); - setTransform (transform); - setClip (clip); + copyState(g); + + setColor(fg); + setBackground(bg); + setPaint(paint); + setStroke(stroke); + setTransform(transform); + setClip(clip); stateStack = new Stack(); } - GdkGraphics2D (int width, int height) + GdkGraphics2D(int width, int height) { - initState (width, height); + initState(width, height); setColor(Color.black); - setBackground (Color.black); - setPaint (getColor()); - setFont (new Font("SansSerif", Font.PLAIN, 12)); - setTransform (new AffineTransform ()); - setStroke (new BasicStroke ()); - setRenderingHints (getDefaultHints()); + setBackground(Color.black); + setPaint(getColor()); + setFont(new Font("SansSerif", Font.PLAIN, 12)); + setTransform(new AffineTransform()); + setStroke(new BasicStroke()); + setRenderingHints(getDefaultHints()); stateStack = new Stack(); } - GdkGraphics2D (GtkComponentPeer component) + GdkGraphics2D(GtkComponentPeer component) { this.component = component; - - setFont (new Font("SansSerif", Font.PLAIN, 12)); - - if (component.isRealized ()) - initComponentGraphics2D (); + + if (component.isRealized()) + initComponentGraphics2D(); else - connectSignals (component); + connectSignals(component); } - void initComponentGraphics2D () + void initComponentGraphics2D() { - initState (component); + initState(component); - setColor (component.awtComponent.getForeground ()); - setBackground (component.awtComponent.getBackground ()); - setPaint (getColor()); - setTransform (new AffineTransform ()); - setStroke (new BasicStroke ()); - setRenderingHints (getDefaultHints()); + setColor(component.awtComponent.getForeground()); + setBackground(component.awtComponent.getBackground()); + setPaint(getColor()); + setTransform(new AffineTransform()); + setStroke(new BasicStroke()); + setRenderingHints(getDefaultHints()); + setFont(new Font("SansSerif", Font.PLAIN, 12)); - stateStack = new Stack (); + stateStack = new Stack(); } - GdkGraphics2D (BufferedImage bimage) + GdkGraphics2D(BufferedImage bimage) { - - this.bimage = bimage; - initState (bimage.getWidth(), bimage.getHeight()); + this.bimage = bimage; + this.pixelBuffer = findSimpleIntegerArray(bimage.getColorModel(), + bimage.getRaster()); + if (this.pixelBuffer == null) + { + this.pixelBuffer = new int[bimage.getRaster().getWidth() * bimage.getRaster() + .getHeight()]; + this.pixelConversionRequired = true; + } + else + { + this.pixelConversionRequired = false; + } + + initState(this.pixelBuffer, bimage.getWidth(), bimage.getHeight()); setColor(Color.black); - setBackground (Color.black); - setPaint (getColor()); - setFont (new Font("SansSerif", Font.PLAIN, 12)); - setTransform (new AffineTransform ()); - setStroke (new BasicStroke ()); - setRenderingHints (getDefaultHints()); + setBackground(Color.black); + setPaint(getColor()); + setFont(new Font("SansSerif", Font.PLAIN, 12)); + setTransform(new AffineTransform()); + setStroke(new BasicStroke()); + setRenderingHints(getDefaultHints()); stateStack = new Stack(); - + // draw current buffered image to the pixmap associated - // with it. - - drawImage (bimage, new AffineTransform (1,0,0,1,0,0), bg, null); + // with it, if the image is not equal to our paint buffer. + if (pixelConversionRequired) + drawImage(bimage, new AffineTransform(1, 0, 0, 1, 0, 0), bg, null); } - //////////////////////////////////// ////// Native Drawing Methods ////// //////////////////////////////////// // GDK drawing methods - private native void gdkDrawDrawable (GdkGraphics2D other, int x, int y); + private native void gdkDrawDrawable(GdkGraphics2D other, int x, int y); // drawing utility methods - private native void drawPixels (int pixels[], int w, int h, int stride, double i2u[]); - private native void setTexturePixels (int pixels[], int w, int h, int stride); - private native void setGradient (double x1, double y1, - double x2, double y2, - int r1, int g1, int b1, int a1, - int r2, int g2, int b2, int a2, - boolean cyclic); + private native void drawPixels(int[] pixels, int w, int h, int stride, + double[] i2u); + private native void setTexturePixels(int[] pixels, int w, int h, int stride); + private native void setGradient(double x1, double y1, double x2, double y2, + int r1, int g1, int b1, int a1, int r2, + int g2, int b2, int a2, boolean cyclic); // simple passthroughs to cairo - private native void cairoSave (); - private native void cairoRestore (); - private native void cairoSetMatrix (double m[]); - private native void cairoSetOperator (int cairoOperator); - private native void cairoSetRGBColor (double red, double green, double blue); - private native void cairoSetAlpha (double alpha); - private native void cairoSetFillRule (int cairoFillRule); - private native void cairoSetLineWidth (double width); - private native void cairoSetLineCap (int cairoLineCap); - private native void cairoSetLineJoin (int cairoLineJoin); - private native void cairoSetDash (double dashes[], int ndash, double offset); - private native void cairoSetMiterLimit (double limit); - private native void cairoNewPath (); - private native void cairoMoveTo (double x, double y); - private native void cairoLineTo (double x, double y); - private native void cairoCurveTo (double x1, double y1, - double x2, double y2, - double x3, double y3); - private native void cairoRelMoveTo (double dx, double dy); - private native void cairoRelLineTo (double dx, double dy); - private native void cairoRelCurveTo (double dx1, double dy1, - double dx2, double dy2, - double dx3, double dy3); - private native void cairoRectangle (double x, double y, - double width, double height); - private native void cairoClosePath (); - private native void cairoStroke (); - private native void cairoFill (); - private native void cairoClip (); - + private native void cairoSave(); + private native void cairoRestore(); + private native void cairoSetMatrix(double[] m); + private native void cairoSetOperator(int cairoOperator); + private native void cairoSetRGBColor(double red, double green, double blue); + private native void cairoSetAlpha(double alpha); + private native void cairoSetFillRule(int cairoFillRule); + private native void cairoSetLineWidth(double width); + private native void cairoSetLineCap(int cairoLineCap); + private native void cairoSetLineJoin(int cairoLineJoin); + private native void cairoSetDash(double[] dashes, int ndash, double offset); + + private native void cairoSetMiterLimit(double limit); + private native void cairoNewPath(); + private native void cairoMoveTo(double x, double y); + private native void cairoLineTo(double x, double y); + private native void cairoCurveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + private native void cairoRelMoveTo(double dx, double dy); + private native void cairoRelLineTo(double dx, double dy); + private native void cairoRelCurveTo(double dx1, double dy1, double dx2, + double dy2, double dx3, double dy3); + private native void cairoRectangle(double x, double y, double width, + double height); + private native void cairoClosePath(); + private native void cairoStroke(); + private native void cairoFill(); + private native void cairoClip(); ///////////////////////////////////////////// ////// General Drawing Support Methods ////// ///////////////////////////////////////////// - private class DrawState - { - private Paint paint; - private Stroke stroke; - private Color fg; - private Color bg; - private Shape clip; - private AffineTransform transform; - private Font font; - private Composite comp; - DrawState (GdkGraphics2D g) - { - this.paint = g.paint; - this.stroke = g.stroke; - this.fg = g.fg; - this.bg = g.bg; - this.clip = g.clip; - if (g.transform != null) - this.transform = (AffineTransform) g.transform.clone(); - this.font = g.font; - this.comp = g.comp; - } - public void restore(GdkGraphics2D g) - { - g.paint = this.paint; - g.stroke = this.stroke; - g.fg = this.fg; - g.bg = this.bg; - g.clip = this.clip; - g.transform = this.transform; - g.font = this.font; - g.comp = this.comp; - } - } - - private void stateSave () + private class DrawState + { + private Paint paint; + private Stroke stroke; + private Color fg; + private Color bg; + private Shape clip; + private AffineTransform transform; + private Font font; + private Composite comp; + + DrawState(GdkGraphics2D g) { - stateStack.push (new DrawState (this)); - cairoSave (); + this.paint = g.paint; + this.stroke = g.stroke; + this.fg = g.fg; + this.bg = g.bg; + this.clip = g.clip; + if (g.transform != null) + this.transform = (AffineTransform) g.transform.clone(); + this.font = g.font; + this.comp = g.comp; } - private void stateRestore () + public void restore(GdkGraphics2D g) { - ((DrawState)(stateStack.pop ())).restore (this); - cairoRestore (); + g.paint = this.paint; + g.stroke = this.stroke; + g.fg = this.fg; + g.bg = this.bg; + g.clip = this.clip; + g.transform = this.transform; + g.font = this.font; + g.comp = this.comp; } + } + + private void stateSave() + { + stateStack.push(new DrawState(this)); + cairoSave(); + } + + private void stateRestore() + { + ((DrawState) (stateStack.pop())).restore(this); + cairoRestore(); + } // Some operations (drawing rather than filling) require that their // coords be shifted to land on 0.5-pixel boundaries, in order to land on // "middle of pixel" coordinates and light up complete pixels. - private boolean shiftDrawCalls = false; + private final double shifted(double coord, boolean doShift) { if (doShift) @@ -372,406 +378,377 @@ public class GdkGraphics2D extends Graphics2D { double x = 0; double y = 0; - double coords[] = new double[6]; + double[] coords = new double[6]; - cairoSetFillRule (p.getWindingRule ()); - for ( ; ! p.isDone (); p.next()) + cairoSetFillRule(p.getWindingRule()); + for (; ! p.isDone(); p.next()) { - int seg = p.currentSegment (coords); - switch(seg) - { - - case PathIterator.SEG_MOVETO: - x = shifted(coords[0], doShift); - y = shifted(coords[1], doShift); - cairoMoveTo (x, y); - break; - - case PathIterator.SEG_LINETO: - x = shifted(coords[0], doShift); - y = shifted(coords[1], doShift); - cairoLineTo (x, y); - break; - - case PathIterator.SEG_QUADTO: - - // splitting a quadratic bezier into a cubic: - // see: http://pfaedit.sourceforge.net/bezier.html - - double x1 = x + (2.0/3.0) * (shifted(coords[0], doShift) - x); - double y1 = y + (2.0/3.0) * (shifted(coords[1], doShift) - y); - - double x2 = x1 + (1.0/3.0) * (shifted(coords[2], doShift) - x); - double y2 = y1 + (1.0/3.0) * (shifted(coords[3], doShift) - y); - - x = shifted(coords[2], doShift); - y = shifted(coords[3], doShift); - cairoCurveTo (x1, y1, - x2, y2, - x, y); - break; - - case PathIterator.SEG_CUBICTO: - x = shifted(coords[4], doShift); - y = shifted(coords[5], doShift); - cairoCurveTo (shifted(coords[0], doShift), shifted(coords[1], doShift), - shifted(coords[2], doShift), shifted(coords[3], doShift), - x, y); - break; - - case PathIterator.SEG_CLOSE: - cairoClosePath (); - break; - } - } + int seg = p.currentSegment(coords); + switch (seg) + { + case PathIterator.SEG_MOVETO: + x = shifted(coords[0], doShift); + y = shifted(coords[1], doShift); + cairoMoveTo(x, y); + break; + case PathIterator.SEG_LINETO: + x = shifted(coords[0], doShift); + y = shifted(coords[1], doShift); + cairoLineTo(x, y); + break; + case PathIterator.SEG_QUADTO: + // splitting a quadratic bezier into a cubic: + // see: http://pfaedit.sourceforge.net/bezier.html + double x1 = x + (2.0 / 3.0) * (shifted(coords[0], doShift) - x); + double y1 = y + (2.0 / 3.0) * (shifted(coords[1], doShift) - y); + + double x2 = x1 + (1.0 / 3.0) * (shifted(coords[2], doShift) - x); + double y2 = y1 + (1.0 / 3.0) * (shifted(coords[3], doShift) - y); + + x = shifted(coords[2], doShift); + y = shifted(coords[3], doShift); + cairoCurveTo(x1, y1, x2, y2, x, y); + break; + case PathIterator.SEG_CUBICTO: + x = shifted(coords[4], doShift); + y = shifted(coords[5], doShift); + cairoCurveTo(shifted(coords[0], doShift), + shifted(coords[1], doShift), + shifted(coords[2], doShift), + shifted(coords[3], doShift), x, y); + break; + case PathIterator.SEG_CLOSE: + cairoClosePath(); + break; + } + } } - private final Map getDefaultHints() { - HashMap defaultHints = new HashMap (); - - defaultHints.put (RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); - - defaultHints.put (RenderingHints.KEY_STROKE_CONTROL, - RenderingHints.VALUE_STROKE_DEFAULT); - - defaultHints.put (RenderingHints.KEY_FRACTIONALMETRICS, - RenderingHints.VALUE_FRACTIONALMETRICS_OFF); - - defaultHints.put (RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_OFF); - - defaultHints.put (RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_DEFAULT); - + HashMap defaultHints = new HashMap(); + + defaultHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); + + defaultHints.put(RenderingHints.KEY_STROKE_CONTROL, + RenderingHints.VALUE_STROKE_DEFAULT); + + defaultHints.put(RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_OFF); + + defaultHints.put(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF); + + defaultHints.put(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_DEFAULT); + return defaultHints; - } - private final void updateBufferedImage() + public static final int[] findSimpleIntegerArray (ColorModel cm, Raster raster) { - int[] pixels = getImagePixels(); - updateImagePixels(pixels); - } + if (cm == null || raster == null) + return null; - - private final boolean isBufferedImageGraphics () - { - return bimage != null; - } - - private final void updateImagePixels (int[] pixels) - { + if (! cm.getColorSpace().isCS_sRGB()) + return null; - // This function can only be used if - // this graphics object is used to draw into - // buffered image - - if (! isBufferedImageGraphics ()) - return; + if (! (cm instanceof DirectColorModel)) + return null; - WritableRaster raster = bimage.getRaster(); - DataBuffer db = raster.getDataBuffer (); + DirectColorModel dcm = (DirectColorModel) cm; - // update pixels in the bufferedImage + if (dcm.getRedMask() != 0x00FF0000 || dcm.getGreenMask() != 0x0000FF00 + || dcm.getBlueMask() != 0x000000FF) + return null; - if (raster.getSampleModel ().getDataType () == DataBuffer.TYPE_INT - && db instanceof DataBufferInt - && db.getNumBanks () == 1) - { + if (! (raster instanceof WritableRaster)) + return null; - // single bank, ARGB-ints buffer in sRGB space - DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer (); + if (raster.getSampleModel().getDataType() != DataBuffer.TYPE_INT) + return null; - for (int i=0; i < pixels.length; i++) - dbi.setElem(i, pixels[i]); - - } - else - { - bimage.getRaster().setPixels (0, 0, raster.getWidth (), - raster.getHeight (), pixels); - } - } + if (! (raster.getDataBuffer() instanceof DataBufferInt)) + return null; + DataBufferInt db = (DataBufferInt) raster.getDataBuffer(); - private final boolean drawImage(Image img, - AffineTransform xform, - Color bgcolor, - ImageObserver obs) + if (db.getNumBanks() != 1) + return null; + + // Finally, we have determined that this is a single bank, [A]RGB-int + // buffer in sRGB space. It's worth checking all this, because it means + // that cairo can paint directly into the data buffer, which is very + // fast compared to all the normal copying and converting. + + return db.getData(); + } + + private final void updateBufferedImage() { + if (bimage != null && pixelConversionRequired) + { + int height = bimage.getHeight(); + int width = bimage.getWidth(); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + bimage.setRGB(x, y, pixelBuffer[y*width+height]); + } + } + private final boolean drawImage(Image img, AffineTransform xform, + Color bgcolor, ImageObserver obs) + { if (img == null) return false; - if (img instanceof GtkOffScreenImage && - img.getGraphics () instanceof GdkGraphics2D && - (xform == null - || xform.getType () == AffineTransform.TYPE_IDENTITY - || xform.getType () == AffineTransform.TYPE_TRANSLATION) - ) + if (img instanceof GtkOffScreenImage + && img.getGraphics() instanceof GdkGraphics2D + && (xform == null || xform.getType() == AffineTransform.TYPE_IDENTITY + || xform.getType() == AffineTransform.TYPE_TRANSLATION)) { - // we are being asked to flush a double buffer from Gdk - GdkGraphics2D g2 = (GdkGraphics2D) img.getGraphics (); - gdkDrawDrawable (g2, (int)xform.getTranslateX(), (int)xform.getTranslateY()); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); - - return true; + // we are being asked to flush a double buffer from Gdk + GdkGraphics2D g2 = (GdkGraphics2D) img.getGraphics(); + gdkDrawDrawable(g2, (int) xform.getTranslateX(), + (int) xform.getTranslateY()); + + updateBufferedImage(); + + return true; } else - { - - // In this case, xform is an AffineTransform that transforms bounding - // box of the specified image from image space to user space. However - // when we pass this transform to cairo, cairo will use this transform - // to map "user coordinates" to "pixel" coordinates, which is the - // other way around. Therefore to get the "user -> pixel" transform - // that cairo wants from "image -> user" transform that we currently - // have, we will need to invert the transformation matrix. - - AffineTransform invertedXform = new AffineTransform(); - - try - { - invertedXform = xform.createInverse(); - if (img instanceof BufferedImage) - { - // draw an image which has actually been loaded - // into memory fully - - BufferedImage b = (BufferedImage) img; - return drawRaster (b.getColorModel (), - b.getData (), - invertedXform, - bgcolor); - } - else - { - return this.drawImage(GdkPixbufDecoder.createBufferedImage(img.getSource()), - xform, bgcolor,obs); - } - } - catch (NoninvertibleTransformException e) - { - throw new ImagingOpException("Unable to invert transform " - + xform.toString()); - } + { + // In this case, xform is an AffineTransform that transforms bounding + // box of the specified image from image space to user space. However + // when we pass this transform to cairo, cairo will use this transform + // to map "user coordinates" to "pixel" coordinates, which is the + // other way around. Therefore to get the "user -> pixel" transform + // that cairo wants from "image -> user" transform that we currently + // have, we will need to invert the transformation matrix. + AffineTransform invertedXform = new AffineTransform(); + + try + { + invertedXform = xform.createInverse(); + if (img instanceof BufferedImage) + { + // draw an image which has actually been loaded + // into memory fully + BufferedImage b = (BufferedImage) img; + return drawRaster(b.getColorModel(), b.getData(), + invertedXform, bgcolor); + } + else + return this.drawImage(GdkPixbufDecoder.createBufferedImage(img + .getSource()), + xform, bgcolor, obs); + } + catch (NoninvertibleTransformException e) + { + throw new ImagingOpException("Unable to invert transform " + + xform.toString()); + } } } - ////////////////////////////////////////////////// ////// Implementation of Graphics2D Methods ////// ////////////////////////////////////////////////// - public void draw (Shape s) + public void draw(Shape s) { - - if (stroke != null && - !(stroke instanceof BasicStroke)) + if (stroke != null && ! (stroke instanceof BasicStroke)) { - fill (stroke.createStrokedShape (s)); - return; + fill(stroke.createStrokedShape(s)); + return; } - cairoNewPath (); - + cairoNewPath(); + if (s instanceof Rectangle2D) { - Rectangle2D r = (Rectangle2D)s; - cairoRectangle (shifted(r.getX (), shiftDrawCalls), - shifted(r.getY (), shiftDrawCalls), - r.getWidth (), r.getHeight ()); + Rectangle2D r = (Rectangle2D) s; + cairoRectangle(shifted(r.getX(), shiftDrawCalls), + shifted(r.getY(), shiftDrawCalls), r.getWidth(), + r.getHeight()); } - else - walkPath (s.getPathIterator (null), shiftDrawCalls); - cairoStroke (); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); + else + walkPath(s.getPathIterator(null), shiftDrawCalls); + cairoStroke(); + + updateBufferedImage(); } - public void fill (Shape s) + public void fill(Shape s) { - cairoNewPath (); + cairoNewPath(); if (s instanceof Rectangle2D) { - Rectangle2D r = (Rectangle2D)s; - cairoRectangle (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + Rectangle2D r = (Rectangle2D) s; + cairoRectangle(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } - else - walkPath (s.getPathIterator (null), false); - cairoFill (); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); + else + walkPath(s.getPathIterator(null), false); + + cairoFill(); + updateBufferedImage(); } - public void clip (Shape s) + public void clip(Shape s) { - // update it + // update it + if (clip == null || s == null) + clip = s; + else if (s instanceof Rectangle2D && clip instanceof Rectangle2D) + { + Rectangle2D r = (Rectangle2D) s; + Rectangle2D curr = (Rectangle2D) clip; + clip = curr.createIntersection(r); + } + else + throw new UnsupportedOperationException(); - if (clip == null || s == null) - clip = s; - else if (s instanceof Rectangle2D - && clip instanceof Rectangle2D) + // draw it + if (clip != null) + { + cairoNewPath(); + if (clip instanceof Rectangle2D) { - Rectangle2D r = (Rectangle2D)s; - Rectangle2D curr = (Rectangle2D)clip; - clip = curr.createIntersection (r); + Rectangle2D r = (Rectangle2D) clip; + cairoRectangle(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } - else - throw new UnsupportedOperationException (); + else + walkPath(clip.getPathIterator(null), false); - // draw it - if (clip != null) - { - cairoNewPath (); - if (clip instanceof Rectangle2D) - { - Rectangle2D r = (Rectangle2D)clip; - cairoRectangle (r.getX (), r.getY (), - r.getWidth (), r.getHeight ()); - } - else - walkPath (clip.getPathIterator (null), false); - // cairoClosePath (); - cairoClip (); - } + // cairoClosePath (); + cairoClip(); + } } - public Paint getPaint () + public Paint getPaint() { return paint; } - public AffineTransform getTransform () + public AffineTransform getTransform() { - return (AffineTransform) transform.clone (); + return (AffineTransform) transform.clone(); } - public void setPaint (Paint p) + public void setPaint(Paint p) { if (paint == null) - return; - + return; + paint = p; if (paint instanceof Color) { - setColor ((Color) paint); + setColor((Color) paint); } else if (paint instanceof TexturePaint) { - TexturePaint tp = (TexturePaint) paint; - BufferedImage img = tp.getImage (); - - // map the image to the anchor rectangle + TexturePaint tp = (TexturePaint) paint; + BufferedImage img = tp.getImage(); - int width = (int) tp.getAnchorRect ().getWidth (); - int height = (int) tp.getAnchorRect ().getHeight (); - - double scaleX = width / (double) img.getWidth (); - double scaleY = width / (double) img.getHeight (); - - AffineTransform at = new AffineTransform (scaleX, 0, 0, scaleY, 0, 0); - AffineTransformOp op = new AffineTransformOp (at, getRenderingHints()); - BufferedImage texture = op.filter(img, null); - int pixels[] = texture.getRGB (0, 0, width, height, null, 0, width); - setTexturePixels (pixels, width, height, width); + // map the image to the anchor rectangle + int width = (int) tp.getAnchorRect().getWidth(); + int height = (int) tp.getAnchorRect().getHeight(); + + double scaleX = width / (double) img.getWidth(); + double scaleY = width / (double) img.getHeight(); + AffineTransform at = new AffineTransform(scaleX, 0, 0, scaleY, 0, 0); + AffineTransformOp op = new AffineTransformOp(at, getRenderingHints()); + BufferedImage texture = op.filter(img, null); + int[] pixels = texture.getRGB(0, 0, width, height, null, 0, width); + setTexturePixels(pixels, width, height, width); } else if (paint instanceof GradientPaint) { - GradientPaint gp = (GradientPaint) paint; - Point2D p1 = gp.getPoint1 (); - Point2D p2 = gp.getPoint2 (); - Color c1 = gp.getColor1 (); - Color c2 = gp.getColor2 (); - setGradient (p1.getX (), p1.getY (), - p2.getX (), p2.getY (), - c1.getRed (), c1.getGreen (), - c1.getBlue (), c1.getAlpha (), - c2.getRed (), c2.getGreen (), - c2.getBlue (), c2.getAlpha (), - gp.isCyclic ()); + GradientPaint gp = (GradientPaint) paint; + Point2D p1 = gp.getPoint1(); + Point2D p2 = gp.getPoint2(); + Color c1 = gp.getColor1(); + Color c2 = gp.getColor2(); + setGradient(p1.getX(), p1.getY(), p2.getX(), p2.getY(), c1.getRed(), + c1.getGreen(), c1.getBlue(), c1.getAlpha(), c2.getRed(), + c2.getGreen(), c2.getBlue(), c2.getAlpha(), gp.isCyclic()); } else - throw new java.lang.UnsupportedOperationException (); + throw new java.lang.UnsupportedOperationException(); } - public void setTransform (AffineTransform tx) + public void setTransform(AffineTransform tx) { transform = tx; if (transform != null) { - double m[] = new double[6]; - transform.getMatrix (m); - cairoSetMatrix (m); + double[] m = new double[6]; + transform.getMatrix(m); + cairoSetMatrix(m); } } - public void transform (AffineTransform tx) + public void transform(AffineTransform tx) { if (transform == null) - transform = new AffineTransform (tx); + transform = new AffineTransform(tx); else - transform.concatenate (tx); - setTransform (transform); + transform.concatenate(tx); + setTransform(transform); if (clip != null) { - // FIXME: this should actuall try to transform the shape - // rather than degrade to bounds. - Rectangle2D r = clip.getBounds2D(); - double[] coords = new double[] { r.getX(), r.getY(), - r.getX() + r.getWidth(), - r.getY() + r.getHeight() }; - try - { - tx.createInverse().transform(coords, 0, coords, 0, 2); - r.setRect(coords[0], coords[1], - coords[2] - coords[0], - coords[3] - coords[1]); - clip = r; - } - catch (java.awt.geom.NoninvertibleTransformException e) - { - } + // FIXME: this should actuall try to transform the shape + // rather than degrade to bounds. + Rectangle2D r = clip.getBounds2D(); + double[] coords = new double[] + { + r.getX(), r.getY(), r.getX() + r.getWidth(), + r.getY() + r.getHeight() + }; + try + { + tx.createInverse().transform(coords, 0, coords, 0, 2); + r.setRect(coords[0], coords[1], coords[2] - coords[0], + coords[3] - coords[1]); + clip = r; + } + catch (java.awt.geom.NoninvertibleTransformException e) + { + } } } public void rotate(double theta) { - transform (AffineTransform.getRotateInstance (theta)); + transform(AffineTransform.getRotateInstance(theta)); } public void rotate(double theta, double x, double y) { - transform (AffineTransform.getRotateInstance (theta, x, y)); + transform(AffineTransform.getRotateInstance(theta, x, y)); } public void scale(double sx, double sy) { - transform (AffineTransform.getScaleInstance (sx, sy)); + transform(AffineTransform.getScaleInstance(sx, sy)); } - public void translate (double tx, double ty) + public void translate(double tx, double ty) { - transform (AffineTransform.getTranslateInstance (tx, ty)); + transform(AffineTransform.getTranslateInstance(tx, ty)); } - public void translate (int x, int y) + public void translate(int x, int y) { - translate ((double) x, (double) y); + translate((double) x, (double) y); } public void shear(double shearX, double shearY) { - transform (AffineTransform.getShearInstance (shearX, shearY)); + transform(AffineTransform.getShearInstance(shearX, shearY)); } public Stroke getStroke() @@ -779,173 +756,165 @@ public class GdkGraphics2D extends Graphics2D return stroke; } - public void setStroke (Stroke st) + public void setStroke(Stroke st) { stroke = st; if (stroke instanceof BasicStroke) { - BasicStroke bs = (BasicStroke) stroke; - cairoSetLineCap (bs.getEndCap()); - cairoSetLineWidth (bs.getLineWidth()); - cairoSetLineJoin (bs.getLineJoin()); - cairoSetMiterLimit (bs.getMiterLimit()); - float dashes[] = bs.getDashArray(); - if (dashes != null) - { - double double_dashes[] = new double[dashes.length]; - for (int i = 0; i < dashes.length; i++) - double_dashes[i] = dashes[i]; - cairoSetDash (double_dashes, double_dashes.length, - (double) bs.getDashPhase ()); - } + BasicStroke bs = (BasicStroke) stroke; + cairoSetLineCap(bs.getEndCap()); + cairoSetLineWidth(bs.getLineWidth()); + cairoSetLineJoin(bs.getLineJoin()); + cairoSetMiterLimit(bs.getMiterLimit()); + float[] dashes = bs.getDashArray(); + if (dashes != null) + { + double[] double_dashes = new double[dashes.length]; + for (int i = 0; i < dashes.length; i++) + double_dashes[i] = dashes[i]; + cairoSetDash(double_dashes, double_dashes.length, + (double) bs.getDashPhase()); + } } } - //////////////////////////////////////////////// ////// Implementation of Graphics Methods ////// //////////////////////////////////////////////// - public void setPaintMode () - { - setComposite (java.awt.AlphaComposite.SrcOver); + public void setPaintMode() + { + setComposite(java.awt.AlphaComposite.SrcOver); } - public void setXORMode (Color c) - { - setComposite (new gnu.java.awt.BitwiseXORComposite(c)); + public void setXORMode(Color c) + { + setComposite(new gnu.java.awt.BitwiseXORComposite(c)); } - public void setColor (Color c) + public void setColor(Color c) { if (c == null) c = Color.BLACK; - + fg = c; paint = c; - cairoSetRGBColor (fg.getRed() / 255.0, - fg.getGreen() / 255.0, - fg.getBlue() / 255.0); - cairoSetAlpha ((fg.getAlpha() & 255) / 255.0); + cairoSetRGBColor(fg.getRed() / 255.0, fg.getGreen() / 255.0, + fg.getBlue() / 255.0); + cairoSetAlpha((fg.getAlpha() & 255) / 255.0); } - public Color getColor () + public Color getColor() { return fg; } - public void clipRect (int x, int y, int width, int height) + public void clipRect(int x, int y, int width, int height) { - clip (new Rectangle (x, y, width, height)); + clip(new Rectangle(x, y, width, height)); } - public Shape getClip () + public Shape getClip() { - return getClipInDevSpace (); + return clip.getBounds2D(); //getClipInDevSpace(); } - public Rectangle getClipBounds () + public Rectangle getClipBounds() { if (clip == null) return null; else - return clip.getBounds (); + return clip.getBounds(); } - protected Rectangle2D getClipInDevSpace () + protected Rectangle2D getClipInDevSpace() { - Rectangle2D uclip = clip.getBounds2D (); + Rectangle2D uclip = clip.getBounds2D(); if (transform == null) return uclip; else { - Point2D pos = transform.transform (new Point2D.Double(uclip.getX (), - uclip.getY ()), - (Point2D)null); - Point2D extent = transform.deltaTransform (new Point2D.Double(uclip.getWidth (), - uclip.getHeight ()), - (Point2D)null); - return new Rectangle2D.Double (pos.getX (), pos.getY (), - extent.getX (), extent.getY ()); + Point2D pos = transform.transform(new Point2D.Double(uclip.getX(), + uclip.getY()), + (Point2D) null); + Point2D extent = transform.deltaTransform(new Point2D.Double(uclip + .getWidth(), + uclip + .getHeight()), + (Point2D) null); + return new Rectangle2D.Double(pos.getX(), pos.getY(), extent.getX(), + extent.getY()); } } - public void setClip (int x, int y, int width, int height) + public void setClip(int x, int y, int width, int height) { - setClip(new Rectangle2D.Double ((double)x, (double)y, - (double)width, (double)height)); + setClip(new Rectangle2D.Double((double) x, (double) y, (double) width, + (double) height)); } - - public void setClip (Shape s) + + public void setClip(Shape s) { clip = s; if (s != null) { - cairoNewPath (); - if (s instanceof Rectangle2D) - { - Rectangle2D r = (Rectangle2D)s; - cairoRectangle (r.getX (), r.getY (), - r.getWidth (), r.getHeight ()); - } - else - walkPath (s.getPathIterator (null), false); - // cairoClosePath (); - cairoClip (); + cairoNewPath(); + if (s instanceof Rectangle2D) + { + Rectangle2D r = (Rectangle2D) s; + cairoRectangle(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + else + walkPath(s.getPathIterator(null), false); + + // cairoClosePath (); + cairoClip(); } } - + private static BasicStroke draw3DRectStroke = new BasicStroke(); - public void draw3DRect(int x, int y, int width, - int height, boolean raised) + public void draw3DRect(int x, int y, int width, int height, boolean raised) { Stroke tmp = stroke; setStroke(draw3DRectStroke); super.draw3DRect(x, y, width, height, raised); - setStroke(tmp); - if (isBufferedImageGraphics ()) - updateBufferedImage(); + setStroke(tmp); + updateBufferedImage(); } - public void fill3DRect(int x, int y, int width, - int height, boolean raised) + public void fill3DRect(int x, int y, int width, int height, boolean raised) { Stroke tmp = stroke; setStroke(draw3DRectStroke); super.fill3DRect(x, y, width, height, raised); - setStroke(tmp); - if (isBufferedImageGraphics ()) - updateBufferedImage(); + setStroke(tmp); + updateBufferedImage(); } - - public void drawRect (int x, int y, int width, int height) + public void drawRect(int x, int y, int width, int height) { - draw(new Rectangle (x, y, width, height)); + draw(new Rectangle(x, y, width, height)); } - public void fillRect (int x, int y, int width, int height) + public void fillRect(int x, int y, int width, int height) { - cairoNewPath (); - cairoRectangle (x, y, width, height); - cairoFill (); + cairoNewPath(); + cairoRectangle(x, y, width, height); + cairoFill(); } - public void clearRect (int x, int y, int width, int height) + public void clearRect(int x, int y, int width, int height) { - cairoSetRGBColor (bg.getRed() / 255.0, - bg.getGreen() / 255.0, - bg.getBlue() / 255.0); - cairoSetAlpha (1.0); - cairoNewPath (); - cairoRectangle (x, y, width, height); - cairoFill (); - setColor (fg); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); + cairoSetRGBColor(bg.getRed() / 255.0, bg.getGreen() / 255.0, + bg.getBlue() / 255.0); + cairoSetAlpha(1.0); + cairoNewPath(); + cairoRectangle(x, y, width, height); + cairoFill(); + setColor(fg); + updateBufferedImage(); } public void setBackground(Color c) @@ -958,181 +927,172 @@ public class GdkGraphics2D extends Graphics2D return bg; } - private final void doPolygon(int[] xPoints, int[] yPoints, int nPoints, + private final void doPolygon(int[] xPoints, int[] yPoints, int nPoints, boolean close, boolean fill) - { + { if (nPoints < 1) return; - GeneralPath gp = new GeneralPath (PathIterator.WIND_EVEN_ODD); - gp.moveTo ((float)xPoints[0], (float)yPoints[0]); + GeneralPath gp = new GeneralPath(PathIterator.WIND_EVEN_ODD); + gp.moveTo((float) xPoints[0], (float) yPoints[0]); for (int i = 1; i < nPoints; i++) - gp.lineTo ((float)xPoints[i], (float)yPoints[i]); - + gp.lineTo((float) xPoints[i], (float) yPoints[i]); + if (close) - gp.closePath (); + gp.closePath(); Shape sh = gp; - if (fill == false && - stroke != null && - !(stroke instanceof BasicStroke)) + if (fill == false && stroke != null && ! (stroke instanceof BasicStroke)) { - sh = stroke.createStrokedShape (gp); - fill = true; + sh = stroke.createStrokedShape(gp); + fill = true; } - - if (fill) - fill (sh); - else - draw (sh); + + if (fill) + fill(sh); + else + draw(sh); } - public void drawLine (int x1, int y1, int x2, int y2) + public void drawLine(int x1, int y1, int x2, int y2) { - int xp[] = new int[2]; - int yp[] = new int[2]; + int[] xp = new int[2]; + int[] yp = new int[2]; xp[0] = x1; xp[1] = x2; yp[0] = y1; yp[1] = y2; - - doPolygon (xp, yp, 2, false, false); + + doPolygon(xp, yp, 2, false, false); } public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) { - doPolygon (xPoints, yPoints, nPoints, true, true); + doPolygon(xPoints, yPoints, nPoints, true, true); } - + public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) - { - doPolygon (xPoints, yPoints, nPoints, true, false); + { + doPolygon(xPoints, yPoints, nPoints, true, false); } public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) { - doPolygon (xPoints, yPoints, nPoints, false, false); + doPolygon(xPoints, yPoints, nPoints, false, false); } - private final boolean drawRaster (ColorModel cm, Raster r, - AffineTransform imageToUser, - Color bgcolor) + private final boolean drawRaster(ColorModel cm, Raster r, + AffineTransform imageToUser, Color bgcolor) { if (r == null) return false; - SampleModel sm = r.getSampleModel (); - DataBuffer db = r.getDataBuffer (); + SampleModel sm = r.getSampleModel(); + DataBuffer db = r.getDataBuffer(); if (db == null || sm == null) return false; if (cm == null) - cm = ColorModel.getRGBdefault (); + cm = ColorModel.getRGBdefault(); double[] i2u = new double[6]; if (imageToUser != null) imageToUser.getMatrix(i2u); else { - i2u[0] = 1; i2u[1] = 0; - i2u[2] = 0; i2u[3] = 1; - i2u[4] = 0; i2u[5] = 0; + i2u[0] = 1; + i2u[1] = 0; + i2u[2] = 0; + i2u[3] = 1; + i2u[4] = 0; + i2u[5] = 0; } - int pixels[] = null; + int[] pixels = findSimpleIntegerArray(cm, r); - if (sm.getDataType () == DataBuffer.TYPE_INT && - db instanceof DataBufferInt && - db.getNumBanks () == 1) + if (pixels == null) { - // single bank, ARGB-ints buffer in sRGB space - DataBufferInt dbi = (DataBufferInt)db; - pixels = dbi.getData (); + // FIXME: I don't think this code will work correctly with a non-RGB + // MultiPixelPackedSampleModel. Although this entire method should + // probably be rewritten to better utilize Cairo's different supported + // data formats. + if (sm instanceof MultiPixelPackedSampleModel) + { + pixels = r.getPixels(0, 0, r.getWidth(), r.getHeight(), pixels); + for (int i = 0; i < pixels.length; i++) + pixels[i] = cm.getRGB(pixels[i]); + } + else + { + pixels = new int[r.getWidth() * r.getHeight()]; + for (int i = 0; i < pixels.length; i++) + pixels[i] = cm.getRGB(db.getElem(i)); + } } - else - pixels = r.getPixels (0, 0, r.getWidth (), r.getHeight (), pixels); - - ColorSpace cs = cm.getColorSpace (); - if (cs != null && - cs.getType () != ColorSpace.CS_sRGB) + + // Change all transparent pixels in the image to the specified bgcolor, + // or (if there's no alpha) fill in an alpha channel so that it paints + // correctly. + if (cm.hasAlpha()) { - int pixels2[] = new int[pixels.length]; - for (int i = 0; i < pixels2.length; i++) - pixels2[i] = cm.getRGB (pixels[i]); - pixels = pixels2; + if (bgcolor != null && cm.hasAlpha()) + for (int i = 0; i < pixels.length; i++) + { + if (cm.getAlpha(pixels[i]) == 0) + pixels[i] = bgcolor.getRGB(); + } } - - // change all transparent pixels in the image to the - // specified bgcolor - - if (bgcolor != null) - { - for (int i = 0; i < pixels.length; i++) - { - if (cm.getAlpha (pixels[i]) == 0) - pixels[i] = bgcolor.getRGB (); - } - } - - drawPixels (pixels, r.getWidth (), r.getHeight (), r.getWidth (), i2u); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); + else + for (int i = 0; i < pixels.length; i++) + pixels[i] |= 0xFF000000; + + drawPixels(pixels, r.getWidth(), r.getHeight(), r.getWidth(), i2u); + + updateBufferedImage(); return true; } - public void drawRenderedImage(RenderedImage image, - AffineTransform xform) + public void drawRenderedImage(RenderedImage image, AffineTransform xform) { - drawRaster (image.getColorModel(), image.getData(), xform, bg); + drawRaster(image.getColorModel(), image.getData(), xform, bg); } - - public void drawRenderableImage(RenderableImage image, - AffineTransform xform) + + public void drawRenderableImage(RenderableImage image, AffineTransform xform) { - drawRenderedImage (image.createRendering (new RenderContext (xform)), xform); + drawRenderedImage(image.createRendering(new RenderContext(xform)), xform); } - - public boolean drawImage(Image img, - AffineTransform xform, - ImageObserver obs) + + public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { - return drawImage(img, xform, bg, obs); + return drawImage(img, xform, bg, obs); } - public void drawImage(BufferedImage image, - BufferedImageOp op, - int x, - int y) + public void drawImage(BufferedImage image, BufferedImageOp op, int x, int y) { Image filtered = op.filter(image, null); - drawImage(filtered, new AffineTransform(1f,0f,0f,1f,x,y), bg, null); + drawImage(filtered, new AffineTransform(1f, 0f, 0f, 1f, x, y), bg, null); } - public boolean drawImage (Image img, int x, int y, - ImageObserver observer) + public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - return drawImage(img, new AffineTransform(1f,0f,0f,1f,x,y), bg, observer); + return drawImage(img, new AffineTransform(1f, 0f, 0f, 1f, x, y), bg, + observer); } - /////////////////////////////////////////////// ////// Unimplemented Stubs and Overloads ////// /////////////////////////////////////////////// - - - public boolean hit(Rectangle rect, Shape text, - boolean onStroke) + public boolean hit(Rectangle rect, Shape text, boolean onStroke) { - throw new java.lang.UnsupportedOperationException (); + throw new java.lang.UnsupportedOperationException(); } public GraphicsConfiguration getDeviceConfiguration() { - throw new java.lang.UnsupportedOperationException (); + throw new java.lang.UnsupportedOperationException(); } public void setComposite(Composite comp) @@ -1141,87 +1101,81 @@ public class GdkGraphics2D extends Graphics2D if (comp instanceof AlphaComposite) { - AlphaComposite a = (AlphaComposite) comp; - cairoSetOperator(a.getRule()); - Color c = getColor(); - setColor(new Color(c.getRed(), - c.getGreen(), - c.getBlue(), - (int) (a.getAlpha() * ((float) c.getAlpha())))); + AlphaComposite a = (AlphaComposite) comp; + cairoSetOperator(a.getRule()); + Color c = getColor(); + setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), + (int) (a.getAlpha() * ((float) c.getAlpha())))); } else - throw new java.lang.UnsupportedOperationException (); + throw new java.lang.UnsupportedOperationException(); } - public void setRenderingHint(RenderingHints.Key hintKey, - Object hintValue) + public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) { - hints.put (hintKey, hintValue); - + hints.put(hintKey, hintValue); + if (hintKey.equals(RenderingHints.KEY_INTERPOLATION) - || hintKey.equals(RenderingHints.KEY_ALPHA_INTERPOLATION)) + || hintKey.equals(RenderingHints.KEY_ALPHA_INTERPOLATION)) { - - if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) - cairoSurfaceSetFilter(0); - - else if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) - cairoSurfaceSetFilter(1); - - else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) - cairoSurfaceSetFilter(2); - - else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) - cairoSurfaceSetFilter(3); - - else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) - cairoSurfaceSetFilter(4); - + if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) + cairoSurfaceSetFilter(0); + + else if (hintValue.equals(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) + cairoSurfaceSetFilter(1); + + else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) + cairoSurfaceSetFilter(2); + + else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) + cairoSurfaceSetFilter(3); + + else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) + cairoSurfaceSetFilter(4); } - shiftDrawCalls = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) - || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); - + shiftDrawCalls = hints.containsValue(RenderingHints.VALUE_STROKE_NORMALIZE) + || hints.containsValue(RenderingHints.VALUE_STROKE_DEFAULT); } public Object getRenderingHint(RenderingHints.Key hintKey) { - return hints.get (hintKey); + return hints.get(hintKey); } - + public void setRenderingHints(Map hints) { - this.hints = new RenderingHints (getDefaultHints ()); - this.hints.add (new RenderingHints (hints)); - - if (hints.containsKey(RenderingHints.KEY_INTERPOLATION)) + this.hints = new RenderingHints(getDefaultHints()); + this.hints.add(new RenderingHints(hints)); + + if (hints.containsKey(RenderingHints.KEY_INTERPOLATION)) + { + if (hints.containsValue(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) + cairoSurfaceSetFilter(0); + + else if (hints.containsValue(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) + cairoSurfaceSetFilter(1); + } + + if (hints.containsKey(RenderingHints.KEY_ALPHA_INTERPOLATION)) { - if(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) - cairoSurfaceSetFilter(0); - - else if(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) - cairoSurfaceSetFilter(1); + if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) + cairoSurfaceSetFilter(2); + + else if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) + cairoSurfaceSetFilter(3); + + else if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) + cairoSurfaceSetFilter(4); } - - if (hints.containsKey(RenderingHints.KEY_ALPHA_INTERPOLATION)) - { - if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) - cairoSurfaceSetFilter(2); - - else if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) - cairoSurfaceSetFilter(3); - - else if(hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) - cairoSurfaceSetFilter(4); - } - - shiftDrawCalls = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) - || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); + + shiftDrawCalls = hints.containsValue(RenderingHints.VALUE_STROKE_NORMALIZE) + || hints.containsValue(RenderingHints.VALUE_STROKE_DEFAULT); } public void addRenderingHints(Map hints) { - this.hints.add (new RenderingHints (hints)); + this.hints.add(new RenderingHints(hints)); } public RenderingHints getRenderingHints() @@ -1237,70 +1191,62 @@ public class GdkGraphics2D extends Graphics2D return comp; } - public FontRenderContext getFontRenderContext () + public FontRenderContext getFontRenderContext() { - return new FontRenderContext (transform, true, true); + return new FontRenderContext(transform, true, true); } - public void copyArea (int x, int y, int width, int height, int dx, int dy) + public void copyArea(int x, int y, int width, int height, int dx, int dy) { - throw new java.lang.UnsupportedOperationException (); + throw new java.lang.UnsupportedOperationException(); } - public void drawArc (int x, int y, int width, int height, - int startAngle, int arcAngle) + public void drawArc(int x, int y, int width, int height, int startAngle, + int arcAngle) { - draw (new Arc2D.Double((double)x, (double)y, - (double)width, (double)height, - (double)startAngle, (double)arcAngle, - Arc2D.OPEN)); + draw(new Arc2D.Double((double) x, (double) y, (double) width, + (double) height, (double) startAngle, + (double) arcAngle, Arc2D.OPEN)); } - public boolean drawImage (Image img, int x, int y, Color bgcolor, - ImageObserver observer) + public boolean drawImage(Image img, int x, int y, Color bgcolor, + ImageObserver observer) { - return drawImage (img, x, y, img.getWidth (observer), - img.getHeight (observer), bgcolor, observer); + return drawImage(img, x, y, img.getWidth(observer), + img.getHeight(observer), bgcolor, observer); } - public boolean drawImage (Image img, int x, int y, int width, int height, - Color bgcolor, ImageObserver observer) + public boolean drawImage(Image img, int x, int y, int width, int height, + Color bgcolor, ImageObserver observer) { - - double scaleX = width / (double) img.getWidth (observer); - double scaleY = height / (double) img.getHeight (observer); - - return drawImage (img, - new AffineTransform(scaleX, 0f, 0f, scaleY, x, y), - bgcolor, - observer); + double scaleX = width / (double) img.getWidth(observer); + double scaleY = height / (double) img.getHeight(observer); + return drawImage(img, new AffineTransform(scaleX, 0f, 0f, scaleY, x, y), + bgcolor, observer); } - public boolean drawImage (Image img, int x, int y, int width, int height, - ImageObserver observer) + public boolean drawImage(Image img, int x, int y, int width, int height, + ImageObserver observer) { - - return drawImage (img, x, y, width, height, bg, observer); - + return drawImage(img, x, y, width, height, bg, observer); } - public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2, - int sx1, int sy1, int sx2, int sy2, - Color bgcolor, ImageObserver observer) + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, Color bgcolor, + ImageObserver observer) { - if (img == null) return false; - Image subImage; - + Image subImage; + int sourceWidth = sx2 - sx1; - int sourceHeight = sy2 - sy1; - + int sourceHeight = sy2 - sy1; + int destWidth = dx2 - dx1; int destHeight = dy2 - dy1; - + double scaleX = destWidth / (double) sourceWidth; double scaleY = destHeight / (double) sourceHeight; @@ -1309,48 +1255,42 @@ public class GdkGraphics2D extends Graphics2D if (img instanceof BufferedImage) { - - BufferedImage b = (BufferedImage) img; - subImage = b.getSubimage(sx1,sy1,sx2,sy2); - } - else + BufferedImage b = (BufferedImage) img; + subImage = b.getSubimage(sx1, sy1, sx2, sy2); + } + else { - - // FIXME: This code currently doesn't work. Null Pointer - // exception is thrown in this case. This happens - // because img.getSource() always returns null, since source gets - // never initialized when it is created with the help of - // createImage(int width, int height). - - CropImageFilter filter = new CropImageFilter(sx1,sx2,sx2,sy2); - FilteredImageSource src = new FilteredImageSource(img.getSource(), - filter); - - subImage = Toolkit.getDefaultToolkit().createImage(src); + // FIXME: This code currently doesn't work. Null Pointer + // exception is thrown in this case. This happens + // because img.getSource() always returns null, since source gets + // never initialized when it is created with the help of + // createImage(int width, int height). + CropImageFilter filter = new CropImageFilter(sx1, sx2, sx2, sy2); + FilteredImageSource src = new FilteredImageSource(img.getSource(), + filter); + + subImage = Toolkit.getDefaultToolkit().createImage(src); } - return drawImage(subImage, new AffineTransform(scaleX, 0, 0, - scaleY, dx1, dy1), - bgcolor, - observer); + return drawImage(subImage, + new AffineTransform(scaleX, 0, 0, scaleY, dx1, dy1), + bgcolor, observer); } - public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2, - int sx1, int sy1, int sx2, int sy2, - ImageObserver observer) + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, + ImageObserver observer) { - - return drawImage (img, dx1, dy1, dx2, dy2, - sx1, sy1, sx2, sy2, bg, observer); + return drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bg, observer); } public void drawOval(int x, int y, int width, int height) { - drawArc (x, y, width, height, 0, 360); + drawArc(x, y, width, height, 0, 360); } - public void drawRoundRect(int x, int y, int width, int height, - int arcWidth, int arcHeight) + public void drawRoundRect(int x, int y, int width, int height, int arcWidth, + int arcHeight) { if (arcWidth > width) arcWidth = width; @@ -1360,93 +1300,89 @@ public class GdkGraphics2D extends Graphics2D int xx = x + width - arcWidth; int yy = y + height - arcHeight; - drawArc (x, y, arcWidth, arcHeight, 90, 90); - drawArc (xx, y, arcWidth, arcHeight, 0, 90); - drawArc (xx, yy, arcWidth, arcHeight, 270, 90); - drawArc (x, yy, arcWidth, arcHeight, 180, 90); + drawArc(x, y, arcWidth, arcHeight, 90, 90); + drawArc(xx, y, arcWidth, arcHeight, 0, 90); + drawArc(xx, yy, arcWidth, arcHeight, 270, 90); + drawArc(x, yy, arcWidth, arcHeight, 180, 90); int y1 = y + arcHeight / 2; int y2 = y + height - arcHeight / 2; - drawLine (x, y1, x, y2); - drawLine (x + width, y1, x + width, y2); + drawLine(x, y1, x, y2); + drawLine(x + width, y1, x + width, y2); int x1 = x + arcWidth / 2; int x2 = x + width - arcWidth / 2; - drawLine (x1, y, x2, y); - drawLine (x1, y + height, x2, y + height); + drawLine(x1, y, x2, y); + drawLine(x1, y + height, x2, y + height); } // these are the most accelerated painting paths - native void cairoDrawGdkGlyphVector (GdkFontPeer f, GdkGlyphVector gv, float x, float y); - native void cairoDrawGdkTextLayout (GdkFontPeer f, GdkTextLayout gl, float x, float y); - native void cairoDrawString (GdkFontPeer f, String str, float x, float y); + native void cairoDrawGlyphVector(GdkFontPeer font, + float x, float y, int n, + int[] codes, float[] positions); - GdkFontPeer getFontPeer() - { - return (GdkFontPeer) getFont().getPeer(); - } + native void cairoDrawGdkTextLayout(GdkTextLayout gl, + float x, float y); - public void drawGdkGlyphVector(GdkGlyphVector gv, float x, float y) + GdkFontPeer getFontPeer() { - cairoDrawGdkGlyphVector(getFontPeer(), gv, x, y); - if (isBufferedImageGraphics ()) - updateBufferedImage(); + return (GdkFontPeer) getFont().getPeer(); } public void drawGdkTextLayout(GdkTextLayout gl, float x, float y) { - cairoDrawGdkTextLayout(getFontPeer(), gl, x, y); - if (isBufferedImageGraphics ()) - updateBufferedImage(); + cairoDrawGdkTextLayout (gl, x, y); + updateBufferedImage (); } - public void drawString (String str, float x, float y) + public void drawString(String str, float x, float y) { - cairoDrawString(getFontPeer(), str, x, y); - if (isBufferedImageGraphics ()) - updateBufferedImage(); + drawGlyphVector(getFont().createGlyphVector(null, str), x, y); + updateBufferedImage (); } - public void drawString (String str, int x, int y) + public void drawString(String str, int x, int y) { - drawString (str, (float)x, (float)y); + drawString (str, (float) x, (float) y); } - public void drawString (AttributedCharacterIterator ci, int x, int y) + public void drawString(AttributedCharacterIterator ci, int x, int y) { - drawString (ci, (float)x, (float)y); + drawString (ci, (float) x, (float) y); } - public void drawGlyphVector (GlyphVector gv, float x, float y) + public void drawGlyphVector(GlyphVector gv, float x, float y) { - if (gv instanceof GdkGlyphVector) - drawGdkGlyphVector((GdkGlyphVector)gv, x, y); - else - throw new java.lang.UnsupportedOperationException (); + int n = gv.getNumGlyphs (); + int[] codes = gv.getGlyphCodes (0, n, null); + float[] positions = gv.getGlyphPositions (0, n, null); + + setFont (gv.getFont ()); + cairoDrawGlyphVector (getFontPeer(), x, y, n, codes, positions); + updateBufferedImage (); } - public void drawString (AttributedCharacterIterator ci, float x, float y) + public void drawString(AttributedCharacterIterator ci, float x, float y) { - GlyphVector gv = font.createGlyphVector (getFontRenderContext(), ci); - drawGlyphVector (gv, x, y); + GlyphVector gv = getFont().createGlyphVector(getFontRenderContext(), ci); + drawGlyphVector(gv, x, y); } - public void fillArc (int x, int y, int width, int height, - int startAngle, int arcAngle) + public void fillArc(int x, int y, int width, int height, int startAngle, + int arcAngle) { - fill (new Arc2D.Double((double)x, (double)y, - (double)width, (double)height, - (double)startAngle, (double)arcAngle, - Arc2D.OPEN)); + fill(new Arc2D.Double((double) x, (double) y, (double) width, + (double) height, (double) startAngle, + (double) arcAngle, Arc2D.OPEN)); } public void fillOval(int x, int y, int width, int height) { - fillArc (x, y, width, height, 0, 360); + fillArc(x, y, width, height, 0, 360); } - public void fillRoundRect (int x, int y, int width, int height, - int arcWidth, int arcHeight) + public void fillRoundRect(int x, int y, int width, int height, int arcWidth, + int arcHeight) { if (arcWidth > width) arcWidth = width; @@ -1456,17 +1392,19 @@ public class GdkGraphics2D extends Graphics2D int xx = x + width - arcWidth; int yy = y + height - arcHeight; - fillArc (x, y, arcWidth, arcHeight, 90, 90); - fillArc (xx, y, arcWidth, arcHeight, 0, 90); - fillArc (xx, yy, arcWidth, arcHeight, 270, 90); - fillArc (x, yy, arcWidth, arcHeight, 180, 90); + fillArc(x, y, arcWidth, arcHeight, 90, 90); + fillArc(xx, y, arcWidth, arcHeight, 0, 90); + fillArc(xx, yy, arcWidth, arcHeight, 270, 90); + fillArc(x, yy, arcWidth, arcHeight, 180, 90); - fillRect (x, y + arcHeight / 2, width, height - arcHeight + 1); - fillRect (x + arcWidth / 2, y, width - arcWidth + 1, height); + fillRect(x, y + arcHeight / 2, width, height - arcHeight + 1); + fillRect(x + arcWidth / 2, y, width - arcWidth + 1, height); } - public Font getFont () + public Font getFont() { + if (font == null) + return new Font("SansSerif", Font.PLAIN, 12); return font; } @@ -1475,38 +1413,34 @@ public class GdkGraphics2D extends Graphics2D // GtkFontMetrics into the drawing kit and ask cairo ourselves. static native void releasePeerGraphicsResource(GdkFontPeer f); - static native void getPeerTextMetrics (GdkFontPeer f, String str, double [] metrics); - static native void getPeerFontMetrics (GdkFontPeer f, double [] metrics); - public FontMetrics getFontMetrics () + public FontMetrics getFontMetrics() { - // the reason we go via the toolkit here is to try to get - // a cached object. the toolkit keeps such a cache. - return Toolkit.getDefaultToolkit ().getFontMetrics (font); + return getFontMetrics(getFont()); } - public FontMetrics getFontMetrics (Font f) + public FontMetrics getFontMetrics(Font f) { // the reason we go via the toolkit here is to try to get // a cached object. the toolkit keeps such a cache. - return Toolkit.getDefaultToolkit ().getFontMetrics (f); + return Toolkit.getDefaultToolkit().getFontMetrics(f); } - public void setFont (Font f) + public void setFont(Font f) { if (f.getPeer() instanceof GdkFontPeer) font = f; else font = - ((ClasspathToolkit)(Toolkit.getDefaultToolkit ())) - .getFont (f.getName(), f.getAttributes ()); + ((ClasspathToolkit)(Toolkit.getDefaultToolkit())) + .getFont(f.getName(), f.getAttributes()); } - + public String toString() { - return getClass ().getName () + - "[font=" + font.toString () + - ",color=" + fg.toString () + "]"; + return (getClass().getName() + + "[font=" + getFont().toString() + + ",color=" + fg.toString() + + "]"); } - } diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsConfiguration.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsConfiguration.java new file mode 100644 index 00000000000..c5afd0bc952 --- /dev/null +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsConfiguration.java @@ -0,0 +1,138 @@ +/* GdkGraphicsConfiguration.java -- describes characteristics of graphics + Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.awt.peer.gtk; + +import java.awt.BufferCapabilities; +import java.awt.ImageCapabilities; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Rectangle; + +import java.awt.geom.AffineTransform; + +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.VolatileImage; + +public class GdkGraphicsConfiguration + extends GraphicsConfiguration +{ + GdkScreenGraphicsDevice gdkScreenGraphicsDevice; + ColorModel cm; + Rectangle bounds; + + public GtkToolkit getToolkit() + { + return gdkScreenGraphicsDevice.getToolkit(); + } + + public GdkGraphicsConfiguration(GdkScreenGraphicsDevice dev) + { + this.gdkScreenGraphicsDevice = dev; + cm = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).getColorModel(); + bounds = getToolkit().getBounds(); + } + + public GraphicsDevice getDevice() + { + return gdkScreenGraphicsDevice; + } + + public BufferedImage createCompatibleImage(int w, int h) + { + return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + } + + public BufferedImage createCompatibleImage(int w, int h, + int transparency) + { + return createCompatibleImage(w, h); + } + + public VolatileImage createCompatibleVolatileImage(int w, int h) + { + throw new java.lang.UnsupportedOperationException (); + } + + public VolatileImage createCompatibleVolatileImage(int w, int h, + ImageCapabilities caps) + throws java.awt.AWTException + { + throw new java.lang.UnsupportedOperationException (); + } + + public ColorModel getColorModel() + { + return cm; + } + + public ColorModel getColorModel(int transparency) + { + return getColorModel(); + } + + public AffineTransform getDefaultTransform() + { + // FIXME: extract the GDK DPI information here. + return new AffineTransform(); + } + + public AffineTransform getNormalizingTransform() + { + // FIXME: extract the GDK DPI information here. + return new AffineTransform(); + } + + public Rectangle getBounds() + { + return bounds; + } + + public BufferCapabilities getBufferCapabilities() + { + return new BufferCapabilities(getImageCapabilities(), + getImageCapabilities(), + BufferCapabilities.FlipContents.UNDEFINED); + } + + public ImageCapabilities getImageCapabilities() + { + return new ImageCapabilities(false); + } + +} diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java index 45e0c21c0f2..1f10c486921 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java @@ -42,26 +42,37 @@ import java.awt.Font; import java.awt.Graphics2D; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; -import java.awt.Rectangle; -import java.awt.Shape; +import java.awt.HeadlessException; import java.awt.image.BufferedImage; import java.util.Locale; public class GdkGraphicsEnvironment extends GraphicsEnvironment { - public GdkGraphicsEnvironment () + GtkToolkit gtkToolkit; + + public GtkToolkit getToolkit() + { + return gtkToolkit; + } + + public GdkGraphicsEnvironment (GtkToolkit tk) { super(); + gtkToolkit = tk; } public GraphicsDevice[] getScreenDevices () { - throw new java.lang.UnsupportedOperationException (); + // FIXME: Support multiple screens, since GDK can. + return new GraphicsDevice[] { new GdkScreenGraphicsDevice (this) }; } public GraphicsDevice getDefaultScreenDevice () { - throw new java.lang.UnsupportedOperationException (); + if (GraphicsEnvironment.isHeadless ()) + throw new HeadlessException (); + + return new GdkScreenGraphicsDevice (this); } public Graphics2D createGraphics (BufferedImage image) diff --git a/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java b/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java index a7b93e5b9ad..a9c1fb9db26 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java @@ -45,14 +45,31 @@ import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.awt.image.ImageConsumer; import java.awt.image.ImageProducer; -import java.io.FileDescriptor; -import java.io.FileInputStream; +import java.awt.image.Raster; +import java.awt.image.RenderedImage; +import java.io.DataOutput; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.util.ArrayList; import java.util.Hashtable; +import java.util.Iterator; +import java.util.Locale; import java.util.Vector; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import javax.imageio.ImageReadParam; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriteParam; +import javax.imageio.IIOImage; +import javax.imageio.metadata.IIOMetadata; +import javax.imageio.spi.ImageReaderSpi; +import javax.imageio.spi.ImageWriterSpi; +import javax.imageio.spi.IIORegistry; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; + public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder { static @@ -65,20 +82,27 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder } native static void initStaticState (); private final int native_state = GtkGenericPeer.getUniqueInteger (); + private boolean initialized = false; // the current set of ImageConsumers for this decoder Vector curr; // interface to GdkPixbuf native void initState (); - native void pumpBytes (byte bytes[], int len); + native void pumpBytes (byte[] bytes, int len); native void finish (); + static native void streamImage(int[] bytes, String format, int width, int height, boolean hasAlpha, DataOutput sink); // gdk-pixbuf provids data in RGBA format static final ColorModel cm = new DirectColorModel (32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); + public GdkPixbufDecoder (InputStream in) + { + super (in); + } + public GdkPixbufDecoder (String filename) { super (filename); @@ -150,24 +174,349 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder curr = null; } - // remaining helper class and static method is a convenience for the Gtk - // peers, for loading a BufferedImage in off a disk file. one would think - // this ought to be fairly straightforward, but it does not appear - // anywhere else I can find. + public void finalize() + { + finish(); + } + + + public static class ImageFormatSpec + { + public String name; + public boolean writable = false; + public ArrayList mimeTypes = new ArrayList(); + public ArrayList extensions = new ArrayList(); + + public ImageFormatSpec(String name, boolean writable) + { + this.name = name; + this.writable = writable; + } + + public synchronized void addMimeType(String m) + { + mimeTypes.add(m); + } + + public synchronized void addExtension(String e) + { + extensions.add(e); + } + } + + static ArrayList imageFormatSpecs; + + public static ImageFormatSpec registerFormat(String name, boolean writable) + { + ImageFormatSpec ifs = new ImageFormatSpec(name, writable); + synchronized(GdkPixbufDecoder.class) + { + if (imageFormatSpecs == null) + imageFormatSpecs = new ArrayList(); + imageFormatSpecs.add(ifs); + } + return ifs; + } + + static String[] getFormatNames(boolean writable) + { + ArrayList names = new ArrayList(); + synchronized (imageFormatSpecs) + { + Iterator i = imageFormatSpecs.iterator(); + while (i.hasNext()) + { + ImageFormatSpec ifs = (ImageFormatSpec) i.next(); + if (writable && !ifs.writable) + continue; + names.add(ifs.name); + + /* + * In order to make the filtering code work, we need to register + * this type under every "format name" likely to be used as a synonym. + * This generally means "all the extensions people might use". + */ + + Iterator j = ifs.extensions.iterator(); + while (j.hasNext()) + names.add((String) j.next()); + } + } + Object[] objs = names.toArray(); + String[] strings = new String[objs.length]; + for (int i = 0; i < objs.length; ++i) + strings[i] = (String) objs[i]; + return strings; + } + + static String[] getFormatExtensions(boolean writable) + { + ArrayList extensions = new ArrayList(); + synchronized (imageFormatSpecs) + { + Iterator i = imageFormatSpecs.iterator(); + while (i.hasNext()) + { + ImageFormatSpec ifs = (ImageFormatSpec) i.next(); + if (writable && !ifs.writable) + continue; + Iterator j = ifs.extensions.iterator(); + while (j.hasNext()) + extensions.add((String) j.next()); + } + } + Object[] objs = extensions.toArray(); + String[] strings = new String[objs.length]; + for (int i = 0; i < objs.length; ++i) + strings[i] = (String) objs[i]; + return strings; + } + + static String[] getFormatMimeTypes(boolean writable) + { + ArrayList mimeTypes = new ArrayList(); + synchronized (imageFormatSpecs) + { + Iterator i = imageFormatSpecs.iterator(); + while (i.hasNext()) + { + ImageFormatSpec ifs = (ImageFormatSpec) i.next(); + if (writable && !ifs.writable) + continue; + Iterator j = ifs.mimeTypes.iterator(); + while (j.hasNext()) + mimeTypes.add((String) j.next()); + } + } + Object[] objs = mimeTypes.toArray(); + String[] strings = new String[objs.length]; + for (int i = 0; i < objs.length; ++i) + strings[i] = (String) objs[i]; + return strings; + } + + + static String findFormatName(Object ext, boolean needWritable) + { + if (ext == null) + throw new IllegalArgumentException("extension is null"); + + if (!(ext instanceof String)) + throw new IllegalArgumentException("extension is not a string"); + + String str = (String) ext; + + Iterator i = imageFormatSpecs.iterator(); + while (i.hasNext()) + { + ImageFormatSpec ifs = (ImageFormatSpec) i.next(); + + if (needWritable && !ifs.writable) + continue; + + if (ifs.name.equals(str)) + return str; + + Iterator j = ifs.extensions.iterator(); + while (j.hasNext()) + { + String extension = (String)j.next(); + if (extension.equals(str)) + return ifs.name; + } + + j = ifs.mimeTypes.iterator(); + while (j.hasNext()) + { + String mimeType = (String)j.next(); + if (mimeType.equals(str)) + return ifs.name; + } + } + throw new IllegalArgumentException("unknown extension '" + str + "'"); + } + + private static GdkPixbufReaderSpi readerSpi; + private static GdkPixbufWriterSpi writerSpi; + + public static synchronized GdkPixbufReaderSpi getReaderSpi() + { + if (readerSpi == null) + readerSpi = new GdkPixbufReaderSpi(); + return readerSpi; + } + + public static synchronized GdkPixbufWriterSpi getWriterSpi() + { + if (writerSpi == null) + writerSpi = new GdkPixbufWriterSpi(); + return writerSpi; + } + + public static void registerSpis(IIORegistry reg) + { + reg.registerServiceProvider(getReaderSpi(), ImageReaderSpi.class); + reg.registerServiceProvider(getWriterSpi(), ImageWriterSpi.class); + } + + public static class GdkPixbufWriterSpi extends ImageWriterSpi + { + public GdkPixbufWriterSpi() + { + super("GdkPixbuf", "2.x", + GdkPixbufDecoder.getFormatNames(true), + GdkPixbufDecoder.getFormatExtensions(true), + GdkPixbufDecoder.getFormatMimeTypes(true), + "gnu.java.awt.peer.gtk.GdkPixbufDecoder$GdkPixbufWriter", + new Class[] { ImageOutputStream.class }, + new String[] { "gnu.java.awt.peer.gtk.GdkPixbufDecoder$GdkPixbufReaderSpi" }, + false, null, null, null, null, + false, null, null, null, null); + } + + public boolean canEncodeImage(ImageTypeSpecifier ts) + { + return true; + } + + public ImageWriter createWriterInstance(Object ext) + { + return new GdkPixbufWriter(this, ext); + } + + public String getDescription(java.util.Locale loc) + { + return "GdkPixbuf Writer SPI"; + } + + } + + public static class GdkPixbufReaderSpi extends ImageReaderSpi + { + public GdkPixbufReaderSpi() + { + super("GdkPixbuf", "2.x", + GdkPixbufDecoder.getFormatNames(false), + GdkPixbufDecoder.getFormatExtensions(false), + GdkPixbufDecoder.getFormatMimeTypes(false), + "gnu.java.awt.peer.gtk.GdkPixbufDecoder$GdkPixbufReader", + new Class[] { ImageInputStream.class }, + new String[] { "gnu.java.awt.peer.gtk.GdkPixbufDecoder$GdkPixbufWriterSpi" }, + false, null, null, null, null, + false, null, null, null, null); + } - private static class BufferedImageBuilder implements ImageConsumer + public boolean canDecodeInput(Object obj) + { + return true; + } + + public ImageReader createReaderInstance(Object ext) + { + return new GdkPixbufReader(this, ext); + } + + public String getDescription(Locale loc) + { + return "GdkPixbuf Reader SPI"; + } + } + + private static class GdkPixbufWriter + extends ImageWriter + { + String ext; + public GdkPixbufWriter(GdkPixbufWriterSpi ownerSpi, Object ext) + { + super(ownerSpi); + this.ext = findFormatName(ext, true); + } + + public IIOMetadata convertImageMetadata (IIOMetadata inData, + ImageTypeSpecifier imageType, + ImageWriteParam param) + { + return null; + } + + public IIOMetadata convertStreamMetadata (IIOMetadata inData, + ImageWriteParam param) + { + return null; + } + + public IIOMetadata getDefaultImageMetadata (ImageTypeSpecifier imageType, + ImageWriteParam param) + { + return null; + } + + public IIOMetadata getDefaultStreamMetadata (ImageWriteParam param) + { + return null; + } + + public void write (IIOMetadata streamMetadata, IIOImage i, ImageWriteParam param) + throws IOException + { + RenderedImage image = i.getRenderedImage(); + Raster ras = image.getData(); + int width = ras.getWidth(); + int height = ras.getHeight(); + ColorModel model = image.getColorModel(); + int[] pixels = GdkGraphics2D.findSimpleIntegerArray (image.getColorModel(), ras); + + if (pixels == null) + { + BufferedImage img = new BufferedImage(width, height, + (model != null && model.hasAlpha() ? + BufferedImage.TYPE_INT_ARGB + : BufferedImage.TYPE_INT_RGB)); + int[] pix = new int[4]; + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + img.setRGB(x, y, model.getRGB(ras.getPixel(x, y, pix))); + pixels = GdkGraphics2D.findSimpleIntegerArray (img.getColorModel(), + img.getRaster()); + model = img.getColorModel(); + } + + processImageStarted(1); + streamImage(pixels, this.ext, width, height, model.hasAlpha(), + (DataOutput) this.getOutput()); + processImageComplete(); + } + } + + private static class GdkPixbufReader + extends ImageReader + implements ImageConsumer { + // ImageConsumer parts + GdkPixbufDecoder dec; BufferedImage bufferedImage; ColorModel defaultModel; + int width; + int height; + String ext; + + public GdkPixbufReader(GdkPixbufReaderSpi ownerSpi, Object ext) + { + super(ownerSpi); + this.ext = findFormatName(ext, false); + } - public BufferedImage getBufferedImage() + public GdkPixbufReader(GdkPixbufReaderSpi ownerSpi, Object ext, GdkPixbufDecoder d) { - return bufferedImage; + this(ownerSpi, ext); + dec = d; } - public void setDimensions(int width, int height) + public void setDimensions(int w, int h) { - bufferedImage = new BufferedImage (width, height, BufferedImage.TYPE_INT_ARGB); + processImageStarted(1); + width = w; + height = h; } public void setProperties(Hashtable props) {} @@ -189,65 +538,137 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder ColorModel model, int[] pixels, int offset, int scansize) { - if (bufferedImage != null) + if (model == null) + model = defaultModel; + + if (bufferedImage == null) { + bufferedImage = new BufferedImage (width, height, (model != null && model.hasAlpha() ? + BufferedImage.TYPE_INT_ARGB + : BufferedImage.TYPE_INT_RGB)); + } - if (model == null) - model = defaultModel; - - int pixels2[]; - if (model != null) - { - pixels2 = new int[pixels.length]; - for (int yy = 0; yy < h; yy++) - for (int xx = 0; xx < w; xx++) - { - int i = yy * scansize + xx; - pixels2[i] = model.getRGB (pixels[i]); - } - } - else - pixels2 = pixels; - - bufferedImage.setRGB (x, y, w, h, pixels2, offset, scansize); + int pixels2[]; + if (model != null) + { + pixels2 = new int[pixels.length]; + for (int yy = 0; yy < h; yy++) + for (int xx = 0; xx < w; xx++) + { + int i = yy * scansize + xx; + pixels2[i] = model.getRGB (pixels[i]); + } } + else + pixels2 = pixels; + + bufferedImage.setRGB (x, y, w, h, pixels2, offset, scansize); + processImageProgress(y / (height == 0 ? 1 : height)); + } + + public void imageComplete(int status) + { + processImageComplete(); + } + + public BufferedImage getBufferedImage() + { + if (bufferedImage == null && dec != null) + dec.startProduction (this); + return bufferedImage; + } + + // ImageReader parts + + public int getNumImages(boolean allowSearch) + throws IOException + { + return 1; + } + + public IIOMetadata getImageMetadata(int i) + { + return null; + } + + public IIOMetadata getStreamMetadata() + throws IOException + { + return null; } - public void imageComplete(int status) {} + public Iterator getImageTypes(int imageIndex) + throws IOException + { + BufferedImage img = getBufferedImage(); + Vector vec = new Vector(); + vec.add(new ImageTypeSpecifier(img)); + return vec.iterator(); + } + + public int getHeight(int imageIndex) + throws IOException + { + return getBufferedImage().getHeight(); + } + + public int getWidth(int imageIndex) + throws IOException + { + return getBufferedImage().getWidth(); + } + + public void setInput(Object input, + boolean seekForwardOnly, + boolean ignoreMetadata) + { + super.setInput(input, seekForwardOnly, ignoreMetadata); + dec = new GdkPixbufDecoder((InputStream) getInput()); + } + + public BufferedImage read(int imageIndex, ImageReadParam param) + throws IOException + { + return getBufferedImage (); + } } + // remaining helper class and static method is a convenience for the Gtk + // peers, for loading a BufferedImage in off a disk file without going + // through the whole imageio system. + public static BufferedImage createBufferedImage (String filename) { - BufferedImageBuilder bb = new BufferedImageBuilder (); - GdkPixbufDecoder dec = new GdkPixbufDecoder (filename); - dec.startProduction (bb); - return bb.getBufferedImage (); + GdkPixbufReader r = new GdkPixbufReader (getReaderSpi(), + "png", // reader auto-detects, doesn't matter + new GdkPixbufDecoder (filename)); + return r.getBufferedImage (); } public static BufferedImage createBufferedImage (URL u) { - BufferedImageBuilder bb = new BufferedImageBuilder (); - GdkPixbufDecoder dec = new GdkPixbufDecoder (u); - dec.startProduction (bb); - return bb.getBufferedImage (); + GdkPixbufReader r = new GdkPixbufReader (getReaderSpi(), + "png", // reader auto-detects, doesn't matter + new GdkPixbufDecoder (u)); + return r.getBufferedImage (); } public static BufferedImage createBufferedImage (byte[] imagedata, int imageoffset, int imagelength) { - BufferedImageBuilder bb = new BufferedImageBuilder (); - GdkPixbufDecoder dec = new GdkPixbufDecoder (imagedata, imageoffset, imagelength); - dec.startProduction (bb); - return bb.getBufferedImage (); + GdkPixbufReader r = new GdkPixbufReader (getReaderSpi(), + "png", // reader auto-detects, doesn't matter + new GdkPixbufDecoder (imagedata, + imageoffset, + imagelength)); + return r.getBufferedImage (); } public static BufferedImage createBufferedImage (ImageProducer producer) { - BufferedImageBuilder bb = new BufferedImageBuilder (); - producer.startProduction(bb); - return bb.getBufferedImage (); + GdkPixbufReader r = new GdkPixbufReader (getReaderSpi(), "png" /* ignored */, null); + producer.startProduction(r); + return r.getBufferedImage (); } - - } diff --git a/libjava/gnu/java/awt/peer/gtk/GdkRobotPeer.java b/libjava/gnu/java/awt/peer/gtk/GdkRobotPeer.java new file mode 100644 index 00000000000..2438b68501a --- /dev/null +++ b/libjava/gnu/java/awt/peer/gtk/GdkRobotPeer.java @@ -0,0 +1,94 @@ +/* GdkRobot.java -- an XTest implementation of RobotPeer + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.awt.peer.gtk; + +import java.awt.AWTException; +import java.awt.GraphicsDevice; +import java.awt.image.ColorModel; +import java.awt.image.DirectColorModel; +import java.awt.Rectangle; +import java.awt.peer.RobotPeer; + +/** + * Implements the RobotPeer interface using the XTest extension. + * + * @author Thomas Fitzsimmons + */ +public class GdkRobotPeer implements RobotPeer +{ + // gdk-pixbuf provides data in RGBA format + static final ColorModel cm = new DirectColorModel (32, 0xff000000, + 0x00ff0000, + 0x0000ff00, + 0x000000ff); + + public GdkRobotPeer (GraphicsDevice screen) throws AWTException + { + // FIXME: make use of screen parameter when GraphicsDevice is + // implemented. + if (!initXTest ()) + throw new AWTException ("XTest extension not supported"); + } + + native boolean initXTest (); + + // RobotPeer methods + public native void mouseMove (int x, int y); + public native void mousePress (int buttons); + public native void mouseRelease (int buttons); + public native void mouseWheel (int wheelAmt); + public native void keyPress (int keycode); + public native void keyRelease (int keycode); + native int[] nativeGetRGBPixels (int x, int y, int width, int height); + + public int getRGBPixel (int x, int y) + { + return cm.getRGB (nativeGetRGBPixels (x, y, 1, 1)[0]); + } + + public int[] getRGBPixels (Rectangle r) + { + int[] gdk_pixels = nativeGetRGBPixels (r.x, r.y, r.width, r.height); + int[] pixels = new int[r.width * r.height]; + + for (int i = 0; i < r.width * r.height; i++) + pixels[i] = cm.getRGB (gdk_pixels[i]); + + return pixels; + } +} diff --git a/libjava/gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java b/libjava/gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java new file mode 100644 index 00000000000..0acef60b177 --- /dev/null +++ b/libjava/gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java @@ -0,0 +1,82 @@ +/* GdkScreenGraphicsDevice.java -- information about a screen device + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package gnu.java.awt.peer.gtk; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsConfiguration; + +public class GdkScreenGraphicsDevice extends GraphicsDevice +{ + GdkGraphicsEnvironment env; + + public GtkToolkit getToolkit() + { + return env.getToolkit(); + } + + public GdkScreenGraphicsDevice (GdkGraphicsEnvironment e) + { + super (); + env = e; + } + + public int getType () + { + return GraphicsDevice.TYPE_RASTER_SCREEN; + } + + public String getIDstring () + { + // FIXME: query X for this string + return "default GDK device ID string"; + } + + public GraphicsConfiguration[] getConfigurations () + { + // FIXME: query X for the list of possible configurations + return new GraphicsConfiguration [] { new GdkGraphicsConfiguration(this) }; + } + + public GraphicsConfiguration getDefaultConfiguration () + { + + // FIXME: query X for default configuration + return new GdkGraphicsConfiguration(this); + } +} diff --git a/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java b/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java index 26cfc16f0da..b5548a837ba 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java @@ -52,7 +52,6 @@ import java.awt.geom.Rectangle2D; import java.text.CharacterIterator; import java.text.AttributedCharacterIterator; import java.text.AttributedString; -import java.util.Map; import java.awt.font.TextAttribute; import gnu.classpath.Configuration; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkArg.java b/libjava/gnu/java/awt/peer/gtk/GtkArg.java deleted file mode 100644 index 0491856849c..00000000000 --- a/libjava/gnu/java/awt/peer/gtk/GtkArg.java +++ /dev/null @@ -1,61 +0,0 @@ -/* GtkArg.java - Copyright (C) 1999 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package gnu.java.awt.peer.gtk; - -public class GtkArg -{ - String name; - Object value; - - public GtkArg (String name, Object value) - { - this.name = name; - this.value = value; - } - - public String getName () - { - return name; - } - - public Object getValue () - { - return value; - } -} diff --git a/libjava/gnu/java/awt/peer/gtk/GtkArgList.java b/libjava/gnu/java/awt/peer/gtk/GtkArgList.java deleted file mode 100644 index 28cea93db4a..00000000000 --- a/libjava/gnu/java/awt/peer/gtk/GtkArgList.java +++ /dev/null @@ -1,75 +0,0 @@ -/* GtkArgList.java - Copyright (C) 1999 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package gnu.java.awt.peer.gtk; -import java.util.Vector; - -public class GtkArgList extends Vector -{ - void add (GtkArg arg) - { - addElement (arg); - } - - void add (String name, boolean value) - { - addElement (new GtkArg (name, Boolean.valueOf(value))); - } - - void add (String name, int value) - { - addElement (new GtkArg (name, new Integer (value))); - } - - void add (String name, float value) - { - addElement (new GtkArg (name, new Float (value))); - } - - void add (String name, Object value) - { - addElement (new GtkArg (name, value)); - } - - synchronized void setArgs (GtkComponentPeer cp) - { - for (int i = 0; i < elementCount; i++) - cp.set ((GtkArg)elementData[i]); - } -} - diff --git a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java index 9fba828b74b..1ef992f02df 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java @@ -41,7 +41,6 @@ package gnu.java.awt.peer.gtk; import java.awt.AWTEvent; import java.awt.Button; import java.awt.Component; -import java.awt.Font; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java index adb7008ca3f..2d1f6500862 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java @@ -38,6 +38,8 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.ItemSelectable; +import java.awt.event.ItemEvent; import java.awt.CheckboxMenuItem; import java.awt.peer.CheckboxMenuItemPeer; import java.awt.peer.MenuItemPeer; @@ -54,4 +56,15 @@ public class GtkCheckboxMenuItemPeer extends GtkMenuItemPeer } native public void setState (boolean t); + + protected void postMenuActionEvent () + { + CheckboxMenuItem item = (CheckboxMenuItem)awtWidget; + q().postEvent (new ItemEvent ((ItemSelectable)awtWidget, + ItemEvent.ITEM_STATE_CHANGED, + item.getActionCommand(), + item.getState() ? ItemEvent.DESELECTED : ItemEvent.SELECTED)); + + super.postMenuActionEvent(); + } } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index a6fd1bac183..4af88f5332c 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java @@ -40,8 +40,6 @@ package gnu.java.awt.peer.gtk; import java.awt.Checkbox; import java.awt.CheckboxGroup; -import java.awt.Component; -import java.awt.Font; import java.awt.peer.CheckboxPeer; public class GtkCheckboxPeer extends GtkComponentPeer diff --git a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java index 05464143dcf..a065e13abcb 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java @@ -38,7 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.AWTEvent; import java.awt.Choice; import java.awt.event.ItemEvent; import java.awt.peer.ChoicePeer; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 31d59ce19b0..d9d9907e92e 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -47,14 +47,12 @@ import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; -import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Insets; import java.awt.ItemSelectable; -import java.awt.KeyboardFocusManager; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; @@ -386,7 +384,7 @@ public class GtkComponentPeer extends GtkGenericPeer if (x == 0 && y == 0 && width == 0 && height == 0) return; - q.postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, + q().postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, new Rectangle (x, y, width, height))); } @@ -508,14 +506,14 @@ public class GtkComponentPeer extends GtkGenericPeer protected void postMouseEvent(int id, long when, int mods, int x, int y, int clickCount, boolean popupTrigger) { - q.postEvent(new MouseEvent(awtComponent, id, when, mods, x, y, + q().postEvent(new MouseEvent(awtComponent, id, when, mods, x, y, clickCount, popupTrigger)); } protected void postExposeEvent (int x, int y, int width, int height) { if (!isInRepaint) - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, new Rectangle (x, y, width, height))); } @@ -535,23 +533,23 @@ public class GtkComponentPeer extends GtkGenericPeer { synchronized (q) { - q.postEvent (keyEvent); - q.postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods, + q().postEvent (keyEvent); + q().postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods, KeyEvent.VK_UNDEFINED, keyChar, keyLocation)); } } else - q.postEvent (keyEvent); + q().postEvent (keyEvent); } protected void postFocusEvent (int id, boolean temporary) { - q.postEvent (new FocusEvent (awtComponent, id, temporary)); + q().postEvent (new FocusEvent (awtComponent, id, temporary)); } protected void postItemEvent (Object item, int stateChange) { - q.postEvent (new ItemEvent ((ItemSelectable)awtComponent, + q().postEvent (new ItemEvent ((ItemSelectable)awtComponent, ItemEvent.ITEM_STATE_CHANGED, item, stateChange)); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java index 7fddd56619f..61551835ec7 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -38,7 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.AWTEvent; import java.awt.Color; import java.awt.Component; import java.awt.Container; @@ -46,7 +45,6 @@ import java.awt.Font; import java.awt.Graphics; import java.awt.Insets; import java.awt.Window; -import java.awt.event.PaintEvent; import java.awt.peer.ComponentPeer; import java.awt.peer.ContainerPeer; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java index af22a2723ef..9bf234404d1 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -38,8 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.AWTEvent; -import java.awt.Component; import java.awt.Dialog; import java.awt.Graphics; import java.awt.Rectangle; @@ -76,7 +74,7 @@ public class GtkDialogPeer extends GtkWindowPeer protected void postExposeEvent (int x, int y, int width, int height) { if (!isInRepaint) - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, new Rectangle (x + insets.left, y + insets.top, width, height))); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java index 19925568e87..fd9c155d2d1 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java @@ -38,12 +38,10 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.AWTEvent; import java.awt.Dialog; import java.awt.FileDialog; import java.awt.Graphics; import java.awt.Window; -import java.awt.event.WindowEvent; import java.awt.peer.FileDialogPeer; import java.io.File; import java.io.FilenameFilter; @@ -114,7 +112,7 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer // GtkFileChooser requires absolute filenames. If the given filename // is not absolute, let's construct it based on current directory. - currentFile = fileName; + currentFile = fileName; if (fileName.indexOf(FS) == 0) { nativeSetFile (fileName); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java index 605d738a199..1369657a8aa 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java @@ -46,7 +46,6 @@ import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.font.LineMetrics; import java.awt.geom.Rectangle2D; -import java.awt.peer.FontPeer; import java.text.CharacterIterator; import java.util.Locale; import java.util.MissingResourceException; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index c0c1437b656..b22a25e8869 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -38,11 +38,8 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.Component; -import java.awt.Container; import java.awt.Frame; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.Image; import java.awt.MenuBar; import java.awt.Rectangle; @@ -165,7 +162,7 @@ public class GtkFramePeer extends GtkWindowPeer setMenuBar (frame.getMenuBar ()); setTitle (frame.getTitle ()); - setResizable (frame.isResizable ()); + gtkWindowSetResizable (frame.isResizable ()); setIconImage(frame.getIconImage()); } @@ -237,9 +234,9 @@ public class GtkFramePeer extends GtkWindowPeer frame_y, frame_width, frame_height); - } - awtComponent.validate(); + awtComponent.validate(); + } } protected void postMouseEvent(int id, long when, int mods, int x, int y, @@ -253,7 +250,7 @@ public class GtkFramePeer extends GtkWindowPeer protected void postExposeEvent (int x, int y, int width, int height) { if (!isInRepaint) - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, new Rectangle (x + insets.left, y + insets.top, width, height))); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java index 657e830bf2e..f161526f647 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java @@ -39,6 +39,7 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.EventQueue; +import java.awt.Toolkit; import java.awt.event.ActionEvent; public class GtkGenericPeer @@ -57,6 +58,11 @@ public class GtkGenericPeer // Dispose of our native state. public native void dispose (); + static EventQueue q () + { + return Toolkit.getDefaultToolkit ().getSystemEventQueue (); + } + protected GtkGenericPeer (Object awtWidget) { this.awtWidget = awtWidget; @@ -70,7 +76,7 @@ public class GtkGenericPeer protected void postActionEvent (String command, int mods) { - q.postEvent (new ActionEvent (awtWidget, ActionEvent.ACTION_PERFORMED, + q().postEvent (new ActionEvent (awtWidget, ActionEvent.ACTION_PERFORMED, command, mods)); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java index 25473d78ea2..3e3e2e3f1cb 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java @@ -38,8 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.Component; -import java.awt.Font; import java.awt.Label; import java.awt.peer.LabelPeer; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMainThread.java b/libjava/gnu/java/awt/peer/gtk/GtkMainThread.java deleted file mode 100644 index 4cbe190731c..00000000000 --- a/libjava/gnu/java/awt/peer/gtk/GtkMainThread.java +++ /dev/null @@ -1,111 +0,0 @@ -/* GtkMainThread.java -- Runs gtk_main() - Copyright (C) 1998, 1999 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package gnu.java.awt.peer.gtk; - -public class GtkMainThread extends GtkGenericPeer implements Runnable -{ - private static Thread mainThread = null; - private static Object mainThreadLock = new Object(); - - // Whether the gtk+ subsystem has been initialized. - private boolean gtkInitCalled = false; - - /** - * Call gtk_init. It is very important that this happen before any other - * gtk calls. - * - * @param portableNativeSync 1 if the Java property - * gnu.classpath.awt.gtk.portable.native.sync is set to "true". 0 if it is - * set to "false". -1 if unset. - */ - static native void gtkInit(int portableNativeSync); - native void gtkMain(); - - public GtkMainThread() - { - super (null); - synchronized (mainThreadLock) - { - if (mainThread != null) - throw new IllegalStateException(); - mainThread = new Thread(this, "GtkMain"); - } - - synchronized (this) - { - mainThread.start(); - - while (!gtkInitCalled) - { - try - { - wait(); - } - catch (InterruptedException e) { } - } - } - } - - public void run() - { - /* Pass the value of the gnu.classpath.awt.gtk.portable.native.sync system - * property to C. */ - int portableNativeSync; - String portNatSyncProp = - System.getProperty("gnu.classpath.awt.gtk.portable.native.sync"); - - if (portNatSyncProp == null) - portableNativeSync = -1; // unset - else if (Boolean.valueOf(portNatSyncProp).booleanValue()) - portableNativeSync = 1; // true - else - portableNativeSync = 0; // false - - synchronized (this) - { - gtkInit(portableNativeSync); - gtkInitCalled = true; - notifyAll(); - } - gtkMain(); - } -} - - - diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java index dd061ed37b8..cd7ca8ac79b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java @@ -38,8 +38,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.Font; -import java.awt.MenuComponent; import java.awt.peer.MenuComponentPeer; public class GtkMenuComponentPeer extends GtkGenericPeer diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java index 81da90df012..33242f69c4b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java @@ -43,8 +43,6 @@ import java.awt.Menu; import java.awt.MenuComponent; import java.awt.MenuBar; import java.awt.MenuItem; -import java.awt.peer.MenuBarPeer; -import java.awt.peer.MenuComponentPeer; import java.awt.peer.MenuItemPeer; import java.awt.peer.MenuPeer; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java index 233bed75a9b..b99ef24c881 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java @@ -41,7 +41,6 @@ package gnu.java.awt.peer.gtk; import java.awt.Adjustable; import java.awt.Dimension; import java.awt.ScrollPane; -import java.awt.peer.ComponentPeer; import java.awt.peer.ScrollPanePeer; public class GtkScrollPanePeer extends GtkContainerPeer diff --git a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java index ef4289633c4..d6a498ce5df 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java @@ -73,7 +73,7 @@ public class GtkScrollbarPeer extends GtkComponentPeer protected void postAdjustmentEvent (int type, int value) { - q.postEvent (new AdjustmentEvent ((Adjustable)awtComponent, + q().postEvent (new AdjustmentEvent ((Adjustable)awtComponent, AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, type, value)); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java index 8893e36e838..3051ecfcfa8 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java @@ -38,11 +38,8 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.AWTEvent; -import java.awt.Component; import java.awt.Rectangle; import java.awt.TextComponent; -import java.awt.event.KeyEvent; import java.awt.event.TextEvent; import java.awt.peer.TextComponentPeer; @@ -85,6 +82,6 @@ public class GtkTextComponentPeer extends GtkComponentPeer protected void postTextEvent () { - q.postEvent (new TextEvent (awtComponent, TextEvent.TEXT_VALUE_CHANGED)); + q().postEvent (new TextEvent (awtComponent, TextEvent.TEXT_VALUE_CHANGED)); } } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java b/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java index def22e9874e..f57f53a17a7 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java @@ -51,7 +51,6 @@ import java.awt.datatransfer.Clipboard; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.font.FontRenderContext; -import java.awt.font.TextAttribute; import java.awt.im.InputMethodHighlight; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; @@ -59,15 +58,17 @@ import java.awt.image.ImageConsumer; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.awt.peer.*; +import java.io.InputStream; import java.net.URL; import java.text.AttributedString; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.MissingResourceException; import java.util.Properties; +import javax.imageio.spi.IIORegistry; /* This class uses a deprecated method java.awt.peer.ComponentPeer.getPeer(). This merits comment. We are basically calling Sun's bluff on this one. @@ -86,9 +87,8 @@ import java.util.Properties; public class GtkToolkit extends gnu.java.awt.ClasspathToolkit implements EmbeddedWindowSupport { - GtkMainThread main; Hashtable containers = new Hashtable(); - static EventQueue q = new EventQueue(); + static EventQueue q; static Clipboard systemClipboard; static boolean useGraphics2dSet; static boolean useGraphics2d; @@ -103,19 +103,32 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit return useGraphics2d; } + static native void gtkInit(int portableNativeSync); + static { if (Configuration.INIT_LOAD_LIBRARY) System.loadLibrary("gtkpeer"); + + int portableNativeSync; + String portNatSyncProp = + System.getProperty("gnu.classpath.awt.gtk.portable.native.sync"); + + if (portNatSyncProp == null) + portableNativeSync = -1; // unset + else if (Boolean.valueOf(portNatSyncProp).booleanValue()) + portableNativeSync = 1; // true + else + portableNativeSync = 0; // false + + gtkInit(portableNativeSync); } public GtkToolkit () { - main = new GtkMainThread (); systemClipboard = new GtkClipboard (); - GtkGenericPeer.enableQueue (q); } - + native public void beep (); native private void getScreenSizeDimensions (int[] xy); @@ -313,7 +326,7 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit "SansSerif" }); } - private class LRUCache extends java.util.LinkedHashMap + private class LRUCache extends LinkedHashMap { int max_entries; public LRUCache(int max) @@ -333,15 +346,18 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit public FontMetrics getFontMetrics (Font font) { - if (metricsCache.containsKey(font)) - return (FontMetrics) metricsCache.get(font); - else + synchronized (metricsCache) + { + if (metricsCache.containsKey(font)) + return (FontMetrics) metricsCache.get(font); + } + + FontMetrics m = new GdkFontMetrics (font); + synchronized (metricsCache) { - FontMetrics m; - m = new GdkFontMetrics (font); metricsCache.put(font, m); - return m; - } + } + return m; } public Image getImage (String filename) @@ -594,6 +610,14 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit protected EventQueue getSystemEventQueueImpl() { + synchronized (GtkToolkit.class) + { + if (q == null) + { + q = new EventQueue(); + GtkGenericPeer.enableQueue (q); + } + } return q; } @@ -609,19 +633,37 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit throw new Error("not implemented"); } + public Rectangle getBounds() + { + int[] dims = new int[2]; + getScreenSizeDimensions(dims); + return new Rectangle(0, 0, dims[0], dims[1]); + } + // ClasspathToolkit methods public GraphicsEnvironment getLocalGraphicsEnvironment() { - GraphicsEnvironment ge; - ge = new GdkGraphicsEnvironment (); - return ge; + return new GdkGraphicsEnvironment(this); + } + + public Font createFont(int format, InputStream stream) + { + throw new UnsupportedOperationException(); + } + + public RobotPeer createRobot (GraphicsDevice screen) throws AWTException + { + return new GdkRobotPeer (screen); } - public Font createFont(int format, java.io.InputStream stream) + public void registerImageIOSpis(IIORegistry reg) { - throw new java.lang.UnsupportedOperationException (); + GdkPixbufDecoder.registerSpis(reg); } + public native boolean nativeQueueEmpty(); + public native void wakeNativeQueue(); + public native void iterateNativeQueue(EventQueue locked, boolean block); } // class GtkToolkit diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index c61eecd5aa5..1d6e253b072 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -39,7 +39,6 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.Component; -import java.awt.Dimension; import java.awt.Frame; import java.awt.Window; import java.awt.event.WindowEvent; @@ -166,10 +165,12 @@ public class GtkWindowPeer extends GtkContainerPeer || frame_y != awtComponent.getY() || frame_width != awtComponent.getWidth() || frame_height != awtComponent.getHeight()) - setBoundsCallback ((Window) awtComponent, - frame_x, frame_y, frame_width, frame_height); + { + setBoundsCallback ((Window) awtComponent, + frame_x, frame_y, frame_width, frame_height); - awtComponent.validate(); + awtComponent.validate(); + } } native void nativeSetVisible (boolean b); @@ -192,7 +193,7 @@ public class GtkWindowPeer extends GtkContainerPeer // Post a WINDOW_OPENED event the first time this window is shown. if (!hasBeenShown) { - q.postEvent (new WindowEvent ((Window) awtComponent, id, + q().postEvent (new WindowEvent ((Window) awtComponent, id, opposite)); hasBeenShown = true; } @@ -201,12 +202,12 @@ public class GtkWindowPeer extends GtkContainerPeer { if (oldState != newState) { - q.postEvent (new WindowEvent ((Window) awtComponent, id, opposite, + q().postEvent (new WindowEvent ((Window) awtComponent, id, opposite, oldState, newState)); oldState = newState; } } else - q.postEvent (new WindowEvent ((Window) awtComponent, id, opposite)); + q().postEvent (new WindowEvent ((Window) awtComponent, id, opposite)); } } -- cgit v1.2.1