# *************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
# *************************************************************

The new OOo Canvas Framework
============================

The new OpenOffice.org canvas framework is the successor of the system
GUI and graphics backend VCL. Basic functionality is available,
supplying just as much features as necessary to provide a
VCL-equivalent feature set (except proper BiDi/CTL support).

For migration purposes, the new canvas and VCL will be shipped with
OpenOffice.org for quite some time, allowing a step-by-step adaptation
of the applications. Therefore, the canvas and VCL must somehow
interoperate, since new code, using the canvas, typically is embedded
in a VCL-based environment (for example, the OOo windows are still
provided by VCL. To render into such a window via the canvas, a canvas
must be constructable from a VCL window). Thus, essentially two new
methods are provided at VCL's window, namely Window::GetCanvas() and
Window::GetFullScreenCanvas(). Apart from that small link, canvas and
VCL are completely separated.

The canvas framework currently consists of the following two new
CVS modules, /gsl/canvas and /gsl/cppcanvas. Additionally, a new
generic graphics tooling is used (but not exclusively by the canvas,
Armin's recent drawing layer fixups also make use of it), which
resides in /graphics/basegfx. From these modules, six libraries are
currently delivered, namely vclcanvas.uno.dll, javacanvas.jar,
directxcanvas.uno.dll, canvastools680mi.dll, cppcanvas680mi.dll, and
basegfx680mi.dll. 


The new OOo slideshow engine
============================

The new OpenOffice.org slideshow engine will replace the current
Impress-embedded presentation framework with a fully independent UNO
component, and it will be based on the new canvas. In its current
state, it is able to provide a basic set of functionality, enabling
the playback of simple presentations. It furthermore provides features
like double-buffering, hardware-accelerated alpha-blending (currently
not on all platforms) and anti-aliased rendering of all primitives.

In a second step, this new slideshow engine will then be integrated
with Impress model enhancements and extended PowerPoint import/export
filters, to implement nearly all of PowerPoint's set of effects.

The new slideshow engine is currently not accessible from the office
UI, but included in the installations sets. Thus, other developers can
start to use the new functionality, and base their own implementations
on top of that. For the records, the respective UNO implementation of
the slideshow resides in the slideshow.uno.dll library.

