summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/examples/ahigl.qdoc572
-rw-r--r--doc/src/getting-started/examples.qdoc1
-rw-r--r--doc/src/snippets/code/doc_src_examples_ahigl.qdoc49
-rw-r--r--examples/qws/ahigl/ahigl.pro16
-rw-r--r--examples/qws/ahigl/qscreenahigl_qws.cpp963
-rw-r--r--examples/qws/ahigl/qscreenahigl_qws.h91
-rw-r--r--examples/qws/ahigl/qscreenahiglplugin.cpp97
-rw-r--r--examples/qws/ahigl/qwindowsurface_ahigl.cpp349
-rw-r--r--examples/qws/ahigl/qwindowsurface_ahigl_p.h92
9 files changed, 0 insertions, 2230 deletions
diff --git a/doc/src/examples/ahigl.qdoc b/doc/src/examples/ahigl.qdoc
deleted file mode 100644
index c5e2387..0000000
--- a/doc/src/examples/ahigl.qdoc
+++ /dev/null
@@ -1,572 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qws/ahigl
- \title OpenGL for Embedded Systems Example
-
- \section1 Introduction
-
- This example demonstrates how you can use OpenGL for Embedded
- Systems (ES) in your own screen driver and \l{add your graphics
- driver to Qt for Embedded Linux}. In \l{Qt for Embedded Linux},
- painting is done in software, normally performed in two steps:
- First, each client renders its windows onto its window surface in
- memory using a paint engine. Then the server uses the screen
- driver to compose the window surface images and copy the
- composition to the screen. (See the \l{Qt for Embedded Linux
- Architecture} documentation for details.)
-
- This example is not for the novice. It assumes the reader is
- familiar with both OpenGL and the screen driver framework
- demonstrated in the \l {Accelerated Graphics Driver Example}.
-
- An OpenGL screen driver for Qt for Embedded Linux can use OpenGL ES
- in three ways. First, the \l{QWSServer}{Qt for Embedded Linux server}
- can use the driver to compose multiple window images and then show the
- composition on the screen. Second, clients can use the driver to
- accelerate OpenGL painting operations using the QOpenGLPaintEngine
- class. Finally, clients can use the driver to do OpenGL operations
- with instances of the QGLWidget class. This example implements all
- three cases.
-
- The example uses an implementation of OpenGL ES from
- \l {http://ati.amd.com}{ATI} for the
- \l {http://ati.amd.com/products/imageon238x/}{Imageon 2380}. The
- OpenGL include files gl.h and egl.h must be installed to compile
- the example, and the OpenGL and EGL libraries must be installed
- for linking. If your target device is different, you must install
- the include files and libraries for that device, and you also
- might need to modify the example source code, if any API signatures
- in your EGL library differ from the ones used here.
-
- After compiling and linking the example source, install the
- screen driver plugin with the command \c {make install}. To
- start an application that uses the plugin, you can either set the
- environment variable \l QWS_DISPLAY and then start the
- application, or just start the application with the \c -display
- switch, as follows:
-
- \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 0
-
- The example driver also implements an animated transition effect
- for use when showing new windows or reshowing windows that have
- been minimized. To enable this transition effect, run the
- application with \c {-display ahigl:effects}.
-
- \section1 The Class Definitions
-
- The example comprises three main classes plus some helper classes.
- The three main classes are the plugin (QAhiGLScreenPlugin), which
- is defined in qscreenahiglplugin.cpp, the screen driver
- (QAhiGLScreen), which is defined in qscreenahigl_qws.h, and the
- window surface (QAhiGLWindowSurface), which is defined in
- qwindowsurface_ahigl_p.h. The "Ahi" prefix in these class names
- stands for \e {ATI Handheld Interface}. The example was written
- for the ATI Imageon 2380, but it can also be used as a template
- for other ATI handheld devices.
-
- \section2 The Plugin Class Definition
-
- The screen driver plugin is class QAhiGLScreenPlugin.
-
- \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 0
-
- QAhiGLScreenPlugin is derived from class QScreenDriverPlugin,
- which in turn is derived from QObject.
-
- \section2 The Screen Driver Class Definitions
-
- The screen driver classes are the public class QAhiGLScreen and
- its private implementation class QAhiGLScreenPrivate. QAhiGLScreen
- is derived from QGLScreen, which is derived from QScreen. If your
- screen driver will only do window compositions and display them,
- then you can derive your screen driver class directly from
- QScreen. But if your screen driver will do accelerated graphics
- rendering operations with the QOpenGLPaintEngine, or if it will
- handle instances of class QGLWidget, then you must derive your
- screen driver class from QGLScreen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.h 0
-
- All functions in the public API of class QAhiGLScreen are virtual
- functions declared in its base classes. hasOpenGL() is declared in
- QGLScreen. It simply returns true indicating our example screen
- driver does support OpenGL operations. The other functions in the
- public API are declared in QScreen. They are called by the
- \l{QWSServer}{Qt for Embedded Linux server} at the appropriate times.
-
- Note that class QScreen is a documented class but class QGLScreen
- is not. This is because the design of class QGLScreen is not yet
- final.
-
- The only data member in class QAhiGLScreen is a standard d_ptr,
- which points to an instance of the driver's private implementation
- class QAhiGLScreenPrivate. The driver's internal state is stored
- in the private class. Using the so-called d-pointer pattern allows
- you to make changes to the driver's internal design without
- breaking binary compatibility.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 0
-
- Class QAhiGLScreenPrivate is derived from QObject so that it can
- use the Qt signal/slot mechanism. QAhiGLScreen is not a QObject,
- so it can't use the signal/slot mechanism. Signals meant for our
- screen driver are received by slots in the private implementation
- class, in this case, windowEvent() and redrawScreen().
-
- \section2 The Window Surface Class Definitions
-
- The window surface classes are QAhiGLWindowSurface and its private
- implementation class QAhiGLWindowSurfacePrivate. We create class
- QAhiGLWindowSurface so the screen driver can use the OpenGL paint
- engine and the OpenGL widget, classes QOpenGLPaintEngine and
- QGLWidget. QAhiGLWindowSurface is derived from the more general
- OpenGL window surface class, QWSGLWindowSurface, which is derived
- from QWSWindowSurface.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl_p.h 0
-
- In addition to implementing the standard functionality required by
- any new subclass of QWSWindowSurface, QAhiGLWindowSurface also
- contains the textureId() function used by QAhiGLScreen.
-
- The same d-pointer pattern is used in this window surface class.
- The private implementation class is QAhiGLWindowSurfacePrivate. It
- allows making changes to the state variables of the window surface
- without breaking binary compatibility.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 0
-
- In this case, our private implementation class has no member
- functions except for its constructor. It contains only public data
- members which hold state information for the window surface.
-
- \section2 The Helper Classes
-
- The example screen driver maintains a static \l {QMap} {map} of
- all the \l {QWSWindow} {windows} it is showing on the screen.
- Each window is mapped to an instance of struct WindowInfo.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 2
-
- As each new window is created, an instance of struct WindowInfo is
- allocated and inserted into the window map. WindowInfo uses a
- GLuint to identify the OpenGL texture it creates for the window.
- Note that the example driver, in addition to drawing windows using
- OpenGL, also supports drawing windows in the normal way without
- OpenGL, but it uses an OpenGL texture for the rendering operations
- in either case. Top-level windows that are drawn without OpenGL
- are first rendered in the normal way into a shared memory segment,
- which is then converted to a OpenGL texture and drawn to the
- screen.
-
- To animate the window transition effect, WindowInfo uses an
- instance of the helper class ShowAnimation. The animation is
- created by the windowEvent() slot in QAhiGLScreenPrivate, whenever
- a \l {QWSServer::WindowEvent} {Show} window event is emitted by
- the \l {QWSServer} {window server}. The server emits this signal
- when a window is shown the first time and again later, when the
- window is reshown after having been minimized.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 1
-
- Class ShowAnimation is derived from the QTimeLine class, which is
- used for controlling animations. QTimeLine is a QObject, so
- ShowAnimation can use the Qt signal/slot mechanism. We will see
- how the timeline's \l {QTimeLine::valueChanged()} {valueChanged()}
- and \l {QTimeLine::finished()} {finished()} signals are used to
- control the animation and then destroy the instance of
- ShowAnimation, when the animation ends. The ShowAnimation
- constructor needs the pointer to the screen driver's private
- implementation class so it can set up these signal/slot
- connections.
-
- \section1 The Class Implementations
-
- \section2 The Plugin Class Implementation
-
- QAhiGLScreenPlugin is a straightforward derivation of
- QScreenDriverPlugin. It reimplements \l{QScreenDriverPlugin::}{keys()}
- and \l{QScreenDriverPlugin::}{create()}. They are
- called as needed by the \l{QWSServer}{Qt for Embedded Linux server.}
- Recall that the server detects that the ahigl screen driver has
- been requested, either by including "ahigl" in the value for the
- environment variable QWS_DISPLAY, or by running your application
- with a command line like the following.
-
- \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 1
-
- The server calls \l {QScreenDriverPlugin::} {keys()}, which
- returns a \l {QStringList} containing the singleton "ahigl"
- matching the requested screen driver and telling the server that
- it can use our example screen driver. The server then calls \l
- {QScreenDriverPlugin::} {create()}, which creates the instance of
- QAhiGLScreen.
-
- \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 1
-
- In the code snippet above, the macro Q_EXPORT_PLUGIN2 is used to export
- the plugin class, QAhiGLScreen, for the qahiglscreen plugin.
- Further information regarding plugins and how to create them
- can be found at \l{How to Create Qt Plugins}.
-
- \section2 The Screen Driver Class Implementations
-
- The plugin creates the singleton instance of QAhiGLScreen. The
- constructor is passed a \c displayId, which is used in the base
- class QGLScreen to identify the server that the screen driver is
- connected to. The constructor also creates its instance of
- QAhiGLScreenPrivate, which instantiates a QTimer. The timeout()
- signal of this timer is connected to the redrawScreen() slot so
- the timer can be used to limit the frequency of actual drawing
- operations in the hardware.
-
- The public API of class QAhiGLScreen consists of implementations
- of virtual functions declared in its base classes. The function
- hasOpenGL() is declared in base class QGLScreen. The others are
- declared in base class QScreen.
-
- The \l {QScreen::}{connect()} function is the first one called by
- the server after the screen driver is constructed. It initializes
- the QScreen data members to hardcoded values that describe the ATI
- screen. A better implementation would query the hardware for the
- corresponding values in its current state and use those. It asks
- whether the screen driver was started with the \c effects option
- and sets the \c doEffects flag accordingly.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 7
-
- The \l {QScreen::}{initDevice()} function is called by the server
- after \l {QScreen::}{connect()}. It uses EGL library functions to
- initialize the ATI hardware. Note that some data structures used
- in this example are specific to the EGL implementation used, e.g.,
- the DummyScreen structure.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 8
-
- Note the signal/slot connection at the bottom of initDevice(). We
- connect the server's QWSServer::windowEvent() signal to the
- windowEvent() slot in the screen driver's private implementation
- class. The windowEvent() slot handles three window events,
- QWSServer::Create, QWSServer::Destroy, and QWSServer::Show.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 5
-
- The function manages instances of the helper classes associated
- with each window. When a QWSServer::Create event occurs, it means
- a new top-level \l {QWSWindow} {window} has been created. In this
- case, an instance of helper class WindowInfo is created and
- inserted into the window map with the pointer to the new \l
- {QWSWindow} {window} as its key. When a QWSServer::Destroy event
- occurs, a window is being destroyed, and its mapping is removed
- from the window map. These two events are straightforward. The
- tricky bits happen when a QWSServer::Show event occurs. This case
- occurs when a window is shown for the first time and when it is
- reshown after having been minimized. If the window transition
- effect has been enabled, a new instance of the helper class
- ShowAnimation is created and stored in a QPointer in the window's
- instance of WindowInfo. The constructor of ShowAnimation
- automatically \l {QTimeLine::start()} {starts} the animation of
- the transition effect.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 3
-
- To ensure that a ShowAnimation is not deleted until its animation
- ends, the \l {QTimeLine::finished()} {finished()} signal is
- connected to the \l {QObject::deleteLater()} {deleteLater()} slot.
- When the animation ends, the finished() signal is emitted and the
- deleteLater() slot deletes the ShowAnimation. The key here is that
- the pointer to the ShowAnimation is stored in a QPointer in the
- WindowInfo class. This QPointer will also be notified when the
- ShowAnimation is deleted, so the QPointer in WindowInfo can null
- itself out, if and only if it is still pointing to the instance
- of ShowAnimation being deleted.
-
- The \l {QTimeLine::valueForTime()} {valueForTime()} function in
- QTimeLine is reimplemented in ShowAnimation to return time values
- that represent a curved path for the window transition effect.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 4
-
- valueForTime() is called internally, when the time interval it
- computed during the previous call has elapsed. If it computes a
- next time value that is different from the one computed
- previously, the \l {QTimeLine::valueChanged()} {valueChanged()}
- signal is emitted. The ShowAnimation constructor shown above
- connects this signal to the redrawScreen() slot in the screen
- driver's private implementation class. This is how the animation
- actually happens.
-
- The screen driver's implementation of \l {QScreen::}
- {exposeRegion()} is where the main work of the screen driver is
- meant to be done, i.e., updating the screen. It is called by the
- \l {QWSServer} {window system} to update a particular window's
- region of the screen. But note that it doesn't actually update the
- screen, i.e., it doesn't actually call redrawScreen() directly,
- but starts the updateTimer, which causes redrawScreen() to be
- called once for each updateTimer interval. This means that all
- calls to exposeRegion() during an updateTimer interval are handled
- by a single call to redrawScreen(). Thus updateTimer can be used
- to limit the frequency of screen updates.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 13
-
- The call to the private function invalidateTexture() destroys
- the window's existing texture (image). This ensures that a new
- texture will be created for the window, when redrawScreen() is
- eventually called.
-
- But there is a caveat to using updateTimer to limit the frequency
- of screen updates. When the driver's animated transition effect
- for new windows is enabled and a new window is being shown for the
- first time or reshown after having been minimized, an instance of
- ShowAnimation is created to run the animation. The valueChanged()
- signal of this ShowAnimation is also connected to the
- redrawScreen() slot, and QTimeLine, the base class of our
- ShowAnimation, uses its own, internal timer to limit the speed of
- the animation. This means that in the driver as currently written,
- if the window transition effect is enabled (i.e. if the plugin is
- started, with \c {-display ahigl:effects}), then redrawScreen()
- can be called both when the update timer times out and when the
- ShowAnimation timer times out, so the screen might get updated
- more often than the frequency established by the update timer.
- This may or may not be a bug, depending on your own hardware, if
- you use this example as a template for your own OpenGL driver.
-
- The screen driver's private function redrawScreen() constructs
- the window compositions. It is called only by the function of the
- same name in the screen driver's private implementation class.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 6
-
- Recall that this redrawScreen() in the private implementation
- class is a slot function connected to two signals, the \c
- timeout() signal of the updateTimer in the private implementation
- class, and the valueChanged() signal of the helper class
- ShowAnimation. Thus, the screen is only ever updated when a
- timeout of one of the two timers occurs. This is important for two
- reasons. First, the screen is meant to be updated no more than
- once per updateTimer interval. Second, however, if the animated
- window transition effect is requested, the screen might be updated
- more often than that, and this might be a bug if the hardware
- can't handle more frequent updates.
-
- The redrawScreen() in QAhiGLScreen begins by using standard
- OpenGL to fill the screen with the background color.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 10
-
- Next it iterates over the list of all \l {QWSWindow} {client
- windows} obtained from the \l {QWSServer} {server}, extracting
- from each window its instance of QWSWIndowSurface, then using that
- window surface to create an OpenGL texture, and finally calling
- the helper function drawWindow() to draw the texture on the
- screen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 11
-
- Note the call to glBindTexture() immediately before the call to
- drawWindow(). This call binds the identifer \c GL_TEXTURE_2D to
- the texture we have just created. This makes our texture
- accessible to functions in the OpenGL libraries. If you miss that
- point, digging into the internals of drawWindow() won't make much
- sense.
-
- Finally, the cursor is added to the window composition, and in the
- last statement, the whole thing is displayed on the screen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 12
-
- The call to \c drawWindow(win,progress), in addition to passing a
- pointer to the window to be redrawn, also passes the \c progress
- parameter obtained by calling \l {QTimeLine::currentValue()} on
- the window's instance of ShowAnimation. Recall that the current
- value of the timeline is updated internally by a timer local to
- the timeline, and the redrawScreen() slot is called whenever the
- current value changes. The progress value will only be used if
- the animated transition effect has been enabled. These extra calls
- of redrawScreen() may cause the screen to be updated more often
- than the rate determined by updateTimer. This must be taken
- into account, if you set your updateTimer to timeout at the
- maximum screen update frequency your hardware can handle.
-
- The drawWindow() function is not shown here and not explained
- further, but the call to drawWindow() is the entry point to a
- hierarchy of private helper functions that execute sequences of
- OpenGL and EGL library calls. The reader is assumed to be familiar
- enough with the OpenGL and EGL APIs to understand the code in
- these helper functions on his own. Besides drawWindow(), the list
- of these helper functions includes drawQuad(), drawQuadWavyFlag(),
- the two overloadings of drawQuad_helper() (used by drawQuad() and
- drawQuadWacyFlag()), and setRectCoords().
-
- Note the two different ways the window's texture can be created in
- redrawScreen(). If the window surface is an OpenGL window surface
- (QAhiGLWindowSurface described below), the texture is obtained
- from the window surface directly by calling its textureId()
- function. But when the window surface is not an OpenGL one, the
- static function createTexture() is called with the window
- surface's \l {QImage} {image} to copy that image into an OpenGL
- texture. This is done with the EGL functions glTexImage2D() and
- glTexSubImage2D(). createTexture() is another function that
- should be understandable for exsperienced OpenGL users, so it is
- not shown or explained further here.
-
- The two implementations of \l {QScreen::}{createSurface()} are for
- instantiating new window surfaces. The overloading with the widget
- parameter is called in the client.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 14
-
- If the parameter is an \l {QGLWidget} {OpenGL widget}, or, when it
- isn't an OpenGL widget but its size is no bigger than 256 x 256,
- we instantiate our subclass QAhiGLWindowSurface. Otherwise, we
- instantiate a QWSWindowSurface. The size contraint is a
- limitation of the OpenGL ES libraries we are using for our ATI
- device.
-
- Note the test at the top of the function asking if our application
- process is the \l {QApplication::GuiServer} {server}. We only
- create instances of QAhiGLWindowSurface if our client is in the
- server process. This is because of an implementation restriction
- required by the OpenGL library used in the example. They only
- support use of OpenGL in the server process. Hence a client can
- use the QAhiGLWindowSurface if the client is in the server
- process.
-
- The other overloading of createSurface() is called by the
- server to create a window surface that will hold a copy of a
- client side window surface.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 15
-
- This overloading accepts a QString parameter identifying the type
- of window surface to instantiate. QAhiGLWindowSurface is
- instantiated if the parameter is \c ahigl. Otherwise, a normal
- QWSWindowSurface is instantiated. The client's window surface
- communicates its image data to the server's window surface through
- shared memory.
-
- The implementation of \l {QScreen::}{setMode()}, is a stub in this
- example. It would normally reset the frame buffer's resolution.
- Its parameters are the \e width, \e height, and the bit \e depth
- for the frame buffer's new resolution. If you implement setMode()
- in your screen driver, remember that it must emit a signal to warn
- other applications to redraw their frame buffers with the new
- resolution. There is no significance to setMode() not being
- implemented in this example. It simply wasn't implemented.
- However, the stub had to be included because QScreen declares
- setMode() to be pure virtual.
-
- Before the application exits, the server will call \l {QScreen::}
- {shutdownDevice()} to release the hardware resources. This is also
- done using EGL library functions.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 9
-
- The server will also call \l {QScreen::}{disconnect()}, but this
- function is only a stub in this example.
-
- \section2 The window Surface Class Implementations
-
- QAhiGLScreen creates instances of QAhiGLWindowSurface in its two
- createSurface() functions, and there are two constructors for
- QAhiGLWindowSurface that correspond to these two versions of
- createSurface(). The constructor accepting a \l {QWidget} {widget}
- parameter is called by the client side version of createSurface(),
- and the constructor without the \l {QWidget} {widget} parameter is
- called by the server side version. There will be a window surface
- constructed on the server side for each one constructed on the
- client side.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 1
- \codeline
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 2
-
- The constructors create an instance of QAhiGLWindowSurfacePrivate,
- the private implementation class, which contains all the state
- variables for QAhiGLWindowSurface. The client side constructor
- also creates an instance of QWSGLPaintDevice, the OpenGL paint
- device, for return by \l {QWSWindowSurface::} {paintDevice()}.
- This ensures that all \l {QPainter}s used on this surface will use
- an OpenGL enabled QPaintEngine. It is a bit of jiggery pokery,
- which is required because \l {QWSWindowSurface::} {paintDevice()}
- is declared pure virtual. Normally, the client side constructor
- will be called with an \l {QGLWidget}{OpenGL widget}, which has
- its own \l {QWidget::} {paintEngine()} function that returns the
- global static OpenGL paint engine, but because the constructor
- also accepts a normal \l {QWidget}{widget}, it must be able to
- find the OpenGL paint engine in that case as well, so since \l
- {QWSWindowSurface::} {paintDevice()} must be implemented anyway,
- the constructor creates an instance of QWSGLPaintDevice, which can
- always return the global static pointer to QOpenGLPaintEngine.
-
- The OpenGL library implementation used for this example only
- supports one OpenGL context. This context is therefore shared
- among the single instance of QAhiGLScreen and all instances of
- QAhiGLWindowSurface. It is passed to both constructors.
-
- This example uses the OpenGL frame buffer object extension, which
- allows for accelerating OpenGL painting operations. Using this
- OpenGL extension, painting operations are performed in a frame
- buffer object, which QAhiGLScreen later uses to construct window
- compositions on the screen. Allocation of the frame buffer object
- is performed in \l {QWindowSurface::} {setGeometry()}. A safer way
- to use this extension would be to first test to see if the
- extension is supported by your OpenGL library, and use a different
- approach if it is not.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 3
-
- Since there can be several instances of the QAhiGLWindowSurface, we need
- to make sure that the correct framebuffer object is active before painting.
- This is done by reimplementing \l QWindowSurface::beginPaint():
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 4
-
- Finally we need to make sure that whenever a widget grows beyond the size
- supported by this driver (256 x 256), the surface is deleted and a new
- standard surface is created instead. This is handled by reimplementing
- \l QWSWindowSurface::isValid():
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 5
-*/
diff --git a/doc/src/getting-started/examples.qdoc b/doc/src/getting-started/examples.qdoc
index 2ad730a7..d72f816 100644
--- a/doc/src/getting-started/examples.qdoc
+++ b/doc/src/getting-started/examples.qdoc
@@ -1121,7 +1121,6 @@
\o \l{qws/svgalib}{Accelerated Graphics Driver}\raisedaster
\o \l{qws/dbscreen}{Double Buffered Graphics Driver}\raisedaster
\o \l{qws/mousecalibration}{Mouse Calibration}\raisedaster
- \o \l{qws/ahigl}{OpenGL for Embedded Systems}\raisedaster
\o \l{qws/simpledecoration}{Simple Decoration}\raisedaster
\endlist
*/
diff --git a/doc/src/snippets/code/doc_src_examples_ahigl.qdoc b/doc/src/snippets/code/doc_src_examples_ahigl.qdoc
deleted file mode 100644
index ccdce8b..0000000
--- a/doc/src/snippets/code/doc_src_examples_ahigl.qdoc
+++ /dev/null
@@ -1,49 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-myApplication -qws -display ahigl
-//! [0]
-
-
-//! [1]
-myApplication -qws -display ahigl
-//! [1]
diff --git a/examples/qws/ahigl/ahigl.pro b/examples/qws/ahigl/ahigl.pro
deleted file mode 100644
index 1ee8e6e..0000000
--- a/examples/qws/ahigl/ahigl.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-TEMPLATE = lib
-QT += opengl
-CONFIG += plugin
-
-TARGET = qahiglscreen
-
-target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
-INSTALLS += target
-
-HEADERS = qwindowsurface_ahigl_p.h \
- qscreenahigl_qws.h
-
-SOURCES = qwindowsurface_ahigl.cpp \
- qscreenahigl_qws.cpp \
- qscreenahiglplugin.cpp
-
diff --git a/examples/qws/ahigl/qscreenahigl_qws.cpp b/examples/qws/ahigl/qscreenahigl_qws.cpp
deleted file mode 100644
index 491d70f..0000000
--- a/examples/qws/ahigl/qscreenahigl_qws.cpp
+++ /dev/null
@@ -1,963 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscreenahigl_qws.h"
-#include "qwindowsurface_ahigl_p.h"
-
-#include <QWSServer>
-#include <QMap>
-#include <QTimer>
-#include <QTimeLine>
-
-#include <qwindowsystem_qws.h>
-#include <private/qwindowsurface_qws_p.h>
-#include <private/qfixed_p.h>
-
-#include <GLES/egl.h>
-#include <GLES/gl.h>
-#include <math.h>
-
-const int animationLength = 1500;
-const int frameSpan = 20;
-
-static GLuint createTexture(const QImage &img);
-
-class QAhiGLCursor : public QScreenCursor
-{
-public:
- QAhiGLCursor() : texture(0) {}
- ~QAhiGLCursor();
-
- void set(const QImage &image, int hotx, int hoty);
-
- GLuint texture;
-};
-
-QAhiGLCursor::~QAhiGLCursor()
-{
- if (texture)
- glDeleteTextures(1, &texture);
-}
-
-void QAhiGLCursor::set(const QImage &image, int hotx, int hoty)
-{
- if (texture)
- glDeleteTextures(1, &texture);
-
- if (image.isNull())
- texture = 0;
- else
- texture = createTexture(image.convertToFormat(QImage::Format_ARGB32));
-
- QScreenCursor::set(image, hotx, hoty);
-}
-
-
-/*!
- \class QAhiGLScreenPrivate
- The QAhiGLScreenPrivate class contains state information for class QAhiGLScreen.
-
- An instance of this class points to the owning instance of
- class QAhiGLScreen. This class uses a QTimer to limit the
- update frequency.
- */
-//! [0]
-class QAhiGLScreenPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- QAhiGLScreenPrivate(QAhiGLScreen *s);
-
-public slots:
- void windowEvent(QWSWindow *w, QWSServer::WindowEvent e);
- void redrawScreen();
-
-public:
- QAhiGLScreen *screen;
- QAhiGLCursor *cursor;
-
- EGLContext eglContext;
- EGLDisplay eglDisplay;
- EGLSurface eglSurface;
-
- QTimer updateTimer;
- bool doEffects;
-};
-//! [0]
-
-//! [1]
-class ShowAnimation : public QTimeLine
-{
-public:
- ShowAnimation(QAhiGLScreenPrivate *screen);
- qreal valueForTime(int msec);
-};
-//! [1]
-
-//! [2]
-struct WindowInfo
-{
- WindowInfo() : texture(0), animation(0) {}
-
- GLuint texture;
- QPointer<ShowAnimation> animation;
-};
-
-static QMap<QWSWindow*, WindowInfo*> windowMap;
-//! [2]
-
-/*!
- Constructs the animation for the transition effect used
- when the window associated with \a screen is displayed.
- */
-//! [3]
-ShowAnimation::ShowAnimation(QAhiGLScreenPrivate *screen)
- : QTimeLine(animationLength)
-{
- setUpdateInterval(frameSpan);
- connect(this, SIGNAL(valueChanged(qreal)), screen, SLOT(redrawScreen()));
- connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
- start();
-}
-//! [3]
-
-//! [4]
-qreal ShowAnimation::valueForTime(int msec)
-{
- const qreal t = msec / qreal(duration());
- return 3*t*t - 2*t*t*t;
-}
-//! [4]
-
-QAhiGLScreenPrivate::QAhiGLScreenPrivate(QAhiGLScreen *s)
- : screen(s), cursor(0), doEffects(false)
-{
- connect(&updateTimer, SIGNAL(timeout()), this, SLOT(redrawScreen()));
-}
-
-/*!
- This slot handles the \a event when the \l {QWSServer}
- {window server} emits a window event for the specified
- \a window.
-
- The \l {QWSServer::WindowEvent} {window events} handled
- are \c Create, \c Destroy, and \c Show. The \c Create
- event creates a new instance of \l {WindowInfo} and stores
- it in a window map to mark the creation of a new window.
- The \c Destroy event causes the \l {WindoInfo} instance
- to be removed from the map and destroyed.
-
- The \c Show event is the most interesting. If the user
- has started the application with -display ahigl:effects,
- then the \c Show event is handled by creating a small
- \l {ShowAnimation} {animation} for use when the window
- is first shown.
- */
-//! [5]
-void QAhiGLScreenPrivate::windowEvent(QWSWindow *window,
- QWSServer::WindowEvent event)
-{
- switch (event) {
- case QWSServer::Create:
- windowMap[window] = new WindowInfo;
- break;
- case QWSServer::Show:
- if (doEffects)
- windowMap[window]->animation = new ShowAnimation(this);
- break;
- case QWSServer::Destroy:
- delete windowMap[window];
- windowMap.remove(window);
- break;
- default:
- break;
- }
-}
-//! [5]
-
-/*!
- This function assumes the updateTimer is still counting down and stops it
- and then calls redrawScreen() in the public screen driver class QAhiGLScreen.
- */
-//! [6]
-void QAhiGLScreenPrivate::redrawScreen()
-{
- updateTimer.stop();
- screen->redrawScreen();
-}
-//! [6]
-
-/*!
- \class QAhiGLScreen
-
- \brief The QAhiGLScreen class is the screen driver for the ATI handheld device interface.
-
- QAhiGLScreen is implemented with the d-pointer pattern. That is,
- the only data member the class contains is a pointer called d_ptr,
- which means data pointer. It points to an instance of a private
- class called QAhiGLScreenPrivate, where all the screen driver's
- context data members are defined. The d-pointer pattern is used
- so that changes can be made to the screen driver's context data
- members without destroying the binary compatibility of the public
- screen driver class.
-
- The pure virtual functions found in the base class QScreen are
- listed below. All must have implementations in any screen driver
- class derived from QScreen. All are impemented in this example,
- except for setMode(), which has only been given a stub
- implementation to satisfy the compiler.
-
- bool connect(const QString & displaySpec);
- void disconnect();
- bool initDevice();
- void setMode(int width, int height, int depth);
-
- The stub implementation of setMode() is not meant to indicate
- setMode() can be ignored in your own screen driver class. It was
- simply decided not to provide a fully implemented screen driver
- class for the example, which would normally be tailored to your
- device's specific requirements.
-
- The base class QGLScreen has only one pure virtual function,
- hasOpenGL(), which must return true if your screen driver class
- supports OpenGL.
-
- QWSWindowSurface * createSurface(const QString & key) const
- QWSWindowSurface * createSurface(QWidget * widget) const
- void exposeRegion(QRegion region, int windowIndex)
-
- */
-
-/*!
- Constructs a new, ATI handheld device screen driver.
-
- The displayId identifies the QWS server to connect to.
- */
-QAhiGLScreen::QAhiGLScreen(int displayId) : QGLScreen(displayId)
-{
- d_ptr = new QAhiGLScreenPrivate(this);
- d_ptr->eglDisplay = EGL_NO_DISPLAY;
- d_ptr->eglSurface = EGL_NO_SURFACE;
-}
-
-/*!
- Destroys this ATI handheld device screen driver.
- */
-QAhiGLScreen::~QAhiGLScreen()
-{
- delete d_ptr;
-}
-
-/*!
- \reimp
- */
-//! [7]
-bool QAhiGLScreen::connect(const QString &displaySpec)
-{
- // Hardcoded values for this device
- w = 480;
- h = 640;
- dw = w;
- dh = h;
- d = 16;
-
- const int dpi = 120;
- physWidth = qRound(dw * 25.4 / dpi);
- physHeight = qRound(dh * 25.4 / dpi);
-
- if (displaySpec.section(':', 1, 1).contains("effects"))
- d_ptr->doEffects = true;
-
- return true;
-}
-//! [7]
-
-/*!
- \reimp
- */
-//! [8]
-bool QAhiGLScreen::initDevice()
-{
- EGLint version, subversion;
- EGLint attrs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_STENCIL_SIZE, 8, EGL_DEPTH_SIZE, 16,
- EGL_NONE };
- EGLint numConfig;
- EGLConfig eglConfig;
-
- d_ptr->eglDisplay = eglGetDisplay(0);
- if (d_ptr->eglDisplay == EGL_NO_DISPLAY) {
- qCritical("QAhiGLScreen::initDevice(): eglGetDisplay failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglInitialize(d_ptr->eglDisplay, &version, &subversion)) {
- qCritical("QAhiGLScreen::initDevice(): eglInitialize failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglChooseConfig(d_ptr->eglDisplay, attrs, &eglConfig, 1, &numConfig)) {
- qCritical("QAhiGLScreen::initDevice(): eglChooseConfig failed: 0x%x",
- eglGetError());
- return false;
- }
-
- static DummyScreen win = { w, h };
- d_ptr->eglSurface = eglCreateWindowSurface(d_ptr->eglDisplay, eglConfig,
- &win, 0);
- if (d_ptr->eglSurface == EGL_NO_SURFACE) {
- qCritical("QAhiGLScreen::initDevice(): eglCreateWindowSurface failed: 0x%x",
- eglGetError());
- return false;
- }
-
- d_ptr->eglContext = eglCreateContext(d_ptr->eglDisplay, eglConfig,
- EGL_NO_CONTEXT, 0);
- if (d_ptr->eglContext == EGL_NO_CONTEXT) {
- qCritical("QAhiGLScreen::initDevice(): eglCreateContext failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglMakeCurrent(d_ptr->eglDisplay, d_ptr->eglSurface, d_ptr->eglSurface, d_ptr->eglContext)) {
- qCritical("QAhiGLScreen::initDevice(): eglMakeCurrent failed: 0x%x",
- eglGetError());
- return false;
- }
-
- d_ptr->connect(QWSServer::instance(),
- SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
- SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
-
- d_ptr->cursor = new QAhiGLCursor;
- qt_screencursor = d_ptr->cursor;
-
- return true;
-}
-//! [8]
-
-/*!
- \reimp
- */
-//! [9]
-void QAhiGLScreen::shutdownDevice()
-{
- delete d_ptr->cursor;
- d_ptr->cursor = 0;
- qt_screencursor = 0;
-
- eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT);
- eglDestroyContext(d_ptr->eglDisplay, d_ptr->eglContext);
- eglDestroySurface(d_ptr->eglDisplay, d_ptr->eglSurface);
- eglTerminate(d_ptr->eglDisplay);
-}
-//! [9]
-
-/*!
- \reimp
-
- In this case, the reimplimentation does nothing. It is
- required because the function is declared as pure virtual
- in the base class QScreen.
- */
-void QAhiGLScreen::disconnect()
-{
-}
-
-/*
- This internal function rounds up to the next power of
- two. If v is already a power of two, that same value is
- returned.
- */
-inline static uint nextPowerOfTwo(uint v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- ++v;
- return v;
-}
-
-/*
- This internal function creates a texture from the image img
- and returns its texture identifier.
-
- The term "texture" is a graphics technology term that refers
- to a pixmap constructed from an image by adding extra points
- of contrast to the otherwise plain color image. The texture
- has a, well, texture, that the original image doesn't have.
- */
-static GLuint createTexture(const QImage &img)
-{
- if (img.isNull())
- return 0;
-
- int width = img.width();
- int height = img.height();
- int textureWidth;
- int textureHeight;
- GLuint texture;
-
- glGenTextures(1, &texture);
- textureWidth = nextPowerOfTwo(width);
- textureHeight = nextPowerOfTwo(height);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- switch (img.format()) {
- case QImage::Format_RGB16:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
- textureWidth,
- textureHeight, 0,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
-
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5, img.bits());
- break;
-
- case QImage::Format_ARGB32_Premultiplied:
- case QImage::Format_ARGB32:
- case QImage::Format_RGB32:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- textureWidth,
- textureHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, 0);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
- GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- break;
-
- default:
- break;
- }
-
- return texture;
-}
-
-/*
- A helper function used by QAhiGLScreen::drawQuad().
- */
-static void drawQuad_helper(GLshort *coords, GLfloat *texCoords)
-{
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, 0, coords);
- glEnable(GL_TEXTURE_2D);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- glDisable(GL_TEXTURE_2D);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-}
-
-/*
- A helper function used by QAhiGLScreen::drawQuadWavyFlag().
- */
-static void drawQuad_helper(GLshort *coords, GLfloat *texCoords,
- int arraySize, int numArrays)
-{
- glEnable(GL_TEXTURE_2D);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, 0, coords);
-
- for (int i = 0; i < numArrays-1; ++i)
- glDrawArrays(GL_TRIANGLE_STRIP, i*arraySize, arraySize);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisable(GL_TEXTURE_2D);
-}
-
-/*
- A convenience function used by QAhiGLScreen::drawQuad().
- */
-static void setRectCoords(GLshort *coords, QRect rect)
-{
- coords[0] = GLshort(rect.left());
- coords[1] = GLshort(rect.top());
-
- coords[2] = GLshort(rect.right());
- coords[3] = GLshort(rect.top());
-
- coords[4] = GLshort(rect.right());
- coords[5] = GLshort(rect.bottom());
-
- coords[6] = GLshort(rect.left());
- coords[7] = GLshort(rect.bottom());
-}
-
-/*!
- A helper function used by QAhiGLScreen::drawWindow() and
- QAhiGLScreen::redrawScreen().
- */
-void QAhiGLScreen::drawQuad(const QRect &textureGeometry,
- const QRect &subGeometry,
- const QRect &screenGeometry)
-{
- qreal textureWidth = qreal(nextPowerOfTwo(textureGeometry.width()));
- qreal textureHeight = qreal(nextPowerOfTwo(textureGeometry.height()));
-
- GLshort coords[8];
- setRectCoords(coords, screenGeometry);
-
- GLfloat texcoords[8];
- texcoords[0] = (subGeometry.left() - textureGeometry.left()) / textureWidth;
- texcoords[1] = (subGeometry.top() - textureGeometry.top()) / textureHeight;
-
- texcoords[2] = (subGeometry.right() - textureGeometry.left()) / textureWidth;
- texcoords[3] = (subGeometry.top() - textureGeometry.top()) / textureHeight;
-
- texcoords[4] = (subGeometry.right() - textureGeometry.left()) / textureWidth;
- texcoords[5] = (subGeometry.bottom() - textureGeometry.top()) / textureHeight;
-
- texcoords[6] = (subGeometry.left() - textureGeometry.left()) / textureWidth;
- texcoords[7] = (subGeometry.bottom() - textureGeometry.top()) / textureHeight;
-
- drawQuad_helper(coords, texcoords);
-}
-
-/*
- My own sine function.
- */
-static qreal mySin(QFixed radians)
-{
- const QFixed twoPI = QFixed::fromReal(2*M_PI);
-
- const int tableSize = 40;
- static int *table = 0;
-
- if (!table) {
- table = new int[tableSize];
- for (int i = 0; i < tableSize; ++i) {
- table[i] = qRound(sin(M_PI*(i*360.0/40.0)/180.0) * 16776960.0);
- }
- }
-
- QFixed tableLookup = radians*tableSize/twoPI;
- return table[tableLookup.truncate()%tableSize]/16776960.0;
-}
-
-/*
- My own cosine function.
- */
-static qreal myCos(QFixed radians)
-{
- const int twoPI = qRound(2*M_PI);
-
- const int tableSize = 40;
- static int *table = 0;
-
- if (!table) {
- table = new int[tableSize];
- for (int i = 0; i < tableSize; ++i) {
- table[i] = int(cos(M_PI*(i*360.0/40.0)/180.0) * 16776960.0);
- }
- }
-
- QFixed tableLookup = radians*tableSize/twoPI;
- return table[tableLookup.truncate()%tableSize]/16776960.0;
-}
-
-// number of grid cells in wavy flag tesselation in x- and y-direction
-const int subdivisions = 10;
-
-/*
- A helper function used by drawQuadWavyFlag(). It computes
- coordinates for grid cells for a wavy flag tesselation and
- stores them in the array called coords.
- */
-static void setFlagCoords(GLshort *coords,
- QRectF screenGeometry,
- int frameNum,
- qreal progress)
-{
- int coordIndex = 0;
- qreal waveHeight = 30.0*(1.0-progress);
- for (int j = 0; j < subdivisions-1; ++j) {
- for (int i = 0; i < subdivisions; ++i) {
- qreal c;
- c = screenGeometry.left()
- + (i * screenGeometry.width() / (subdivisions - 1))
- + waveHeight * qRound(mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0)))
- + waveHeight * qRound(myCos(QFixed::fromReal(M_PI * 20 * (frameNum + j) / 180.0)));
- coords[coordIndex++] = qRound(c);
- c = screenGeometry.top()
- + (j * screenGeometry.height() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + j) / 180.0));
- coords[coordIndex++] = qRound(c);
- c = screenGeometry.left() + (i * screenGeometry.width() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + (j+1)) / 180.0));
- coords[coordIndex++] = qRound(c);
-
- c = screenGeometry.top()
- + ((j + 1) * screenGeometry.height() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + (j + 1)) / 180.0));
- coords[coordIndex++] = qRound(c);
- }
- }
-}
-
-static void setFlagTexCoords(GLfloat *texcoords,
- const QRectF &subTexGeometry,
- const QRectF &textureGeometry,
- int textureWidth, int textureHeight)
-{
- qreal topLeftX = (subTexGeometry.left() - textureGeometry.left())/textureWidth;
- qreal topLeftY = (textureGeometry.height() - (subTexGeometry.top() - textureGeometry.top()))/textureHeight;
-
- qreal width = (subTexGeometry.right() - textureGeometry.left())/textureWidth - topLeftX;
- qreal height = (textureGeometry.height() - (subTexGeometry.bottom() - textureGeometry.top()))/textureHeight - topLeftY;
-
- int coordIndex = 0;
- qreal spacing = subdivisions - 1;
- for (int j = 0; j < subdivisions-1; ++j) {
- for (int i = 0; i < subdivisions; ++i) {
- texcoords[coordIndex++] = topLeftX + (i*width) / spacing;
- texcoords[coordIndex++] = topLeftY + (j*height) / spacing;
- texcoords[coordIndex++] = topLeftX + (i*width) / spacing;
- texcoords[coordIndex++] = topLeftY + ((j+1)*height) / spacing;
- }
- }
-}
-
-void QAhiGLScreen::drawQuadWavyFlag(const QRect &textureGeometry,
- const QRect &subTexGeometry,
- const QRect &screenGeometry,
- qreal progress)
-{
- const int textureWidth = nextPowerOfTwo(textureGeometry.width());
- const int textureHeight = nextPowerOfTwo(textureGeometry.height());
-
- static int frameNum = 0;
-
- GLshort coords[subdivisions*subdivisions*2*2];
- setFlagCoords(coords, screenGeometry, frameNum++, progress);
-
- GLfloat texcoords[subdivisions*subdivisions*2*2];
- setFlagTexCoords(texcoords, subTexGeometry, textureGeometry,
- textureWidth, textureHeight);
-
- drawQuad_helper(coords, texcoords, subdivisions*2, subdivisions);
-}
-
-void QAhiGLScreen::invalidateTexture(int windowIndex)
-{
- if (windowIndex < 0)
- return;
-
- QList<QWSWindow*> windows = QWSServer::instance()->clientWindows();
- if (windowIndex > windows.size() - 1)
- return;
-
- QWSWindow *win = windows.at(windowIndex);
- if (!win)
- return;
-
- WindowInfo *info = windowMap[win];
- if (info->texture) {
- glDeleteTextures(1, &info->texture);
- info->texture = 0;
- }
-}
-
-void QAhiGLScreen::drawWindow(QWSWindow *win, qreal progress)
-{
- const QRect screenRect = win->allocatedRegion().boundingRect();
- QRect drawRect = screenRect;
-
- glColor4f(1.0, 1.0, 1.0, progress);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
-
- QWSWindowSurface *surface = win->windowSurface();
- if (!surface)
- return;
-
- if (progress >= 1.0) {
- if (surface->key() == QLatin1String("ahigl")) {
- drawRect.setCoords(drawRect.left(), drawRect.bottom(),
- drawRect.right(), drawRect.top());
- }
- drawQuad(win->requestedRegion().boundingRect(), screenRect, drawRect);
- return;
- }
-
- const int dx = qRound((1 - progress) * drawRect.width() / 2);
- const int dy = qRound((1 - progress) * drawRect.height() / 2);
-
- drawRect.adjust(dx, dy, -dx, -dy);
-
- if (surface->key() != QLatin1String("ahigl")) {
- drawRect.setCoords(drawRect.left(), drawRect.bottom(),
- drawRect.right(), drawRect.top());
- }
-
- drawQuadWavyFlag(win->requestedRegion().boundingRect(), screenRect,
- drawRect, progress);
-}
-
-/*!
- The window compositions are constructed here.
- */
-//! [10]
-void QAhiGLScreen::redrawScreen()
-{
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, 0);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrthof(0, w, h, 0, -999999, 999999);
- glViewport(0, 0, w, h);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- // Fill background color
-
- QColor bgColor = QWSServer::instance()->backgroundBrush().color();
- glClearColor(bgColor.redF(), bgColor.greenF(),
- bgColor.blueF(), bgColor.alphaF());
- glClear(GL_COLOR_BUFFER_BIT);
-//! [10]
-
- // Draw all windows
-
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_STENCIL_TEST);
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ZERO);
- glDisable(GL_ALPHA_TEST);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-
-//! [11]
- QList<QWSWindow*> windows = QWSServer::instance()->clientWindows();
- for (int i = windows.size() - 1; i >= 0; --i) {
- QWSWindow *win = windows.at(i);
- QWSWindowSurface *surface = win->windowSurface();
- if (!surface)
- continue;
-
- WindowInfo *info = windowMap[win];
-
- if (!info->texture) {
- if (surface->key() == QLatin1String("ahigl"))
- info->texture = static_cast<QAhiGLWindowSurface*>(surface)->textureId();
- else
- info->texture = createTexture(surface->image());
- }
- qreal progress;
- if (info->animation)
- progress = info->animation->currentValue();
- else
- progress = 1.0;
-
- glBindTexture(GL_TEXTURE_2D, info->texture);
- drawWindow(win, progress);
- } // for i
-//! [11] //! [12]
-
- // Draw cursor
-
- const QAhiGLCursor *cursor = d_ptr->cursor;
- if (cursor->texture) {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glBindTexture(GL_TEXTURE_2D, d_ptr->cursor->texture);
- drawQuad(cursor->boundingRect(), cursor->boundingRect(),
- cursor->boundingRect());
- }
-
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
-
- eglSwapBuffers(d_ptr->eglDisplay, d_ptr->eglSurface);
-}
-//! [12]
-
-/*!
- \reimp
-
- */
-//! [13]
-void QAhiGLScreen::exposeRegion(QRegion r, int windowIndex)
-{
- if ((r & region()).isEmpty())
- return;
-
- invalidateTexture(windowIndex);
-
- if (!d_ptr->updateTimer.isActive())
- d_ptr->updateTimer.start(frameSpan);
-}
-//! [13]
-
-/*!
- \reimp
-
- This overloading of createSurface() is called on the client side to
- create a window surface for a new window. If the \a widget is a
- QGLWidget, or if the widget's width and height are both less than or
- equal to 256, it creates an instance of QAhiGLWindowSurface.
- Otherwise, it calls QScreen::createSurface() to create a non-OpenGL
- window surface. The pointer to the new window surface is returned.
-
- Note that this function first asks whether this application is the
- server, and it only creates an instance of QAhiGLWindowSurface if
- the answer is yes. What this means is we only let the server have
- access to the OpenGL hardware, because of an implementation
- restyriction in the OpenGL libraries we are using. Thus only clients
- that are in the server process get to create OpenGL window surfaces.
- */
-//! [14]
-QWSWindowSurface* QAhiGLScreen::createSurface(QWidget *widget) const
-{
- if (QApplication::type() == QApplication::GuiServer) {
- if (qobject_cast<QGLWidget*>(widget)) {
- return new QAhiGLWindowSurface(widget,
- d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
-
- const QRect rect = widget->frameGeometry();
- if (rect.width() <= 256 && rect.height() <= 256) {
- return new QAhiGLWindowSurface(widget,
- d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
- }
-
- return QScreen::createSurface(widget);
-}
-//! [14]
-
-/*!
- \reimp
-
- This overloading of createSurface() is called on the server side
- to manage a window surface corresponding to a window surface
- already created on the client side.
-
- If the \a key is "ahigl", create an instance of QAhiGLWindowSurface
- and return it. Otherwise, call QScreen::createSurface() and return
- the window surface it creates.
-
- See QScreen::createSurface().
- */
-//! [15]
-QWSWindowSurface* QAhiGLScreen::createSurface(const QString &key) const
-{
- if (key == QLatin1String("ahigl")) {
- return new QAhiGLWindowSurface(d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
-
- return QScreen::createSurface(key);
-}
-//! [15]
-
-/*!
- This function would normally reset the frame buffer resolution
- according to \a width, \a height, and the bit \a depth. It would
- then notify other applications that their frame buffer size had
- changed so they could redraw. The function is a no-op in this
- example, which means the example screen driver can't change its
- frame buffer resolution. There is no significance to that in the
- example. You would normally implement setMode() in an OpenGL
- screen driver. This no-op reimplementation is required here
- because setMode() in QScreen is a pure virtual function.
-
- See QScreen::setMode()
- */
-void QAhiGLScreen::setMode(int width, int height, int depth)
-{
- Q_UNUSED(width);
- Q_UNUSED(height);
- Q_UNUSED(depth);
-}
-
-/*!
- This function would normally be reimplemented to prevent the
- screen driver from updating the screen if \a on is true. It is a
- no-op in this example, which means the screen driver can always
- update the screen.
-
- See QScreen::blank().
- */
-void QAhiGLScreen::blank(bool on)
-{
- Q_UNUSED(on);
-}
-
-/*!
- This function always returns true, since the purpose of
- this screen driver class is to implement an OpenGL ES
- screen driver. In some other class designed to handle both
- OpenGL and non-OpenGL graphics, it might test the system to
- determine whether OpenGL graphics are supported and return
- true or false accordingly.
- */
-bool QAhiGLScreen::hasOpenGL()
-{
- return true;
-}
-
-#include "qscreenahigl_qws.moc"
diff --git a/examples/qws/ahigl/qscreenahigl_qws.h b/examples/qws/ahigl/qscreenahigl_qws.h
deleted file mode 100644
index 2dc3dae..0000000
--- a/examples/qws/ahigl/qscreenahigl_qws.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QAHIGLSCREEN_H
-#define QAHIGLSCREEN_H
-
-#include <QGLScreen>
-#include <QWSServer>
-
-QT_BEGIN_NAMESPACE
-class QAhiGLScreenPrivate;
-QT_END_NAMESPACE
-
-//! [0]
-class QAhiGLScreen : public QGLScreen
-{
-public:
- QAhiGLScreen(int displayId);
- virtual ~QAhiGLScreen();
-
- bool initDevice();
- bool connect(const QString &displaySpec);
- void disconnect();
- void shutdownDevice();
-
- void setMode(int width, int height, int depth);
- void blank(bool on);
-
- void exposeRegion(QRegion r, int changing);
-
- QWSWindowSurface* createSurface(QWidget *widget) const;
- QWSWindowSurface* createSurface(const QString &key) const;
-
- bool hasOpenGL();
-
-private:
- void invalidateTexture(int windowIndex);
- void redrawScreen();
- void drawWindow(QWSWindow *win, qreal progress);
- void drawQuad(const QRect &textureGeometry,
- const QRect &subGeometry,
- const QRect &screenGeometry);
- void drawQuadWavyFlag(const QRect &textureGeometry,
- const QRect &subTexGeometry,
- const QRect &screenGeometry,
- float progress);
-
- QAhiGLScreenPrivate *d_ptr;
- friend class QAhiGLScreenPrivate;
-};
-//! [0]
-
-#endif // QAHIGLSCREEN_H
diff --git a/examples/qws/ahigl/qscreenahiglplugin.cpp b/examples/qws/ahigl/qscreenahiglplugin.cpp
deleted file mode 100644
index 4fd1241..0000000
--- a/examples/qws/ahigl/qscreenahiglplugin.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscreenahigl_qws.h"
-
-#include <QScreenDriverPlugin>
-#include <QStringList>
-
-//! [0]
-class QAhiGLScreenPlugin : public QScreenDriverPlugin
-{
-public:
- QAhiGLScreenPlugin();
-
- QStringList keys() const;
- QScreen *create(const QString&, int displayId);
-};
-//! [0]
-
-/*!
- \class QAhiGLScreenPlugin
- \brief The QAhiGLScreenPlugin class is the plugin for the ATI handheld device graphics driver.
-
- QAhiGLScreenPlugin inherits QScreenDriverPlugin. See
- \l{How to Create Qt Plugins} for details.
- */
-
-/*!
- This is the default constructor.
- */
-QAhiGLScreenPlugin::QAhiGLScreenPlugin()
- : QScreenDriverPlugin()
-{
-}
-
-/*!
- Returns a string list containing the string "ahigl" which
- is the only screen driver supported by this plugin.
- */
-QStringList QAhiGLScreenPlugin::keys() const
-{
- return (QStringList() << "ahigl");
-}
-
-/*!
- Creates a screen driver of the kind specified by \a driver.
- The \a displayId identifies the Qt for Embedded Linux server to connect to.
- */
-QScreen* QAhiGLScreenPlugin::create(const QString& driver, int displayId)
-{
- if (driver.toLower() != "ahigl")
- return 0;
-
- return new QAhiGLScreen(displayId);
-}
-
-//! [1]
-Q_EXPORT_PLUGIN2(qahiglscreen, QAhiGLScreenPlugin)
-//! [1]
diff --git a/examples/qws/ahigl/qwindowsurface_ahigl.cpp b/examples/qws/ahigl/qwindowsurface_ahigl.cpp
deleted file mode 100644
index 3466a27..0000000
--- a/examples/qws/ahigl/qwindowsurface_ahigl.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwindowsurface_ahigl_p.h"
-#include "qscreenahigl_qws.h"
-
-#include <qwsdisplay_qws.h>
-#include <QtGui/QPaintDevice>
-#include <QtGui/QWidget>
-#include <QtOpenGL/private/qglpaintdevice_qws_p.h>
-#include <QtOpenGL/private/qgl_p.h>
-#include <GLES/gl.h>
-
-/*!
- \class QAhiGLWindowSurfacePrivate
- \internal
-
- \brief The QAhiGLWindowSurfacePrivate class is the private implementation
- class for class QAhiGLWindowSurface.
-
- This class contains only state variables.
- */
-//! [0]
-class QAhiGLWindowSurfacePrivate
-{
-public:
- QAhiGLWindowSurfacePrivate(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext);
-
- QPaintDevice *device;
-
- int textureWidth;
- int textureHeight;
-
- GLuint texture;
- GLuint frameBufferObject;
- GLuint depthbuf;
-
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
-};
-//! [0]
-
-/*!
- The construct just sets statwe variables using the ones
- provided.
- */
-QAhiGLWindowSurfacePrivate::QAhiGLWindowSurfacePrivate(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
- : texture(0), frameBufferObject(0), depthbuf(0), display(eglDisplay),
- surface(eglSurface), context(eglContext)
-{
-}
-
-inline static int nextPowerOfTwo(uint v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- ++v;
- return v;
-}
-
-/*!
- \class QAhiGLWindowSurface
- \preliminary
- \internal
-
- \brief The QAhiGLWindowSurface class provides the drawing area
- for top-level windows using OpenGL for drawing on an ATI handheld
- device.
-
- In \l{Qt for Embedded Linux}, the default behavior for each client is to
- render widgets into an area of memory. The server then displays
- the contents of that memory on the screen. For ATI handheld
- devices using OpenGL, QAhiGLWindowSurface is the window surface
- class that allocates and manages the memory areas in the clients
- and the server.
-
- When a screen update is required, the server runs through all the
- top-level windows that intersect with the region being updated,
- ensuring that the clients have updated their window surfaces. Then
- the server uses the screen driver to copy the contents of the
- affected window surfaces into its composition and then display the
- composition on the screen.
-
- \tableofcontents
-
- \section1 Pure Virtual Functions
-
- There are two window surface instances for each top-level window.
- One is used by the application when drawing a window, and the
- other is used by the server application to make its copy for
- building a window composition to send to the screen.
-
- The key() function is implemented to uniquely identify this window
- surface class as "ahigl", and the isValid() function is
- implemented to determine whether the associated window is still
- acceptable for representation by this window surface class. It
- must either be a window using an \l {QGLWidget} {OpenGL widget},
- or it must be a window whose frame is no bigger than 256 x 256.
-
- The setGeometry() function is implemented to change the geometry
- of the frame buffer whenever the geometry of the associated
- top-level window changes. The image() function is called by the
- window system when building window compositions to return an image
- of the top-level window.
-
- The paintDevice() function is implemented to return the appropriate
- paint device.
-
- \section1 Virtual Functions
-
- When painting onto the surface, the window system will always call
- the beginPaint() function before any painting operations are
- performed. It ensures that the correct frame buffer will be used
- by the OpenGL library for painting operations. Likewise, the
- endPaint() function is automatically called when the painting is
- done, but it isn't implemented for this example.
-*/
-
-/*!
- This is the client side constructor.
- */
-//! [1]
-QAhiGLWindowSurface::QAhiGLWindowSurface(QWidget *widget,
- EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
- : QWSGLWindowSurface(widget)
-{
- d_ptr = new QAhiGLWindowSurfacePrivate(eglDisplay, eglSurface, eglContext);
- d_ptr->device = new QWSGLPaintDevice(widget);
-
- setSurfaceFlags(QWSWindowSurface::Buffered);
-}
-//! [1]
-
-/*!
- This is the server side constructor.
- */
-//! [2]
-QAhiGLWindowSurface::QAhiGLWindowSurface(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
-{
- d_ptr = new QAhiGLWindowSurfacePrivate(eglDisplay, eglSurface, eglContext);
- setSurfaceFlags(QWSWindowSurface::Buffered);
-}
-//! [2]
-
-/*!
- The destructor deletes the OpenGL structures held by the
- private implementation class, and then it deletes the
- private implementation class.
- */
-QAhiGLWindowSurface::~QAhiGLWindowSurface()
-{
- if (d_ptr->texture)
- glDeleteTextures(1, &d_ptr->texture);
- if (d_ptr->depthbuf)
- glDeleteRenderbuffersOES(1, &d_ptr->depthbuf);
- if (d_ptr->frameBufferObject)
- glDeleteFramebuffersOES(1, &d_ptr->frameBufferObject);
-
- delete d_ptr;
-}
-
-/*!
- This function changes the geometry of the frame buffer
- to the geometry in \a rect. It is called whenever the
- geometry of the associated top-level window changes. It
- also rebuilds the window surface's texture and binds
- the OpenGL identifier to the texture for use by the
- OpenGL library.
- */
-//! [3]
-void QAhiGLWindowSurface::setGeometry(const QRect &rect)
-{
- QSize size = rect.size();
-
- const QWidget *w = window();
- if (w && !w->mask().isEmpty()) {
- const QRegion region = w->mask()
- & rect.translated(-w->geometry().topLeft());
- size = region.boundingRect().size();
- }
-
- if (geometry().size() != size) {
-
- // Driver specific limitations:
- // FBO maximimum size of 256x256
- // Depth buffer required
-
- d_ptr->textureWidth = qMin(256, nextPowerOfTwo(size.width()));
- d_ptr->textureHeight = qMin(256, nextPowerOfTwo(size.height()));
-
- glGenTextures(1, &d_ptr->texture);
- glBindTexture(GL_TEXTURE_2D, d_ptr->texture);
-
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- const int bufSize = d_ptr->textureWidth * d_ptr->textureHeight * 2;
- GLshort buf[bufSize];
- memset(buf, 0, sizeof(GLshort) * bufSize);
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, d_ptr->textureWidth,
- d_ptr->textureHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, buf);
-
- glGenRenderbuffersOES(1, &d_ptr->depthbuf);
- glBindRenderbufferOES(GL_RENDERBUFFER_EXT, d_ptr->depthbuf);
- glRenderbufferStorageOES(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16,
- d_ptr->textureWidth, d_ptr->textureHeight);
-
- glGenFramebuffersOES(1, &d_ptr->frameBufferObject);
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, d_ptr->frameBufferObject);
-
- glFramebufferTexture2DOES(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, d_ptr->texture, 0);
- glFramebufferRenderbufferOES(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, d_ptr->depthbuf);
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, 0);
- }
-
- QWSGLWindowSurface::setGeometry(rect);
-}
-//! [3]
-
-/*!
- Returns the window surface's texture as a QByteArray.
- */
-QByteArray QAhiGLWindowSurface::permanentState() const
-{
- QByteArray array;
- array.resize(sizeof(GLuint));
-
- char *ptr = array.data();
- reinterpret_cast<GLuint*>(ptr)[0] = textureId();
- return array;
-}
-
-/*!
- Sets the window surface's texture to \a data.
- */
-void QAhiGLWindowSurface::setPermanentState(const QByteArray &data)
-{
- const char *ptr = data.constData();
- d_ptr->texture = reinterpret_cast<const GLuint*>(ptr)[0];
-}
-
-/*!
- Returns the paint device being used for this window surface.
- */
-QPaintDevice *QAhiGLWindowSurface::paintDevice()
-{
- return d_ptr->device;
-}
-
-/*!
- Returns the window surface's texture.
- */
-GLuint QAhiGLWindowSurface::textureId() const
-{
- return d_ptr->texture;
-}
-
-/*!
- The \l {QWSServer} {window system} always calls this function
- before any painting operations begin for this window surface.
- It ensures that the correct frame buffer will be used by the
- OpenGL library for painting operations.
- */
-//! [4]
-void QAhiGLWindowSurface::beginPaint(const QRegion &region)
-{
- QWSGLWindowSurface::beginPaint(region);
-
- if (d_ptr->frameBufferObject)
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, d_ptr->frameBufferObject);
-}
-//! [4]
-
-/*!
- This function returns true if the window associated with
- this window surface can still rendered using this window
- surface class. Either the window's top-level widget must
- be an \l {QGLWidget} {OpenGL widget}, or the window's
- frame must be no bigger than 256 x 256.
- */
-//! [5]
-bool QAhiGLWindowSurface::isValid() const
-{
- if (!qobject_cast<QGLWidget*>(window())) {
- const QRect r = window()->frameGeometry();
- if (r.width() > 256 || r.height() > 256)
- return false;
- }
- return true;
-}
-//! [5]
diff --git a/examples/qws/ahigl/qwindowsurface_ahigl_p.h b/examples/qws/ahigl/qwindowsurface_ahigl_p.h
deleted file mode 100644
index bcb0509..0000000
--- a/examples/qws/ahigl/qwindowsurface_ahigl_p.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWINDOWSURFACE_AHIGL_P_H
-#define QWINDOWSURFACE_AHIGL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the QAhiGLWindowSurface class. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtOpenGL/private/qglwindowsurface_qws_p.h>
-#include <GLES/gl.h>
-#include <GLES/egl.h>
-
-QT_BEGIN_NAMESPACE
-class QAhiGLWindowSurfacePrivate;
-QT_END_NAMESPACE
-
-//! [0]
-class QAhiGLWindowSurface : public QWSGLWindowSurface
-{
-public:
- QAhiGLWindowSurface(QWidget *widget, EGLDisplay eglDisplay,
- EGLSurface eglSurface, EGLContext eglContext);
- QAhiGLWindowSurface(EGLDisplay eglDisplay, EGLSurface eglSurface,
- EGLContext eglContext);
- ~QAhiGLWindowSurface();
-
- QString key() const { return QLatin1String("ahigl"); }
- void setGeometry(const QRect &rect);
- QPaintDevice *paintDevice();
- void beginPaint(const QRegion &region);
- bool isValid() const;
-
- QByteArray permanentState() const;
- void setPermanentState(const QByteArray &);
-
- QImage image() const { return QImage(); }
-
- GLuint textureId() const;
-
-private:
- QAhiGLWindowSurfacePrivate *d_ptr;
-};
-//! [0]
-
-#endif // QWINDOWSURFACE_AHIGL_P_H