Bug 560537 - Implement Top level GL layer manager for Qt widget port. r=vladimir.

This commit is contained in:
Oleg Romashin 2010-06-24 06:07:57 -04:00
Родитель 4aae8c0391
Коммит 83dbc52ba3
3 изменённых файлов: 97 добавлений и 25 удалений

Просмотреть файл

@ -4,7 +4,6 @@
#include <QtGui/QApplication>
#include <QtGui/QGraphicsView>
#include <QtGui/QGraphicsWidget>
#include <QtOpenGL/QGLWidget>
#include "nsIWidget.h"
#include "prenv.h"
@ -148,12 +147,16 @@ public:
MozQGraphicsView(MozQWidget* aTopLevel, QWidget * aParent = nsnull)
: QGraphicsView (new QGraphicsScene(), aParent)
, mEventHandler(this, aTopLevel)
, mTopLevelWidget(aTopLevel)
{
if (PR_GetEnv("MOZ_QT_GL"))
setViewport(new QGLWidget());
scene()->addItem(aTopLevel);
}
MozQWidget* GetTopLevelWidget()
{
return mTopLevelWidget;
}
protected:
virtual bool event(QEvent* aEvent)
@ -176,6 +179,7 @@ protected:
private:
MozQGraphicsViewEvents mEventHandler;
MozQWidget* mTopLevelWidget;
};
#endif

Просмотреть файл

