зеркало из https://github.com/mozilla/gecko-dev.git
Bug 560537 - Implement Top level GL layer manager for Qt widget port. r=vladimir.
This commit is contained in:
Родитель
4aae8c0391
Коммит
83dbc52ba3
|
@ -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;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче