Difference between revisions of "Mac OS X Porting - Comparison to Toolkit Ports"

From Apache OpenOffice Wiki
Jump to: navigation, search
(Comparison)
(Add images, fix errors)
Line 19: Line 19:
  
 
ATS = Apple Type Services API - The Mac OS X api for font enumeration (finding available fonts)
 
ATS = Apple Type Services API - The Mac OS X api for font enumeration (finding available fonts)
 +
 +
ATSUI = Apple Type Services for Unicode Imaging - the Mac OS X API for laying out (shaping) and drawing (rendering) Unicode text in correct manner.
  
 
'''Cairo''' - open source, cross-platform PDF-like graphics rendering API. Implementations include X11, Windows, Mac OS X. The Mac OS X implementation uses mainly CG* functions with some Carbon added in.
 
'''Cairo''' - open source, cross-platform PDF-like graphics rendering API. Implementations include X11, Windows, Mac OS X. The Mac OS X implementation uses mainly CG* functions with some Carbon added in.
 +
 +
NOTE: currently (Jan 2007) Cairo includes two Mac OS X backends: cairo-quartz and cairo-nquartz. The cairo-quartz is the older one and used in GTK port. The other nquartz/"Native Quartz" is used by new Mozilla XUL code. It is expected that native quartz backend will replace the older backend and become the default backend for Mac OS X.
  
 
=== High level APIs ===
 
=== High level APIs ===
ATSUI = Apple Type Services for Unicode Imaging - the Mac OS X API for laying out (shaping) and drawing (rendering) Unicode text in correct manner.
 
  
 
Carbon = C language based API for creating GUI applications in Mac OS X. This older API is closer to Win32 and X11 API than Cocoa API. Carbon cannot include Cocoa code.
 
Carbon = C language based API for creating GUI applications in Mac OS X. This older API is closer to Win32 and X11 API than Cocoa API. Carbon cannot include Cocoa code.
Line 29: Line 32:
 
NS* = Cocoa = Objective C based API for creating GUI applications in Mac OS X. This NextStep derived fully object oriented, and uses messages to pass commands between functions. The API that Mac OS X itself uses for the system and applications. Cocoa can include/mix with Carbon code.
 
NS* = Cocoa = Objective C based API for creating GUI applications in Mac OS X. This NextStep derived fully object oriented, and uses messages to pass commands between functions. The API that Mac OS X itself uses for the system and applications. Cocoa can include/mix with Carbon code.
  
NOTE: currently (Jan 2007) Cairo includes two Mac OS X backends: cairo-quartz and cairo-nquartz. The cairo-quartz is the older one and used in GTK port. The other nquartz/"Native Quartz" is used by new Mozilla XUL code. It is expected that native quartz backend will replace the older backend and become the default backend for Mac OS X.
 
  
 
== Comparison ==
 