@ -99,6 +99,10 @@
#include "nsIDOMSimpleGestureEvent.h" //Gesture support
#include <QtOpenGL/QGLWidget>
#include "Layers.h"
#include "LayerManagerOGL.h"
// imported in nsWidgetFactory.cpp
PRBool gDisableNativeTheme = PR_FALSE;
@ -758,9 +762,12 @@ nsWindow::GetNativeData(PRUint32 aDataType)
break;
}
case NS_NATIVE_SHELLWIDGET:
return (void *) GetViewWidget();
case NS_NATIVE_SHELLWIDGET: {
QWidget* widget = nsnull;
if (mWidget && mWidget->scene())
widget = mWidget->scene()->views()[0]->viewport();
return (void *) widget;
}
default:
NS_WARNING("nsWindow::GetNativeData called with bad value");
return nsnull;
@ -955,20 +962,6 @@ nsWindow::GetAttention(PRInt32 aCycleCount)
return NS_ERROR_NOT_IMPLEMENTED;
}
#ifdef MOZ_X11
static already_AddRefed<gfxASurface>
GetSurfaceForQPixmap(QPixmap* aDrawable)
{
gfxASurface* result =
new gfxXlibSurface(aDrawable->x11Info().display(),
aDrawable->handle(),
(Visual*)aDrawable->x11Info().visual(),
gfxIntSize(aDrawable->size().width(), aDrawable->size().height()));
NS_IF_ADDREF(result);
return result;
}
#endif
nsEventStatus
nsWindow::DoPaint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption)
{
@ -993,6 +986,19 @@ nsWindow::DoPaint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption)
if (!mDirtyScrollArea.isEmpty())
mDirtyScrollArea = QRegion();
nsEventStatus status;
nsIntRect rect(r.x(), r.y(), r.width(), r.height());
if (GetLayerManager()->GetBackendType() == LayerManager::LAYERS_OPENGL) {
nsPaintEvent event(PR_TRUE, NS_PAINT, this);
event.refPoint.x = r.x();
event.refPoint.y = r.y();
event.region = nsIntRegion(rect);
static_cast<mozilla::layers::LayerManagerOGL*>(GetLayerManager())->
SetClippingRegion(event.region);
return DispatchEvent(&event);
}
gfxQtPlatform::RenderMode renderMode = gfxQtPlatform::GetPlatform()->GetRenderMode();
int depth = aPainter->device()->depth();
@ -1018,13 +1024,9 @@ nsWindow::DoPaint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption)
ctx->Translate(gfxPoint(-r.x(), -r.y()));
nsPaintEvent event(PR_TRUE, NS_PAINT, this);
nsIntRect rect(r.x(), r.y(), r.width(), r.height());
event.refPoint.x = r.x();
event.refPoint.y = r.y();
event.region = nsIntRegion(rect);
nsEventStatus status;
{
AutoLayerManagerSetup setupLayerManager(this, ctx);
status = DispatchEvent(&event);
@ -1844,7 +1846,19 @@ nsWindow::GetHasTransparentBackground(PRBool& aTransparent)
void
nsWindow::GetToplevelWidget(MozQWidget **aWidget)
{
*aWidget = mWidget;
MozQGraphicsView *view = static_cast<MozQGraphicsView*>(GetViewWidget());
if (view)
*aWidget = view->GetTopLevelWidget();
}
nsWindow *
nsWindow::GetTopLevelNsWindow()
{
MozQWidget *widget = nsnull;
GetToplevelWidget(&widget);
if (widget)
return widget->getReceiver();
return nsnull;
}
void *
@ -2109,6 +2123,55 @@ nsWindow::createQWidget(MozQWidget *parent, nsWidgetInitData *aInitData)
return widget;
}
PRBool
nsWindow::IsAcceleratedQView(QGraphicsView *view)
{
if (view && view->viewport()) {
QPaintEngine::Type type = view->viewport()->paintEngine()->type();
return (type == QPaintEngine::OpenGL || type == QPaintEngine::OpenGL2);
}
return PR_FALSE;
}
NS_IMETHODIMP
nsWindow::SetAcceleratedRendering(PRBool aEnabled)
{
if (mUseAcceleratedRendering == aEnabled)
return NS_OK;
mUseAcceleratedRendering = aEnabled;
mLayerManager = NULL;
QGraphicsView* view = static_cast<QGraphicsView*>(GetViewWidget());
if (view) {
if (aEnabled && !IsAcceleratedQView(view))
view->setViewport(new QGLWidget());
if (!aEnabled && IsAcceleratedQView(view))
view->setViewport(new QWidget());
view->viewport()->setAttribute(Qt::WA_PaintOnScreen, aEnabled);
view->viewport()->setAttribute(Qt::WA_NoSystemBackground, aEnabled);
}
return NS_OK;
}
mozilla::layers::LayerManager*
nsWindow::GetLayerManager()
{
nsWindow *topWindow = GetTopLevelNsWindow();
if (!topWindow)
return nsBaseWidget::GetLayerManager();
if (mUseAcceleratedRendering != topWindow->GetAcceleratedRendering()
&& IsAcceleratedQView(static_cast<QGraphicsView*>(GetViewWidget()))) {
mLayerManager = NULL;
mUseAcceleratedRendering = topWindow->GetAcceleratedRendering();
}
return nsBaseWidget::GetLayerManager();
}
// return the gfxASurface for rendering to this widget
gfxASurface*
nsWindow::GetThebesSurface()

Просмотреть файл

@ -97,6 +97,7 @@ extern PRLogModuleInfo *gWidgetDrawLog;
#endif /* MOZ_LOGGING */
class QEvent;
class QGraphicsView;
class MozQWidget;
@ -191,6 +192,7 @@ public:
NS_IMETHODIMP SetIMEEnabled(PRUint32 aState);
NS_IMETHODIMP GetIMEEnabled(PRUint32* aState);
NS_IMETHOD SetAcceleratedRendering(PRBool aEnabled);
//
// utility methods
@ -303,10 +305,12 @@ protected:
void ThemeChanged(void);
virtual LayerManager* GetLayerManager();
gfxASurface* GetThebesSurface();
private:
void GetToplevelWidget(MozQWidget **aWidget);
nsWindow* GetTopLevelNsWindow();
void* SetupPluginPort(void);
nsresult SetWindowIconList(const nsTArray<nsCString> &aIconList);
void SetDefaultIcon(void);
@ -315,6 +319,7 @@ private:
MozQWidget* createQWidget(MozQWidget *parent, nsWidgetInitData *aInitData);
QWidget* GetViewWidget();
PRBool IsAcceleratedQView(QGraphicsView* aView);
MozQWidget* mWidget;