== Comparison ==
  
 
{| border="1" cellpadding="5" cellspacing="0" align="center"
 
{| border="1" cellpadding="5" cellspacing="0" align="center"
|+'''Comparison between OpenOffice.org and toolkit ports'''
+
|+'''Comparison between OpenOffice.org and toolkit ports to Mac OS X'''
 
|-
 
|-
! style="width:100px;" |   !! style="background:#59e;width:150px;" | OpenOffice.org !! style="background:#59e;width:150px;" | GTK !! style="background:#59e;width:150px;" | XUL (Mozilla)   
+
! style="width:100px;" |   !! style="background:#59e;width:200px;" | OpenOffice.org !! style="background:#59e;width:200px;" | GTK !! style="background:#59e;width:200px;" | XUL (Mozilla)   
 
|-
 
|-
 
! style="background:#abcdef;" colspan="4" | Fonts
 
! style="background:#abcdef;" colspan="4" | Fonts
Line 57: Line 59:
 
|-
 
|-
 
| ''NEW'' || CG* via Cairo in OOo Canvas || CG* via Cairo in GDK Cairo API || CG* via Cairo in Mozilla Thebes API
 
| ''NEW'' || CG* via Cairo in OOo Canvas || CG* via Cairo in GDK Cairo API || CG* via Cairo in Mozilla Thebes API
 +
|-
 +
! style="background:#abcdef;" colspan="4" | Images
 +
|-
 +
| colspan="4" | X11 has concept of server-side/drawable: '''pixmaps''' (many depths, 1-bit = "Bitmap"), and client-side/non-drawable: '''images''' (no alpha) and '''pixbufs''' (can have alpha)
 +
|-
 +
| ''image handling'' || ''only basics implemented'' || CGImageRef (could be CGLayer for Mac OS X 10.4+) via GdkPixmap, GdkImage and GdkPixbuf || ??
 
|-
 
|-
 
! style="background:#abcdef;" colspan="4" | Windows
 
! style="background:#abcdef;" colspan="4" | Windows
Line 64: Line 72:
 
| '''Child windows'''<br>''Mac OS X does not natively have these'' || ''not implemented'' || NSView with reference to top level NSWindow || ? (Cocoa)
 
| '''Child windows'''<br>''Mac OS X does not natively have these'' || ''not implemented'' || NSView with reference to top level NSWindow || ? (Cocoa)
 
|-
 
|-
| '''Input-only windows'''<br>''Mac OS X does not natively have these'' || ''not implemented'' || emulated/custom code || ?  
+
| '''Input-only windows'''<br>''Mac OS X does not natively have these'' || FIXME: needed for OOo? || emulated/custom code || ?  
 
|-
 
|-
 
! style="background:#abcdef;" colspan="4" | Cursors
 
! style="background:#abcdef;" colspan="4" | Cursors
 
|-  
 
|-  
 +
| ''changing cursor depending on the area where it is (e.g. text input cursor, dragging cursor)'' || ''not implemented'' || NSCursor<br>''implements GdkCursor'' || ??
 
|-
 
|-
! style="background:#abcdef;" colspan="4" | Events
+
! style="background:#abcdef;" colspan="4" | Events (custom dispatching)
 
|-  
 
|-  
 +
| colspan="4" | OOo and toolkits have their own event system in addition to the platform's own event system
 +
|-
 +
| '''Mouse events'''  || kEventMouseDown et al. (Carbon) || NSLeftMouseDown et al. (Cocoa) || ??
 +
|-
 +
| '''Keyboard Events'''<br>'' || partial implementation || events always sent to top-level window || ??
 +
|-
 +
| '''Crossing Events'''<br>''a X11 feature where windows are notified when mouse leaves/enters the window || FIXME: needed for OOo? || custom code/emulation'' || ??
 +
|-
 +
| '''Resize Events'''<br>''When window size changes'' ||  FIXME: needed for OOo? || emulated ||??
 
|-
 
|-
! style="background:#abcdef;" colspan="4" | Windows
+
| '''Mouse/Keyboard grabs'''<br>''a X11 feature where input field can grab the mouse/keyboard even when mouse is moved away from the area. Mac OS X does not natively have these'' || FIXME: needed for OOo? || custom code/emulation || Not Needed
 
|-  
 
|-  
  

Revision as of 19:45, 2 January 2007

Introduction

In addition to OpenOffice.org for Mac OS X porting effort, recently also several significant open source toolkits have been ported to Mac OS X. These include GTK, XUL (Mozilla), QT and WxWidgets.

Each of these ports have chosen somewhat different approaches, due to nature of the original code and the preferences of available Mac OS X (e.g. Cocoa, Carbon) and open source technologies (e.g. Cairo). There are also many similarities also. This page aims to describe how (and possibly why) the ports differ, and in places where OpenOffice.org Mac OS X port code is not yet matured, what potential solutions exist.

Resources

Explanations

In order to understand the different technologies, here's a short introduction to the key parts:

Low level APIs

CF* = Core Foundation functions - The Mac OS X system layer that operates e.g. the run/event loop. Both Cocoa and Carbon use these functions

CG* = Core Graphics functions i.e. Quartz The Mac OS X graphics rendering layer. Both Cocoa and Carbon use these functions

ATS = Apple Type Services API - The Mac OS X api for font enumeration (finding available fonts)

ATSUI = Apple Type Services for Unicode Imaging - the Mac OS X API for laying out (shaping) and drawing (rendering) Unicode text in correct manner.

Cairo - open source, cross-platform PDF-like graphics rendering API. Implementations include X11, Windows, Mac OS X. The Mac OS X implementation uses mainly CG* functions with some Carbon added in.

NOTE: currently (Jan 2007) Cairo includes two Mac OS X backends: cairo-quartz and cairo-nquartz. The cairo-quartz is the older one and used in GTK port. The other nquartz/"Native Quartz" is used by new Mozilla XUL code. It is expected that native quartz backend will replace the older backend and become the default backend for Mac OS X.

High level APIs

Carbon = C language based API for creating GUI applications in Mac OS X. This older API is closer to Win32 and X11 API than Cocoa API. Carbon cannot include Cocoa code.

NS* = Cocoa = Objective C based API for creating GUI applications in Mac OS X. This NextStep derived fully object oriented, and uses messages to pass commands between functions. The API that Mac OS X itself uses for the system and applications. Cocoa can include/mix with Carbon code.


Comparison

Comparison between OpenOffice.org and toolkit ports to Mac OS X
  OpenOffice.org GTK XUL (Mozilla)
Fonts
Enumeration
Getting and showing the list of available fonts to user
ATS NSFontManager
The only way to get identical font (family) listing as in Mac OS X native applications and in Font Book
not yet implemented?
Shaping
text strings to glyphs
ATSUI
not fully implemented
ATSUI via Pango
a pango shaping engine
ATSUI?
Rendering
Glyphs to screen/print
ATSUI
not fully implemented
ATSUI via Cairo
cairo_show_glyphs
ATSUI?
Metrics
font analysis and information, also font substitution
 ?? ATS via Pango, font substitution not implemented  ??
Main Loop integration
Toolkit event loop integration CF* and Carbon CF* and NSApplication (Cocoa)
with custom event sources
CF* and NSApplication (Cocoa)
Drawing (Rendering)
OLD CG* via VCL API
Win32 based API
CG* via GDK API
X11 based API
 ?
NEW CG* via Cairo in OOo Canvas CG* via Cairo in GDK Cairo API CG* via Cairo in Mozilla Thebes API
Images
X11 has concept of server-side/drawable: pixmaps (many depths, 1-bit = "Bitmap"), and client-side/non-drawable: images (no alpha) and pixbufs (can have alpha)
image handling only basics implemented CGImageRef (could be CGLayer for Mac OS X 10.4+) via GdkPixmap, GdkImage and GdkPixbuf  ??
Windows
Root and top level windows HiView (Carbon) NSWindow + NSView (Cocoa)  ? (Cocoa)
Child windows
Mac OS X does not natively have these
not implemented NSView with reference to top level NSWindow  ? (Cocoa)
Input-only windows
Mac OS X does not natively have these
FIXME: needed for OOo? emulated/custom code  ?
Cursors
changing cursor depending on the area where it is (e.g. text input cursor, dragging cursor) not implemented NSCursor
implements GdkCursor
 ??
Events (custom dispatching)
OOo and toolkits have their own event system in addition to the platform's own event system
Mouse events kEventMouseDown et al. (Carbon) NSLeftMouseDown et al. (Cocoa)  ??
Keyboard Events
partial implementation events always sent to top-level window  ??
Crossing Events
a X11 feature where windows are notified when mouse leaves/enters the window
FIXME: needed for OOo? custom code/emulation  ??
Resize Events
When window size changes
FIXME: needed for OOo? emulated ??
Mouse/Keyboard grabs
a X11 feature where input field can grab the mouse/keyboard even when mouse is moved away from the area. Mac OS X does not natively have these
FIXME: needed for OOo? custom code/emulation Not Needed
Personal tools