[Libreoffice-commits] core.git: Branch 'private/moggi/build-test' - 86 commits - comphelper/Library_comphelper.mk comphelper/qa comphelper/source config_host.mk.in configure.ac cui/source cui/uiconfig editeng/CppunitTest_editeng_core.mk editeng/CustomTarget_generated.mk editeng/Library_editeng.mk editeng/Module_editeng.mk editeng/source extensions/Executable_pluginapp.bin.mk extensions/source external/lcms2 filter/source framework/inc framework/source .gitignore i18nlangtag/source i18npool/source icon-themes/galaxy icon-themes/sifr icon-themes/tango include/comphelper include/editeng include/svx include/vcl include/xmloff Makefile.in officecfg/registry oox/source sal/osl sc/source sc/uiconfig sd/inc sd/source sd/uiconfig sfx2/source sfx2/uiconfig shell/Module_shell.mk shell/source solenv/bin starmath/inc starmath/source svl/source svx/source sw/AllLangResTarget_sw.mk sw/inc sw/source sw/uiconfig sysui/CustomTarget_solaris.mk tools/source unusedcode.easy vcl/inc vcl/Library_vclplug_gtk.mk vcl/open gl vcl/Package_opengl.mk vcl/qa vcl/source vcl/unx vcl/win vcl/workben xmloff/source
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Tue Nov 11 19:08:57 PST 2014
Rebased ref, commits from common ancestor:
commit b49bea154047efeb9e487dde6c9742cf31c11400
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date: Tue Nov 11 16:16:57 2014 -0500
vcl: Use offscreen rendering for native GTK widgets with OpenGL backend
Change-Id: I142e1b34e54a3cbe149e5af9adeba1250a4ca9a9
diff --git a/vcl/Library_vclplug_gtk.mk b/vcl/Library_vclplug_gtk.mk
index db2dd21..ec7f2f8 100644
--- a/vcl/Library_vclplug_gtk.mk
+++ b/vcl/Library_vclplug_gtk.mk
@@ -65,6 +65,7 @@ $(eval $(call gb_Library_use_externals,vclplug_gtk,\
cairo \
dbus \
gio \
+ glew \
gtk \
gthread \
icuuc \
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index 0cf68fd..2473297 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -41,6 +41,8 @@
#include "fontmanager.hxx"
#include <vcl/decoview.hxx>
+#include <vcl/opengl/OpenGLHelper.hxx>
+
typedef struct _cairo_font_options cairo_font_options_t;
const char* const tabPrelitDataName="libreoffice-tab-is-prelit";
@@ -533,6 +535,10 @@ void GtkData::initNWF( void )
if( pEnv && *pEnv )
GtkSalGraphics::bNeedPixmapPaint = true;
+ // use offscreen rendering when using OpenGL backend
+ if( OpenGLHelper::isVCLOpenGLEnabled() )
+ GtkSalGraphics::bNeedPixmapPaint = true;
+
#if OSL_DEBUG_LEVEL > 1
std::fprintf( stderr, "GtkPlugin: using %s NWF\n",
GtkSalGraphics::bNeedPixmapPaint ? "offscreen" : "direct" );
commit e1e787d5e418a328f8023d3b777384b98441a9de
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date: Tue Nov 11 15:54:03 2014 -0500
vcl: Add support for radial gradients in OpenGL backend
Change-Id: Ie47fb18ae7d5286fe7559c7dffbc54b0856d4d8e
diff --git a/vcl/Package_opengl.mk b/vcl/Package_opengl.mk
index da40d71..18c56fc 100644
--- a/vcl/Package_opengl.mk
+++ b/vcl/Package_opengl.mk
@@ -16,6 +16,7 @@ $(eval $(call gb_Package_add_files,vcl_opengl_shader,$(LIBO_ETC_FOLDER)/opengl,\
maskVertexShader.glsl \
maskedTextureFragmentShader.glsl \
maskedTextureVertexShader.glsl \
+ radialGradientFragmentShader.glsl \
solidFragmentShader.glsl \
solidVertexShader.glsl \
textureFragmentShader.glsl \
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 535bc72..f80c969 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -63,13 +63,18 @@ protected:
GLuint mnLinearGradientProgram;
GLuint mnLinearGradientStartColorUniform;
GLuint mnLinearGradientEndColorUniform;
- GLuint mnLinearGradientTransformUniform;
+
+ GLuint mnRadialGradientProgram;
+ GLuint mnRadialGradientStartColorUniform;
+ GLuint mnRadialGradientEndColorUniform;
+ GLuint mnRadialGradientCenterUniform;
bool CreateSolidProgram( void );
bool CreateTextureProgram( void );
bool CreateMaskedTextureProgram( void );
bool CreateMaskProgram( void );
bool CreateLinearGradientProgram( void );
+ bool CreateRadialGradientProgram( void );
void BeginSolid( SalColor nColor, sal_uInt8 nTransparency );
void BeginSolid( SalColor nColor, double fTransparency );
@@ -84,6 +89,7 @@ protected:
void DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
void DrawConvexPolygon( const Polygon& rPolygon );
void DrawRect( long nX, long nY, long nWidth, long nHeight );
+ void DrawRect( const Rectangle& rRect );
void DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon );
void DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry, bool bInverted = false );
@@ -91,6 +97,7 @@ protected:
void DrawTextureWithMask( GLuint nTexture, GLuint nMask, const Size& rSize, const SalTwoRect& rPosAry );
void DrawMask( GLuint nMask, SalColor nMaskColor, const SalTwoRect& rPosAry );
void DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect );
+ void DrawRadialGradient( const Gradient& rGradient, const Rectangle& rRect );
protected:
// get the width of the device
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 65c4f30..744aa7f 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -75,6 +75,13 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl()
, mnMaskProgram(0)
, mnMaskUniform(0)
, mnMaskColorUniform(0)
+ , mnLinearGradientProgram(0)
+ , mnLinearGradientStartColorUniform(0)
+ , mnLinearGradientEndColorUniform(0)
+ , mnRadialGradientProgram(0)
+ , mnRadialGradientStartColorUniform(0)
+ , mnRadialGradientEndColorUniform(0)
+ , mnRadialGradientCenterUniform(0)
{
}
@@ -295,7 +302,20 @@ bool OpenGLSalGraphicsImpl::CreateLinearGradientProgram( void )
glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
mnLinearGradientStartColorUniform = glGetUniformLocation( mnLinearGradientProgram, "start_color" );
mnLinearGradientEndColorUniform = glGetUniformLocation( mnLinearGradientProgram, "end_color" );
- mnLinearGradientTransformUniform = glGetUniformLocation( mnLinearGradientProgram, "transform" );
+ return true;
+}
+
+bool OpenGLSalGraphicsImpl::CreateRadialGradientProgram( void )
+{
+ mnRadialGradientProgram = OpenGLHelper::LoadShaders( "textureVertexShader", "radialGradientFragmentShader" );
+ if( mnRadialGradientProgram == 0 )
+ return false;
+
+ glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
+ glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+ mnRadialGradientStartColorUniform = glGetUniformLocation( mnRadialGradientProgram, "start_color" );
+ mnRadialGradientEndColorUniform = glGetUniformLocation( mnRadialGradientProgram, "end_color" );
+ mnRadialGradientCenterUniform = glGetUniformLocation( mnRadialGradientProgram, "center" );
return true;
}
@@ -455,6 +475,18 @@ void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long nHeigh
DrawConvexPolygon( 4, aPoints );
}
+void OpenGLSalGraphicsImpl::DrawRect( const Rectangle& rRect )
+{
+ long nX1( rRect.Left() );
+ long nY1( GetHeight() - rRect.Top() );
+ long nX2( rRect.Right() );
+ long nY2( GetHeight() - rRect.Bottom() );
+ const SalPoint aPoints[] = { { nX1, nY2 }, { nX1, nY1 },
+ { nX2, nY1 }, { nX2, nY2 }};
+
+ DrawConvexPolygon( 4, aPoints );
+}
+
void OpenGLSalGraphicsImpl::DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry )
{
::basegfx::B2DPolygon aPolygon;
@@ -601,18 +633,6 @@ void OpenGLSalGraphicsImpl::DrawMask( GLuint nMask, SalColor nMaskColor, const S
void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect )
{
- if( rGradient.GetBorder() >= 100.0 )
- {
- // border >= 100%, draw solid rectangle
- Color aCol = rGradient.GetStartColor();
- long nF = rGradient.GetStartIntensity();
- BeginSolid( MAKE_SALCOLOR( aCol.GetRed() * nF / 100,
- aCol.GetGreen() * nF / 100,
- aCol.GetBlue() * nF / 100 ) );
- DrawRect( rRect.Left(), rRect.Top(), rRect.GetWidth(), rRect.GetHeight() );
- EndSolid();
- return;
- }
if( mnLinearGradientProgram == 0 )
{
@@ -632,10 +652,6 @@ void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const
Rectangle aBoundRect;
Point aCenter;
rGradient.GetBoundRect( rRect, aBoundRect, aCenter );
- aBoundRect.Left()--;
- aBoundRect.Top()--;
- aBoundRect.Right()++;
- aBoundRect.Bottom()++;
Polygon aPoly( aBoundRect );
aPoly.Rotate( aCenter, rGradient.GetAngle() % 3600 );
@@ -653,6 +669,43 @@ void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const
glUseProgram( 0 );
}
+void OpenGLSalGraphicsImpl::DrawRadialGradient( const Gradient& rGradient, const Rectangle& rRect )
+{
+ if( mnRadialGradientProgram == 0 )
+ {
+ if( !CreateRadialGradientProgram() )
+ return;
+ }
+
+ glUseProgram( mnRadialGradientProgram );
+
+ Color aStartCol = rGradient.GetStartColor();
+ Color aEndCol = rGradient.GetEndColor();
+ long nFactor = rGradient.GetStartIntensity();
+ glUniformColorIntensity( mnRadialGradientStartColorUniform, aStartCol, nFactor );
+ nFactor = rGradient.GetEndIntensity();
+ glUniformColorIntensity( mnRadialGradientEndColorUniform, aEndCol, nFactor );
+
+ Rectangle aRect;
+ Point aCenter;
+ rGradient.GetBoundRect( rRect, aRect, aCenter );
+
+ // adjust coordinates so that radius has distance equals to 1.0
+ double fRadius = aRect.GetWidth() / 2.0f;
+ GLfloat fWidth = rRect.GetWidth() / fRadius;
+ GLfloat fHeight = rRect.GetHeight() / fRadius;
+ glUniform2f( mnRadialGradientCenterUniform, (aCenter.X() -rRect.Left()) / fRadius, (aCenter.Y() - rRect.Top()) / fRadius );
+
+ GLfloat aTexCoord[8] = { 0, 0, 0, fHeight, fWidth, fHeight, fWidth, 0 };
+ glEnableVertexAttribArray( GL_ATTRIB_TEX );
+ glVertexAttribPointer( GL_ATTRIB_TEX, 2, GL_FLOAT, GL_FALSE, 0, aTexCoord );
+
+ DrawRect( rRect );
+
+ glDisableVertexAttribArray( GL_ATTRIB_TEX );
+ glUseProgram( 0 );
+}
+
// draw --> LineColor and FillColor and RasterOp and ClipRegion
void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY )
@@ -1189,11 +1242,33 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect(
bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
const Gradient& rGradient)
{
- const Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
+ Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
+
+ SAL_INFO( "vcl.opengl", "::drawGradient" );
if( aBoundRect.IsEmpty() )
return true;
+ aBoundRect.Left()--;
+ aBoundRect.Top()--;
+ aBoundRect.Right()++;
+ aBoundRect.Bottom()++;
+
+ // if border >= 100%, draw solid rectangle with start color
+ if( rGradient.GetBorder() >= 100.0 )
+ {
+ Color aCol = rGradient.GetStartColor();
+ long nF = rGradient.GetStartIntensity();
+ PreDraw();
+ BeginSolid( MAKE_SALCOLOR( aCol.GetRed() * nF / 100,
+ aCol.GetGreen() * nF / 100,
+ aCol.GetBlue() * nF / 100 ) );
+ DrawRect( aBoundRect );
+ EndSolid();
+ PostDraw();
+ return true;
+ }
+
//TODO: lfrb: some missing transformation with the polygon in outdev
if( rGradient.GetStyle() == GradientStyle_LINEAR )
{
@@ -1202,6 +1277,13 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
PostDraw();
return true;
}
+ else if( rGradient.GetStyle() == GradientStyle_RADIAL )
+ {
+ PreDraw();
+ DrawRadialGradient( rGradient, aBoundRect );
+ PostDraw();
+ return true;
+ }
return false;
}
diff --git a/vcl/opengl/radialGradientFragmentShader.glsl b/vcl/opengl/radialGradientFragmentShader.glsl
new file mode 100644
index 0000000..94a86eb
--- /dev/null
+++ b/vcl/opengl/radialGradientFragmentShader.glsl
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#version 120
+
+uniform vec4 start_color;
+uniform vec4 end_color;
+uniform vec2 center;
+varying vec2 tex_coord;
+
+void main(void)
+{
+ gl_FragColor = mix(end_color, start_color,
+ clamp(distance(tex_coord, center), 0.0, 1.0));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 74c3dbe87e7256f8f8b3eac3a34415780035f465
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date: Tue Nov 11 13:43:56 2014 -0500
vcl: Read back OpenGL FBO to create offscreen X11 pixmap
Change-Id: I330e7d62bf31b4a90b5866d9531f073f7c69c92a
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index c9e8b68..535bc72 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -86,8 +86,8 @@ protected:
void DrawRect( long nX, long nY, long nWidth, long nHeight );
void DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon );
- void DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry );
- void DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& rPosAry );
+ void DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry, bool bInverted = false );
+ void DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& rPosAry, bool bInverted = false );
void DrawTextureWithMask( GLuint nTexture, GLuint nMask, const Size& rSize, const SalTwoRect& rPosAry );
void DrawMask( GLuint nMask, SalColor nMaskColor, const SalTwoRect& rPosAry );
void DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect );
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 72387e2..65c4f30 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -503,14 +503,23 @@ void OpenGLSalGraphicsImpl::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPol
glDisableVertexAttribArray( GL_ATTRIB_POS );
}
-void OpenGLSalGraphicsImpl::DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry )
+void OpenGLSalGraphicsImpl::DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry, bool bInverted )
{
GLfloat aTexCoord[8];
aTexCoord[0] = aTexCoord[2] = rPosAry.mnSrcX / (double) rSize.Width();
aTexCoord[4] = aTexCoord[6] = (rPosAry.mnSrcX + rPosAry.mnSrcWidth) / (double) rSize.Width();
- aTexCoord[3] = aTexCoord[5] = (rSize.Height() - rPosAry.mnSrcY) / (double) rSize.Height();
- aTexCoord[1] = aTexCoord[7] = (rSize.Height() - rPosAry.mnSrcY - rPosAry.mnSrcHeight) / (double) rSize.Height();
+
+ if( !bInverted )
+ {
+ aTexCoord[3] = aTexCoord[5] = (rSize.Height() - rPosAry.mnSrcY) / (double) rSize.Height();
+ aTexCoord[1] = aTexCoord[7] = (rSize.Height() - rPosAry.mnSrcY - rPosAry.mnSrcHeight) / (double) rSize.Height();
+ }
+ else
+ {
+ aTexCoord[1] = aTexCoord[7] = (rSize.Height() - rPosAry.mnSrcY) / (double) rSize.Height();
+ aTexCoord[3] = aTexCoord[5] = (rSize.Height() - rPosAry.mnSrcY - rPosAry.mnSrcHeight) / (double) rSize.Height();
+ }
glEnableVertexAttribArray( GL_ATTRIB_TEX );
glVertexAttribPointer( GL_ATTRIB_TEX, 2, GL_FLOAT, GL_FALSE, 0, aTexCoord );
@@ -520,7 +529,7 @@ void OpenGLSalGraphicsImpl::DrawTextureRect( const Size& rSize, const SalTwoRect
glDisableVertexAttribArray( GL_ATTRIB_TEX );
}
-void OpenGLSalGraphicsImpl::DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& pPosAry )
+void OpenGLSalGraphicsImpl::DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& pPosAry, bool bInverted )
{
if( mnTextureProgram == 0 )
{
@@ -534,7 +543,7 @@ void OpenGLSalGraphicsImpl::DrawTexture( GLuint nTexture, const Size& rSize, con
CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, nTexture );
- DrawTextureRect( rSize, pPosAry );
+ DrawTextureRect( rSize, pPosAry, bInverted );
CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, 0 );
diff --git a/vcl/opengl/x11/gdiimpl.cxx b/vcl/opengl/x11/gdiimpl.cxx
index 6e803bd..13b7049 100644
--- a/vcl/opengl/x11/gdiimpl.cxx
+++ b/vcl/opengl/x11/gdiimpl.cxx
@@ -83,9 +83,38 @@ X11Pixmap* X11OpenGLSalGraphicsImpl::GetPixmapFromScreen( const Rectangle& rRect
{
Display* pDisplay = mrParent.GetXDisplay();
SalX11Screen nScreen = mrParent.GetScreenNumber();
+ XVisualInfo aVisualInfo;
+ X11Pixmap* pPixmap;
+ XImage* pImage;
+ sal_uInt8* pData;
SAL_INFO( "vcl.opengl", "GetPixmapFromScreen" );
- return new X11Pixmap( pDisplay, nScreen, rRect.GetWidth(), rRect.GetHeight(), 24 );
+ // TODO: lfrb: Use context depth
+ pPixmap = new X11Pixmap( pDisplay, nScreen, rRect.GetWidth(), rRect.GetHeight(), 24 );
+
+ if( !OpenGLHelper::GetVisualInfo( pDisplay, nScreen.getXScreen(), aVisualInfo ) )
+ return pPixmap;
+
+ // make sure everything is synced up before reading back
+ maContext.makeCurrent();
+ glXWaitX();
+
+ // TODO: lfrb: What if offscreen?
+ pData = new sal_uInt8[rRect.GetWidth() * rRect.GetHeight() * 4];
+ glPixelStorei( GL_PACK_ALIGNMENT, 1 );
+ glReadPixels( rRect.Left(), GetHeight() - rRect.Top(), rRect.GetWidth(), rRect.GetHeight(),
+ GL_RGBA, GL_UNSIGNED_BYTE, pData );
+
+ pImage = XCreateImage( pDisplay, aVisualInfo.visual, 24, ZPixmap, 0, (char*) pData,
+ rRect.GetWidth(), rRect.GetHeight(), 8, 0 );
+ XInitImage( pImage );
+ GC aGC = XCreateGC( pDisplay, pPixmap->GetPixmap(), 0, NULL );
+ XPutImage( pDisplay, pPixmap->GetDrawable(), aGC, pImage,
+ 0, 0, 0, 0, rRect.GetWidth(), rRect.GetHeight() );
+ XFreeGC( pDisplay, aGC );
+ XDestroyImage( pImage );
+
+ return pPixmap;
}
bool X11OpenGLSalGraphicsImpl::RenderPixmapToScreen( X11Pixmap* pPixmap, int nX, int nY )
@@ -128,7 +157,7 @@ bool X11OpenGLSalGraphicsImpl::RenderPixmapToScreen( X11Pixmap* pPixmap, int nX,
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- DrawTexture( nTexture, pPixmap->GetSize(), aPosAry );
+ DrawTexture( nTexture, pPixmap->GetSize(), aPosAry, !bInverted );
glXReleaseTexImageEXT( pDisplay, pGlxPixmap, GLX_FRONT_LEFT_EXT );
glDeleteTextures( 1, &nTexture );
commit c7a5ce27e6d27af4d868dedcde1f650fa129e6f8
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date: Tue Nov 11 05:13:40 2014 -0500
vcl: Add initial support for linear gradient with OpenGL
Change-Id: Iccc12c94bfd68387dfc0161a5fde4f595edda0e1
diff --git a/vcl/Package_opengl.mk b/vcl/Package_opengl.mk
index 79dabb7..da40d71 100644
--- a/vcl/Package_opengl.mk
+++ b/vcl/Package_opengl.mk
@@ -11,6 +11,7 @@ $(eval $(call gb_Package_Package,vcl_opengl_shader,$(SRCDIR)/vcl/opengl))
$(eval $(call gb_Package_add_files,vcl_opengl_shader,$(LIBO_ETC_FOLDER)/opengl,\
convolutionFragmentShader.glsl \
+ linearGradientFragmentShader.glsl \
maskFragmentShader.glsl \
maskVertexShader.glsl \
maskedTextureFragmentShader.glsl \
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 6f920e5..c9e8b68 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -25,6 +25,7 @@
#include "opengl/texture.hxx"
+#include <tools/poly.hxx>
#include <vcl/opengl/OpenGLContext.hxx>
class SalFrame;
@@ -59,10 +60,16 @@ protected:
GLuint mnMaskUniform;
GLuint mnMaskColorUniform;
+ GLuint mnLinearGradientProgram;
+ GLuint mnLinearGradientStartColorUniform;
+ GLuint mnLinearGradientEndColorUniform;
+ GLuint mnLinearGradientTransformUniform;
+
bool CreateSolidProgram( void );
bool CreateTextureProgram( void );
bool CreateMaskedTextureProgram( void );
bool CreateMaskProgram( void );
+ bool CreateLinearGradientProgram( void );
void BeginSolid( SalColor nColor, sal_uInt8 nTransparency );
void BeginSolid( SalColor nColor, double fTransparency );
@@ -75,6 +82,7 @@ protected:
void DrawLine( long nX1, long nY1, long nX2, long nY2 );
void DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose );
void DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
+ void DrawConvexPolygon( const Polygon& rPolygon );
void DrawRect( long nX, long nY, long nWidth, long nHeight );
void DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon );
@@ -82,6 +90,7 @@ protected:
void DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& rPosAry );
void DrawTextureWithMask( GLuint nTexture, GLuint nMask, const Size& rSize, const SalTwoRect& rPosAry );
void DrawMask( GLuint nMask, SalColor nMaskColor, const SalTwoRect& rPosAry );
+ void DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect );
protected:
// get the width of the device
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 2cf9806..72387e2 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -51,6 +51,13 @@
((float) SALCOLOR_BLUE( nColor )) / 255, \
(1.0f - fTransparency) )
+#define glUniformColorIntensity(nUniform, aColor, nFactor) \
+ glUniform4f( nUniform, \
+ ((float) aColor.GetRed()) * nFactor / 25500.0, \
+ ((float) aColor.GetGreen()) * nFactor / 25500.0, \
+ ((float) aColor.GetBlue()) * nFactor / 25500.0, \
+ 1.0f )
+
OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl()
: mpFrame(NULL)
, mbOffscreen(false)
@@ -278,6 +285,20 @@ bool OpenGLSalGraphicsImpl::CreateMaskProgram( void )
return true;
}
+bool OpenGLSalGraphicsImpl::CreateLinearGradientProgram( void )
+{
+ mnLinearGradientProgram = OpenGLHelper::LoadShaders( "textureVertexShader", "linearGradientFragmentShader" );
+ if( mnLinearGradientProgram == 0 )
+ return false;
+
+ glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
+ glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+ mnLinearGradientStartColorUniform = glGetUniformLocation( mnLinearGradientProgram, "start_color" );
+ mnLinearGradientEndColorUniform = glGetUniformLocation( mnLinearGradientProgram, "end_color" );
+ mnLinearGradientTransformUniform = glGetUniformLocation( mnLinearGradientProgram, "transform" );
+ return true;
+}
+
void OpenGLSalGraphicsImpl::BeginSolid( SalColor nColor, sal_uInt8 nTransparency )
{
if( mnSolidProgram == 0 )
@@ -403,6 +424,25 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoin
glDisableVertexAttribArray( GL_ATTRIB_POS );
}
+void OpenGLSalGraphicsImpl::DrawConvexPolygon( const Polygon& rPolygon )
+{
+ sal_uInt16 nPoints = rPolygon.GetSize() - 1;
+ std::vector<GLfloat> aVertices(nPoints * 2);
+ sal_uInt32 i, j;
+
+ for( i = 0, j = 0; i < nPoints; i++, j += 2 )
+ {
+ const Point& rPt = rPolygon.GetPoint( i );
+ aVertices[j] = (2 * rPt.X()) / GetWidth() - 1.0;
+ aVertices[j+1] = (2 * (GetHeight() - rPt.Y())) / GetHeight() - 1.0;
+ }
+
+ glEnableVertexAttribArray( GL_ATTRIB_POS );
+ glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, &aVertices[0] );
+ glDrawArrays( GL_TRIANGLE_FAN, 0, nPoints );
+ glDisableVertexAttribArray( GL_ATTRIB_POS );
+}
+
void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long nHeight )
{
long nX1( nX );
@@ -550,6 +590,60 @@ void OpenGLSalGraphicsImpl::DrawMask( GLuint nMask, SalColor nMaskColor, const S
glUseProgram( 0 );
}
+void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect )
+{
+ if( rGradient.GetBorder() >= 100.0 )
+ {
+ // border >= 100%, draw solid rectangle
+ Color aCol = rGradient.GetStartColor();
+ long nF = rGradient.GetStartIntensity();
+ BeginSolid( MAKE_SALCOLOR( aCol.GetRed() * nF / 100,
+ aCol.GetGreen() * nF / 100,
+ aCol.GetBlue() * nF / 100 ) );
+ DrawRect( rRect.Left(), rRect.Top(), rRect.GetWidth(), rRect.GetHeight() );
+ EndSolid();
+ return;
+ }
+
+ if( mnLinearGradientProgram == 0 )
+ {
+ if( !CreateLinearGradientProgram() )
+ return;
+ }
+
+ glUseProgram( mnLinearGradientProgram );
+
+ Color aStartCol = rGradient.GetStartColor();
+ Color aEndCol = rGradient.GetEndColor();
+ long nFactor = rGradient.GetStartIntensity();
+ glUniformColorIntensity( mnLinearGradientStartColorUniform, aStartCol, nFactor );
+ nFactor = rGradient.GetEndIntensity();
+ glUniformColorIntensity( mnLinearGradientEndColorUniform, aEndCol, nFactor );
+
+ Rectangle aBoundRect;
+ Point aCenter;
+ rGradient.GetBoundRect( rRect, aBoundRect, aCenter );
+ aBoundRect.Left()--;
+ aBoundRect.Top()--;
+ aBoundRect.Right()++;
+ aBoundRect.Bottom()++;
+ Polygon aPoly( aBoundRect );
+ aPoly.Rotate( aCenter, rGradient.GetAngle() % 3600 );
+
+ GLfloat aTexCoord[8] = { 0, 1, 1, 1, 1, 0, 0, 0 };
+ GLfloat fMin = 1.0 - 100.0 / (100.0 - rGradient.GetBorder());
+ aTexCoord[5] = aTexCoord[7] = fMin;
+ glEnableVertexAttribArray( GL_ATTRIB_TEX );
+ glVertexAttribPointer( GL_ATTRIB_TEX, 2, GL_FLOAT, GL_FALSE, 0, aTexCoord );
+
+ DrawConvexPolygon( aPoly );
+
+ glDisableVertexAttribArray( GL_ATTRIB_TEX );
+ CHECK_GL_ERROR();
+
+ glUseProgram( 0 );
+}
+
// draw --> LineColor and FillColor and RasterOp and ClipRegion
void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY )
@@ -1083,9 +1177,22 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect(
return true;
}
-bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& /*rPolygon*/,
- const Gradient& /*rGradient*/)
+bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
+ const Gradient& rGradient)
{
+ const Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
+
+ if( aBoundRect.IsEmpty() )
+ return true;
+
+ //TODO: lfrb: some missing transformation with the polygon in outdev
+ if( rGradient.GetStyle() == GradientStyle_LINEAR )
+ {
+ PreDraw();
+ DrawLinearGradient( rGradient, aBoundRect );
+ PostDraw();
+ return true;
+ }
return false;
}
diff --git a/vcl/opengl/linearGradientFragmentShader.glsl b/vcl/opengl/linearGradientFragmentShader.glsl
new file mode 100644
index 0000000..7b84c06
--- /dev/null
+++ b/vcl/opengl/linearGradientFragmentShader.glsl
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#version 120
+
+uniform vec4 start_color;
+uniform vec4 end_color;
+uniform mat3x3 transform;
+varying vec2 tex_coord;
+
+void main(void)
+{
+ gl_FragColor = mix(start_color, end_color,
+ clamp(tex_coord.t, 0.0, 1.0));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit b021b5983c62e266b82d9f0c5c6d8d8900553827
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Wed Nov 12 00:21:28 2014 +0000
WaE: calm clang tinderbox.
Change-Id: Id07741c3d7780da72a351c33fc001f7d2a73bc64
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index e4f9205..c5e4d61 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -34,7 +34,7 @@ static bool isValidBitCount( sal_uInt16 nBitCount )
OpenGLSalBitmap::OpenGLSalBitmap()
: mpContext(NULL)
-, mpTexture(NULL)
+, mpTexture()
, mbDirtyTexture(true)
, mnBits(0)
, mnBytesPerRow(0)
commit 98f9baa5253f7bb8034f148519f31f548b1452fa
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Wed Nov 12 00:02:03 2014 +0000
vcldemo: add some clipping tests under the checkerboard tile.
Change-Id: I801931055aeba38e9173fb04dcc44b220cd3f17e
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 4bf7993a..0aae845 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -195,9 +195,60 @@ public:
struct DrawCheckered : public RegionRenderer
{
virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
- const RenderContext &) SAL_OVERRIDE
+ const RenderContext &rCtx) SAL_OVERRIDE
{
- rDev.DrawCheckered(r.TopLeft(), r.GetSize());
+ if (rCtx.meStyle == RENDER_EXPANDED)
+ {
+ std::vector<Rectangle> aRegions(DemoWin::partition(rDev, 2, 2));
+ for (size_t i = 0; i < aRegions.size(); i++)
+ {
+ vcl::Region aRegion;
+ Rectangle aSub(aRegions[i]);
+ Rectangle aSmaller(aSub);
+ aSmaller.Move(10,10);
+ aSmaller.setWidth(aSmaller.getWidth()-20);
+ aSmaller.setHeight(aSmaller.getHeight()-24);
+ switch (i) {
+ case 0:
+ aRegion = vcl::Region(aSub);
+ break;
+ case 1:
+ aRegion = vcl::Region(aSmaller);
+ aRegion.XOr(aSub);
+ break;
+ case 2:
+ {
+ Polygon aPoly(aSub);
+ aPoly.Rotate(aSub.Center(), 450);
+ aPoly.Clip(aSmaller);
+ aRegion = vcl::Region(aPoly);
+ break;
+ }
+ case 3:
+ {
+ tools::PolyPolygon aPolyPoly;
+ sal_Int32 nTW = aSub.GetWidth()/6;
+ sal_Int32 nTH = aSub.GetHeight()/6;
+ Rectangle aTiny(Point(4, 4), Size(nTW*2, nTH*2));
+ aPolyPoly.Insert(Polygon(aTiny));
+ aTiny.Move(nTW*3, nTH*3);
+ aPolyPoly.Insert(Polygon(aTiny));
+ aTiny.Move(nTW, nTH);
+ aPolyPoly.Insert(Polygon(aTiny));
+
+ aRegion = vcl::Region(aPolyPoly);
+ break;
+ }
+ } // switch
+ rDev.SetClipRegion(aRegion);
+ rDev.DrawCheckered(aSub.TopLeft(), aSub.GetSize());
+ rDev.SetClipRegion();
+ }
+ }
+ else
+ {
+ rDev.DrawCheckered(r.TopLeft(), r.GetSize());
+ }
}
};
commit a05fe51feb29301968299d6167fa1acb0d5850e0
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Tue Nov 11 23:32:35 2014 +0000
vcldemo: render a selection of odd gradients.
Change-Id: Ic3d2f795d453b9c48316d78d0d50486624cdc2b1
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index b5c2ddf..4bf7993a 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -103,8 +103,46 @@ public:
drawToDevice(getOutDev(), false);
}
- std::vector<Rectangle> partitionAndClear(OutputDevice &rDev,
- int nX, int nY);
+ static std::vector<Rectangle> partition(OutputDevice &rDev, int nX, int nY)
+ {
+ Rectangle r;
+ std::vector<Rectangle> aRegions;
+
+ // Make small cleared area for these guys
+ Size aSize(rDev.GetOutputSizePixel());
+ long nBorderSize = aSize.Width() / 32;
+ long nBoxWidth = (aSize.Width() - nBorderSize*(nX+1)) / nX;
+ long nBoxHeight = (aSize.Height() - nBorderSize*(nY+1)) / nY;
+ for (int y = 0; y < nY; y++ )
+ {
+ for (int x = 0; x < nX; x++ )
+ {
+ r.SetPos(Point(nBorderSize + (nBorderSize + nBoxWidth) * x,
+ nBorderSize + (nBorderSize + nBoxHeight) * y));
+ r.SetSize(Size(nBoxWidth, nBoxHeight));
+ aRegions.push_back(r);
+ }
+ }
+
+ return aRegions;
+ }
+
+ static void clearRects(OutputDevice &rDev, std::vector<Rectangle> &rRects)
+ {
+ for (size_t i = 0; i < rRects.size(); i++)
+ {
+ // knock up a nice little border
+ rDev.SetLineColor(COL_GRAY);
+ rDev.SetFillColor(COL_LIGHTGRAY);
+ if (i % 2)
+ {
+ int nBorderSize = rRects[i].GetWidth() / 5;
+ rDev.DrawRect(rRects[i], nBorderSize, nBorderSize);
+ }
+ else
+ rDev.DrawRect(rRects[i]);
+ }
+ }
void drawBackground(OutputDevice &rDev, Rectangle r)
{
@@ -150,7 +188,7 @@ public:
rDev.SetTextColor( Color( COL_BLACK ) );
vcl::Font aFont( OUString( "Times" ), Size( 0, 25 ) );
rDev.SetFont( aFont );
- rDev.DrawText( r, OUString( "Just a simple text" ) );
+ rDev.DrawText( r, OUString( "Click any rect to zoom" ) );
}
};
@@ -200,15 +238,70 @@ public:
struct DrawGradient : public RegionRenderer
{
virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
- const RenderContext &) SAL_OVERRIDE
+ const RenderContext &rCtx) SAL_OVERRIDE
{
- Gradient aGradient;
- aGradient.SetStartColor(COL_YELLOW);
- aGradient.SetEndColor(COL_RED);
-// aGradient.SetAngle(45);
- aGradient.SetStyle(GradientStyle_RECT);
- aGradient.SetBorder(r.GetSize().Width()/20);
- rDev.DrawGradient(r, aGradient);
+ if (rCtx.meStyle == RENDER_EXPANDED)
+ {
+ std::vector<Rectangle> aRegions(DemoWin::partition(rDev, 5, 4));
+ sal_uInt32 nStartCols[] = {
+ COL_RED, COL_RED, COL_RED, COL_GREEN, COL_GREEN,
+ COL_BLUE, COL_BLUE, COL_BLUE, COL_CYAN, COL_CYAN,
+ COL_GRAY, COL_GRAY, COL_LIGHTGRAY, COL_LIGHTBLUE, COL_LIGHTCYAN,
+ COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK
+ };
+ sal_uInt32 nEndCols[] = {
+ COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK,
+ COL_RED, COL_RED, COL_RED, COL_GREEN, COL_GREEN,
+ COL_GRAY, COL_GRAY, COL_LIGHTGRAY, COL_LIGHTBLUE, COL_LIGHTCYAN,
+ COL_BLUE, COL_BLUE, COL_BLUE, COL_CYAN, COL_CYAN
+ };
+ GradientStyle eStyles[] = {
+ GradientStyle_LINEAR, GradientStyle_AXIAL, GradientStyle_RADIAL, GradientStyle_ELLIPTICAL, GradientStyle_SQUARE,
+ GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL,
+ GradientStyle_LINEAR, GradientStyle_AXIAL, GradientStyle_RADIAL, GradientStyle_ELLIPTICAL, GradientStyle_SQUARE,
+ GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL
+ };
+ sal_uInt16 nAngles[] = {
+ 0, 0, 0, 0, 0,
+ 15, 30, 45, 60, 75,
+ 90, 120, 135, 160, 180,
+ 0, 0, 0, 0, 0
+ };
+ sal_uInt16 nBorders[] = {
+ 0, 0, 0, 0, 0,
+ 1, 10, 100, 10, 1,
+ 0, 0, 0, 0, 0,
+ 1, 10, 20, 10, 1,
+ 0, 0, 0, 0, 0
+ };
+ DemoWin::clearRects(rDev, aRegions);
+ assert(aRegions.size() <= SAL_N_ELEMENTS(nStartCols));
+ assert(aRegions.size() <= SAL_N_ELEMENTS(nEndCols));
+ assert(aRegions.size() <= SAL_N_ELEMENTS(eStyles));
+ assert(aRegions.size() <= SAL_N_ELEMENTS(nAngles));
+ assert(aRegions.size() <= SAL_N_ELEMENTS(nBorders));
+ for (size_t i = 0; i < aRegions.size(); i++)
+ {
+ Rectangle aSub = aRegions[i];
+ Gradient aGradient;
+ aGradient.SetStartColor(Color(nStartCols[i]));
+ aGradient.SetEndColor(Color(nEndCols[i]));
+ aGradient.SetStyle(eStyles[i]);
+ aGradient.SetAngle(nAngles[i]);
+ aGradient.SetBorder(nBorders[i]);
+ rDev.DrawGradient(aSub, aGradient);
+ }
+ }
+ else
+ {
+ Gradient aGradient;
+ aGradient.SetStartColor(COL_YELLOW);
+ aGradient.SetEndColor(COL_RED);
+ // aGradient.SetAngle(45);
+ aGradient.SetStyle(GradientStyle_RECT);
+ aGradient.SetBorder(r.GetSize().Width()/20);
+ rDev.DrawGradient(r, aGradient);
+ }
}
};
@@ -378,7 +471,8 @@ public:
else
{
aCtx.meStyle = RENDER_THUMB;
- std::vector<Rectangle> aRegions(partitionAndClear(rDev, mnSegmentsX, mnSegmentsY));
+ std::vector<Rectangle> aRegions(DemoWin::partition(rDev, mnSegmentsX, mnSegmentsY));
+ DemoWin::clearRects(rDev, aRegions);
for (size_t i = 0; i < maRenderers.size(); i++)
maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx);
}
@@ -417,7 +511,7 @@ void DemoWin::MouseButtonDown( const MouseEvent& rMEvt )
}
// click on a region to zoom into it
- std::vector<Rectangle> aRegions(partitionAndClear(*this, mnSegmentsX, mnSegmentsY));
+ std::vector<Rectangle> aRegions(partition(*this, mnSegmentsX, mnSegmentsY));
for (size_t i = 0; i < aRegions.size(); i++)
{
if (aRegions[i].IsInside(rMEvt.GetPosPixel()))
@@ -453,39 +547,6 @@ void DemoWin::MouseButtonDown( const MouseEvent& rMEvt )
}
}
-std::vector<Rectangle> DemoWin::partitionAndClear(OutputDevice &rDev, int nX, int nY)
-{
- Rectangle r;
- std::vector<Rectangle> aRegions;
-
- // Make small cleared area for these guys
- Size aSize(rDev.GetOutputSizePixel());
- long nBorderSize = aSize.Width() / 32;
- long nBoxWidth = (aSize.Width() - nBorderSize*(nX+1)) / nX;
- long nBoxHeight = (aSize.Height() - nBorderSize*(nY+1)) / nY;
- for (int y = 0; y < nY; y++ )
- {
- for (int x = 0; x < nX; x++ )
- {
- r.SetPos(Point(nBorderSize + (nBorderSize + nBoxWidth) * x,
- nBorderSize + (nBorderSize + nBoxHeight) * y));
- r.SetSize(Size(nBoxWidth, nBoxHeight));
-
- // knock up a nice little border
- rDev.SetLineColor(COL_GRAY);
- rDev.SetFillColor(COL_LIGHTGRAY);
- if ((x + y) % 2)
- rDev.DrawRect(r, nBorderSize, nBorderSize);
- else
- rDev.DrawRect(r);
-
- aRegions.push_back(r);
- }
- }
-
- return aRegions;
-}
-
void DemoWin::InitRenderers()
{
maRenderers.push_back(new DrawRadialLines());
commit c3eab4a893a4cde7c23ad06e4090283775b1e49b
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Tue Nov 11 22:55:38 2014 +0000
vcldemo: render an enlarged view on mouse click.
Change-Id: I9021ab4744b16f967eaa5006128d30621b421d7a
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 57eecfa..b5c2ddf 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -52,6 +52,9 @@ class DemoWin : public DemoBase
Bitmap maIntroBW;
BitmapEx maIntro;
+ int mnSegmentsX;
+ int mnSegmentsY;
+
struct RenderContext {
RenderStyle meStyle;
bool mbVDev;
@@ -65,11 +68,15 @@ class DemoWin : public DemoBase
};
std::vector< RegionRenderer * > maRenderers;
+ sal_Int32 mnSelectedRenderer;
void InitRenderers();
public:
DemoWin() : DemoBase()
+ , mnSegmentsX(4)
+ , mnSegmentsY(3)
+ , mnSelectedRenderer(-1)
, mpButton(NULL)
, mpButtonWin(NULL)
{
@@ -99,14 +106,12 @@ public:
std::vector<Rectangle> partitionAndClear(OutputDevice &rDev,
int nX, int nY);
- void drawBackground(OutputDevice &rDev)
+ void drawBackground(OutputDevice &rDev, Rectangle r)
{
- Rectangle r(Point(0,0), rDev.GetOutputSizePixel());
Gradient aGradient;
aGradient.SetStartColor(COL_BLUE);
aGradient.SetEndColor(COL_GREEN);
aGradient.SetStyle(GradientStyle_LINEAR);
-// aGradient.SetBorder(r.GetSize().Width()/20);
rDev.DrawGradient(r, aGradient);
}
@@ -358,15 +363,25 @@ public:
void drawToDevice(OutputDevice &rDev, bool bVdev)
{
RenderContext aCtx;
- aCtx.meStyle = RENDER_THUMB;
aCtx.mbVDev = bVdev;
aCtx.mpDemoWin = this;
- drawBackground(rDev);
+ Rectangle aWholeWin(Point(0,0), rDev.GetOutputSizePixel());
+
+ drawBackground(rDev, aWholeWin);
- std::vector<Rectangle> aRegions(partitionAndClear(rDev, 4, 3));
- for (size_t i = 0; i < maRenderers.size(); i++)
- maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx);
+ if (mnSelectedRenderer >= 0)
+ {
+ aCtx.meStyle = RENDER_EXPANDED;
+ maRenderers[mnSelectedRenderer]->RenderRegion(rDev, aWholeWin, aCtx);
+ }
+ else
+ {
+ aCtx.meStyle = RENDER_THUMB;
+ std::vector<Rectangle> aRegions(partitionAndClear(rDev, mnSegmentsX, mnSegmentsY));
+ for (size_t i = 0; i < maRenderers.size(); i++)
+ maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx);
+ }
}
};
@@ -393,7 +408,27 @@ IMPL_LINK_NOARG(DemoWin,BounceTimerCb)
void DemoWin::MouseButtonDown( const MouseEvent& rMEvt )
{
- (void) rMEvt;
+ // click to zoom out
+ if (mnSelectedRenderer >= 0)
+ {
+ mnSelectedRenderer = -1;
+ Invalidate();
+ return;
+ }
+
+ // click on a region to zoom into it
+ std::vector<Rectangle> aRegions(partitionAndClear(*this, mnSegmentsX, mnSegmentsY));
+ for (size_t i = 0; i < aRegions.size(); i++)
+ {
+ if (aRegions[i].IsInside(rMEvt.GetPosPixel()))
+ {
+ mnSelectedRenderer = i;
+ Invalidate();
+ return;
+ }
+ }
+
+ // otherwise bounce floating windows
if (!mpButton)
{
mpButtonWin = new FloatingWindow(this);
commit 1c526c9ddda5d52f7a4db5655a4ec60b8c62835c
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Tue Nov 11 22:24:39 2014 +0000
vcldemo: re-factor rendering panes, to enable zooming.
Change-Id: Ib50fcba992293ec661912444a051a02d856c7189
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 00bab53..57eecfa 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -42,11 +42,32 @@ public:
OutputDevice &getOutDev() { return *this; }
};
+enum RenderStyle {
+ RENDER_THUMB, // small view <n> to a page
+ RENDER_EXPANDED, // expanded view of this renderer
+};
+
class DemoWin : public DemoBase
{
Bitmap maIntroBW;
BitmapEx maIntro;
+ struct RenderContext {
+ RenderStyle meStyle;
+ bool mbVDev;
+ DemoWin *mpDemoWin;
+ };
+ struct RegionRenderer {
+ public:
+ virtual ~RegionRenderer() {}
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) = 0;
+ };
+
+ std::vector< RegionRenderer * > maRenderers;
+
+ void InitRenderers();
+
public:
DemoWin() : DemoBase()
, mpButton(NULL)
@@ -56,6 +77,8 @@ public:
Application::Abort("Failed to load intro image");
maIntroBW = maIntro.GetBitmap();
maIntroBW.Filter( BMP_FILTER_EMBOSS_GREY );
+
+ InitRenderers();
}
// Bouncing windows on click ...
@@ -67,8 +90,6 @@ public:
virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
- void drawToDevice(OutputDevice &r, bool bVdev);
-
virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE
{
fprintf(stderr, "DemoWin::Paint(%ld,%ld,%ld,%ld)\n", rRect.getX(), rRect.getY(), rRect.getWidth(), rRect.getHeight());
@@ -89,199 +110,263 @@ public:
rDev.DrawGradient(r, aGradient);
}
- void drawRadialLines(OutputDevice &rDev, Rectangle r)
+ struct DrawRadialLines : public RegionRenderer
{
- rDev.SetFillColor(Color(COL_LIGHTRED));
- rDev.SetLineColor(Color(COL_BLACK));
- rDev.DrawRect( r );
-
- for(int i=0; i<r.GetHeight(); i+=15)
- rDev.DrawLine( Point(r.Left(), r.Top()+i), Point(r.Right(), r.Bottom()-i) );
- for(int i=0; i<r.GetWidth(); i+=15)
- rDev.DrawLine( Point(r.Left()+i, r.Bottom()), Point(r.Right()-i, r.Top()) );
-
- // Should draw a white-line across the middle
- Color aLastPixel( COL_WHITE );
- Point aCenter((r.Left() + r.Right())/2 - 4,
- (r.Top() + r.Bottom())/2 - 4);
- for(int i=0; i<8; i++)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
{
- rDev.DrawPixel(aCenter, aLastPixel);
- aLastPixel = rDev.GetPixel(aCenter);
- aCenter.Move(1,1);
+ rDev.SetFillColor(Color(COL_LIGHTRED));
+ rDev.SetLineColor(Color(COL_BLACK));
+ rDev.DrawRect( r );
+
+ for(int i=0; i<r.GetHeight(); i+=15)
+ rDev.DrawLine( Point(r.Left(), r.Top()+i), Point(r.Right(), r.Bottom()-i) );
+ for(int i=0; i<r.GetWidth(); i+=15)
+ rDev.DrawLine( Point(r.Left()+i, r.Bottom()), Point(r.Right()-i, r.Top()) );
+
+ // Should draw a white-line across the middle
+ Color aLastPixel( COL_WHITE );
+ Point aCenter((r.Left() + r.Right())/2 - 4,
+ (r.Top() + r.Bottom())/2 - 4);
+ for(int i=0; i<8; i++)
+ {
+ rDev.DrawPixel(aCenter, aLastPixel);
+ aLastPixel = rDev.GetPixel(aCenter);
+ aCenter.Move(1,1);
+ }
}
- }
-
- void drawText(OutputDevice &rDev, Rectangle r)
+ };
+ struct DrawText : public RegionRenderer
{
- rDev.SetTextColor( Color( COL_BLACK ) );
- vcl::Font aFont( OUString( "Times" ), Size( 0, 25 ) );
- rDev.SetFont( aFont );
- rDev.DrawText( r, OUString( "Just a simple text" ) );
- }
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ rDev.SetTextColor( Color( COL_BLACK ) );
+ vcl::Font aFont( OUString( "Times" ), Size( 0, 25 ) );
+ rDev.SetFont( aFont );
+ rDev.DrawText( r, OUString( "Just a simple text" ) );
+ }
+ };
- void drawPoly(OutputDevice &rDev, Rectangle r) // pretty
+ struct DrawCheckered : public RegionRenderer
{
- drawCheckered(rDev, r);
-
- long nDx = r.GetWidth()/20;
- long nDy = r.GetHeight()/20;
- Rectangle aShrunk(r);
- aShrunk.Move(nDx, nDy);
- aShrunk.SetSize(Size(r.GetWidth()-nDx*2,
- r.GetHeight()-nDy*2));
- Polygon aPoly(aShrunk);
- tools::PolyPolygon aPPoly(aPoly);
- rDev.SetLineColor(Color(COL_RED));
- rDev.SetFillColor(Color(COL_RED));
- // This hits the optional 'drawPolyPolygon' code-path
- rDev.DrawTransparent(aPPoly, 64);
- }
- void drawEllipse(OutputDevice &rDev, Rectangle r)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ rDev.DrawCheckered(r.TopLeft(), r.GetSize());
+ }
+ };
+ struct DrawPoly : public RegionRenderer
{
- rDev.SetLineColor(Color(COL_RED));
- rDev.SetFillColor(Color(COL_GREEN));
- rDev.DrawEllipse(r);
- }
- void drawCheckered(OutputDevice &rDev, Rectangle r)
+ DrawCheckered maCheckered;
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) SAL_OVERRIDE
+ {
+ maCheckered.RenderRegion(rDev, r, rCtx);
+
+ long nDx = r.GetWidth()/20;
+ long nDy = r.GetHeight()/20;
+ Rectangle aShrunk(r);
+ aShrunk.Move(nDx, nDy);
+ aShrunk.SetSize(Size(r.GetWidth()-nDx*2,
+ r.GetHeight()-nDy*2));
+ Polygon aPoly(aShrunk);
+ tools::PolyPolygon aPPoly(aPoly);
+ rDev.SetLineColor(Color(COL_RED));
+ rDev.SetFillColor(Color(COL_RED));
+ // This hits the optional 'drawPolyPolygon' code-path
+ rDev.DrawTransparent(aPPoly, 64);
+ }
+ };
+ struct DrawEllipse : public RegionRenderer
{
- rDev.DrawCheckered(r.TopLeft(), r.GetSize());
- }
- void drawGradient(OutputDevice &rDev, Rectangle r)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ rDev.SetLineColor(Color(COL_RED));
+ rDev.SetFillColor(Color(COL_GREEN));
+ rDev.DrawEllipse(r);
+ }
+ };
+ struct DrawGradient : public RegionRenderer
{
- Gradient aGradient;
- aGradient.SetStartColor(COL_YELLOW);
- aGradient.SetEndColor(COL_RED);
-// aGradient.SetAngle(45);
- aGradient.SetStyle(GradientStyle_RECT);
- aGradient.SetBorder(r.GetSize().Width()/20);
- rDev.DrawGradient(r, aGradient);
- }
- void drawBitmap(OutputDevice &rDev, Rectangle r)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ Gradient aGradient;
+ aGradient.SetStartColor(COL_YELLOW);
+ aGradient.SetEndColor(COL_RED);
+// aGradient.SetAngle(45);
+ aGradient.SetStyle(GradientStyle_RECT);
+ aGradient.SetBorder(r.GetSize().Width()/20);
+ rDev.DrawGradient(r, aGradient);
+ }
+ };
+ struct DrawBitmap : public RegionRenderer
{
- Bitmap aBitmap(maIntroBW);
- aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
- rDev.DrawBitmap(r.TopLeft(), aBitmap);
- }
- void drawBitmapEx(OutputDevice &rDev, Rectangle r)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) SAL_OVERRIDE
+ {
+ Bitmap aBitmap(rCtx.mpDemoWin->maIntroBW);
+ aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
+ rDev.DrawBitmap(r.TopLeft(), aBitmap);
+ }
+ };
+ struct DrawBitmapEx : public RegionRenderer
{
- drawCheckered(rDev, r);
-
- BitmapEx aBitmap(maIntro);
- aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
- AlphaMask aSemiTransp(aBitmap.GetSizePixel());
- aSemiTransp.Erase(64);
- rDev.DrawBitmapEx(r.TopLeft(), BitmapEx(aBitmap.GetBitmap(),
- aSemiTransp));
- }
- void drawPolyPolgons(OutputDevice &rDev, Rectangle r)
+ DrawCheckered maCheckered;
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) SAL_OVERRIDE
+ {
+ maCheckered.RenderRegion(rDev, r, rCtx);
+
+ BitmapEx aBitmap(rCtx.mpDemoWin->maIntro);
+ aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
+ AlphaMask aSemiTransp(aBitmap.GetSizePixel());
+ aSemiTransp.Erase(64);
+ rDev.DrawBitmapEx(r.TopLeft(), BitmapEx(aBitmap.GetBitmap(),
+ aSemiTransp));
+ }
+ };
+ struct DrawPolyPolygons : public RegionRenderer
{
- struct {
- double nX, nY;
- } aPoints[] = { { 0.1, 0.1 }, { 0.9, 0.9 },
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ struct {
+ double nX, nY;
+ } aPoints[] = { { 0.1, 0.1 }, { 0.9, 0.9 },
#ifdef FIXME_SELF_INTERSECTING_WORKING
- { 0.9, 0.1 }, { 0.1, 0.9 },
- { 0.1, 0.1 } };
+ { 0.9, 0.1 }, { 0.1, 0.9 },
+ { 0.1, 0.1 }
#else
- { 0.1, 0.9 }, { 0.5, 0.5 },
- { 0.9, 0.1 }, { 0.1, 0.1 } };
+ { 0.1, 0.9 }, { 0.5, 0.5 },
+ { 0.9, 0.1 }, { 0.1, 0.1 }
#endif
+ };
- tools::PolyPolygon aPolyPoly;
- // Render 4x polygons & aggregate into another PolyPolygon
- for (int x = 0; x < 2; x++)
- {
- for (int y = 0; y < 2; y++)
+ tools::PolyPolygon aPolyPoly;
+ // Render 4x polygons & aggregate into another PolyPolygon
+ for (int x = 0; x < 2; x++)
{
- Rectangle aSubRect(r);
- aSubRect.Move(x * r.GetWidth()/3, y * r.GetHeight()/3);
- aSubRect.SetSize(Size(r.GetWidth()/2, r.GetHeight()/4));
- Polygon aPoly(SAL_N_ELEMENTS(aPoints));
- for (size_t v = 0; v < SAL_N_ELEMENTS(aPoints); v++)
+ for (int y = 0; y < 2; y++)
{
- aPoly.SetPoint(Point(aSubRect.Left() +
- aSubRect.GetWidth() * aPoints[v].nX,
- aSubRect.Top() +
- aSubRect.GetHeight() * aPoints[v].nY),
- v);
+ Rectangle aSubRect(r);
+ aSubRect.Move(x * r.GetWidth()/3, y * r.GetHeight()/3);
+ aSubRect.SetSize(Size(r.GetWidth()/2, r.GetHeight()/4));
+ Polygon aPoly(SAL_N_ELEMENTS(aPoints));
+ for (size_t v = 0; v < SAL_N_ELEMENTS(aPoints); v++)
+ {
+ aPoly.SetPoint(Point(aSubRect.Left() +
+ aSubRect.GetWidth() * aPoints[v].nX,
+ aSubRect.Top() +
+ aSubRect.GetHeight() * aPoints[v].nY),
+ v);
+ }
+ rDev.SetLineColor(Color(COL_YELLOW));
+ rDev.SetFillColor(Color(COL_BLACK));
+ rDev.DrawPolygon(aPoly);
+
+ // now move and add to the polypolygon
+ aPoly.Move(0, r.GetHeight()/2);
+ aPolyPoly.Insert(aPoly);
}
- rDev.SetLineColor(Color(COL_YELLOW));
- rDev.SetFillColor(Color(COL_BLACK));
- rDev.DrawPolygon(aPoly);
-
- // now move and add to the polypolygon
- aPoly.Move(0, r.GetHeight()/2);
- aPolyPoly.Insert(aPoly);
}
+ rDev.SetLineColor(Color(COL_LIGHTRED));
+ rDev.SetFillColor(Color(COL_GREEN));
+ rDev.DrawTransparent(aPolyPoly, 50);
}
- rDev.SetLineColor(Color(COL_LIGHTRED));
- rDev.SetFillColor(Color(COL_GREEN));
- rDev.DrawTransparent(aPolyPoly, 50);
- }
- void drawToVirtualDevice(OutputDevice &rDev, Rectangle r)
- {
- VirtualDevice aNested(rDev);
- aNested.SetOutputSizePixel(r.GetSize());
- Rectangle aWhole(Point(0,0), r.GetSize());
- // mini me
- drawToDevice(aNested, true);
-
- Bitmap aBitmap(aNested.GetBitmap(Point(0,0),aWhole.GetSize()));
- rDev.DrawBitmap(r.TopLeft(), aBitmap);
- }
+ };
- std::vector<BitmapEx> maIcons;
- void initIcons()
+ struct DrawToVirtualDevice : public RegionRenderer
{
- if (maIcons.size())
- return;
-
- const char *pNames[] = {
- "cmd/lc_openurl.png",
- "cmd/lc_newdoc.png",
- "cmd/lc_save.png",
- "cmd/lc_saveas.png",
- "cmd/lc_sendmail.png",
- "cmd/lc_editdoc.png",
- "cmd/lc_print.png",
- "cmd/lc_printpreview.png",
- "cmd/lc_cut.png",
- "cmd/lc_copy.png",
- "cmd/lc_paste.png",
- "cmd/lc_formatpaintbrush.png",
- "cmd/lc_undo.png",
- "cmd/lc_redo.png",
- };
- for (size_t i = 0; i < SAL_N_ELEMENTS(pNames); i++)
- maIcons.push_back(BitmapEx(OUString::createFromAscii(pNames[i])));
- }
- void drawIcons(OutputDevice &rDev, Rectangle r)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) SAL_OVERRIDE
+ {
+ // avoid infinite recursion
+ if (rCtx.mbVDev)
+ return;
+ VirtualDevice aNested(rDev);
+ aNested.SetOutputSizePixel(r.GetSize());
+ Rectangle aWhole(Point(0,0), r.GetSize());
+ // mini me
+ rCtx.mpDemoWin->drawToDevice(aNested, true);
+
+ Bitmap aBitmap(aNested.GetBitmap(Point(0,0),aWhole.GetSize()));
+ rDev.DrawBitmap(r.TopLeft(), aBitmap);
+ }
+ };
+
+ struct DrawIcons : public RegionRenderer
{
- initIcons();
+ std::vector<BitmapEx> maIcons;
+ DrawIcons()
+ {
+ const char *pNames[] = {
+ "cmd/lc_openurl.png",
+ "cmd/lc_newdoc.png",
+ "cmd/lc_save.png",
+ "cmd/lc_saveas.png",
+ "cmd/lc_sendmail.png",
+ "cmd/lc_editdoc.png",
+ "cmd/lc_print.png",
+ "cmd/lc_printpreview.png",
+ "cmd/lc_cut.png",
+ "cmd/lc_copy.png",
+ "cmd/lc_paste.png",
+ "cmd/lc_formatpaintbrush.png",
+ "cmd/lc_undo.png",
+ "cmd/lc_redo.png",
+ };
+ for (size_t i = 0; i < SAL_N_ELEMENTS(pNames); i++)
+ maIcons.push_back(BitmapEx(OUString::createFromAscii(pNames[i])));
+ }
- Rectangle p(r);
- for (size_t i = 0; i < maIcons.size(); i++)
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
{
- Size aSize(maIcons[i].GetSizePixel());
- rDev.DrawBitmapEx(p.TopLeft(), maIcons[i]);
- p.Move(aSize.Width(), 0);
- if (p.Left() >= r.Right())
- break;
+ Rectangle p(r);
+ for (size_t i = 0; i < maIcons.size(); i++)
+ {
+ Size aSize(maIcons[i].GetSizePixel());
+ rDev.DrawBitmapEx(p.TopLeft(), maIcons[i]);
+ p.Move(aSize.Width(), 0);
+ if (p.Left() >= r.Right())
+ break;
+ }
}
- }
+ };
- void fetchDrawBitmap(OutputDevice &rDev, Rectangle r)
+ struct FetchDrawBitmap : public RegionRenderer
{
- Bitmap aBitmap(rDev.GetBitmap(Point(0,0),rDev.GetOutputSizePixel()));
- aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
- rDev.DrawBitmap(r.TopLeft(), aBitmap);
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &) SAL_OVERRIDE
+ {
+ Bitmap aBitmap(rDev.GetBitmap(Point(0,0),rDev.GetOutputSizePixel()));
+ aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
+ rDev.DrawBitmap(r.TopLeft(), aBitmap);
+ }
+ };
+
+ void drawToDevice(OutputDevice &rDev, bool bVdev)
+ {
+ RenderContext aCtx;
+ aCtx.meStyle = RENDER_THUMB;
+ aCtx.mbVDev = bVdev;
+ aCtx.mpDemoWin = this;
+
+ drawBackground(rDev);
+
+ std::vector<Rectangle> aRegions(partitionAndClear(rDev, 4, 3));
+ for (size_t i = 0; i < maRenderers.size(); i++)
+ maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx);
}
};
@@ -366,26 +451,20 @@ std::vector<Rectangle> DemoWin::partitionAndClear(OutputDevice &rDev, int nX, in
return aRegions;
}
-void DemoWin::drawToDevice(OutputDevice &rDev, bool bVdev)
+void DemoWin::InitRenderers()
{
- drawBackground(rDev);
-
- std::vector<Rectangle> aRegions(partitionAndClear(rDev, 4, 3));
-
- drawRadialLines(rDev, aRegions[0]);
- drawText(rDev, aRegions[1]);
- drawPoly(rDev, aRegions[2]);
- drawEllipse(rDev, aRegions[3]);
- drawCheckered(rDev, aRegions[4]);
- drawBitmapEx(rDev, aRegions[5]);
- drawBitmap(rDev, aRegions[6]);
- drawGradient(rDev, aRegions[7]);
- drawPolyPolgons(rDev, aRegions[8]);
- if (!bVdev)
- drawToVirtualDevice(rDev, aRegions[9]);
- drawIcons(rDev, aRegions[10]);
- // last - thumbnail all the above
- fetchDrawBitmap(rDev, aRegions[11]);
+ maRenderers.push_back(new DrawRadialLines());
+ maRenderers.push_back(new DrawText());
+ maRenderers.push_back(new DrawPoly());
+ maRenderers.push_back(new DrawEllipse());
+ maRenderers.push_back(new DrawCheckered());
+ maRenderers.push_back(new DrawBitmapEx());
+ maRenderers.push_back(new DrawBitmap());
+ maRenderers.push_back(new DrawGradient());
+ maRenderers.push_back(new DrawPolyPolygons());
+ maRenderers.push_back(new DrawToVirtualDevice());
+ maRenderers.push_back(new DrawIcons());
+ maRenderers.push_back(new DrawBitmap());
}
class DemoApp : public Application
commit 880310280901f7fc2966724265b7ba331244c07e
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Tue Nov 11 21:51:58 2014 +0000
vcldemo: click to invalidate bits and bounce a floatwin around.
Change-Id: I0c417842393eb32132fd430b8bf31e93e7ec3b27
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 354c4b3..00bab53 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -23,6 +23,8 @@
#include <vcl/wrkwin.hxx>
#include <vcl/virdev.hxx>
#include <vcl/graphicfilter.hxx>
+#include <vcl/button.hxx>
+#include <vcl/floatwin.hxx>
#if 0
# define FIXME_SELF_INTERSECTING_WORKING
@@ -47,6 +49,8 @@ class DemoWin : public DemoBase
public:
DemoWin() : DemoBase()
+ , mpButton(NULL)
+ , mpButtonWin(NULL)
{
if (!Application::LoadBrandBitmap("intro", maIntro))
Application::Abort("Failed to load intro image");
@@ -54,6 +58,15 @@ public:
maIntroBW.Filter( BMP_FILTER_EMBOSS_GREY );
}
+ // Bouncing windows on click ...
+ PushButton *mpButton;
+ FloatingWindow *mpButtonWin;
+ AutoTimer maBounce;
+ int mnBounceX, mnBounceY;
+ DECL_LINK(BounceTimerCb, void *);
+
+ virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
+
void drawToDevice(OutputDevice &r, bool bVdev);
virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE
@@ -272,6 +285,54 @@ public:
}
};
+IMPL_LINK_NOARG(DemoWin,BounceTimerCb)
+{
+ mpButton->Check(mnBounceX>0);
+ mpButton->SetPressed(mnBounceY>0);
+
+ Point aCur = mpButtonWin->GetPosPixel();
+ static const int nMovePix = 10;
+ aCur.Move(mnBounceX * nMovePix, mnBounceX * nMovePix);
+ Size aWinSize = GetSizePixel();
+ if (aCur.X() <= 0 || aCur.X() >= aWinSize.Width())
+ mnBounceX *= -1;
+ if (aCur.Y() <= 0 || aCur.Y() >= aWinSize.Height())
+ mnBounceX *= -1;
+ mpButtonWin->SetPosPixel(aCur);
+
+ // All smoke and mirrors to test sub-region invalidation underneath
+ Rectangle aRect(aCur, mpButtonWin->GetSizePixel());
+ Invalidate(aRect);
+ return 0;
+}
+
+void DemoWin::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ (void) rMEvt;
+ if (!mpButton)
+ {
+ mpButtonWin = new FloatingWindow(this);
+ mpButton = new PushButton(mpButtonWin);
+ mpButton->SetSymbol(SymbolType::HELP);
+ mpButton->SetText("PushButton demo");
+ mpButton->SetPosSizePixel(Point(0,0), mpButton->GetOptimalSize());
+ mpButton->Show();
+ mpButtonWin->SetPosSizePixel(Point(0,0), mpButton->GetOptimalSize());
+ mpButtonWin->Show();
+ mnBounceX = 1; mnBounceX = 1;
+ maBounce.SetTimeoutHdl(LINK(this,DemoWin,BounceTimerCb));
+ maBounce.SetTimeout(55);
+ maBounce.Start();
+ }
+ else
+ {
+ maBounce.Stop();
+ delete mpButtonWin;
+ mpButtonWin = NULL;
+ mpButton = NULL;
+ }
+}
+
std::vector<Rectangle> DemoWin::partitionAndClear(OutputDevice &rDev, int nX, int nY)
{
Rectangle r;
commit 355770eff40acc07e9cd46fa4dcfb39e6a86166e
Author: Samuel Mehrbrodt <s.mehrbrodt at gmail.com>
Date: Tue Nov 11 21:47:01 2014 +0100
fdo82708 Add missing tooltips to Writer Statusbar
Change-Id: Ie44b8de69b98ebfa789cc8f9a1d8a60b698fc154
Reviewed-on: https://gerrit.libreoffice.org/12368
Reviewed-by: Samuel Mehrbrodt <s.mehrbrodt at gmail.com>
Tested-by: Samuel Mehrbrodt <s.mehrbrodt at gmail.com>
diff --git a/framework/inc/classes/resource.hrc b/framework/inc/classes/resource.hrc
index 9c02511..a74b314 100644
--- a/framework/inc/classes/resource.hrc
+++ b/framework/inc/classes/resource.hrc
@@ -50,6 +50,7 @@
#define STR_RESET_TO_DEFAULT_LANGUAGE (RID_STR_START+22)
#define STR_CLEAR_RECENT_FILES (RID_STR_START+23)
#define STR_CLEAR_RECENT_FILES_HELP (RID_STR_START+24)
+#define STR_LANGSTATUS_HINT (RID_STR_START+25)
#define POPUPMENU_TOOLBAR_QUICKCUSTOMIZATION (RID_MENU_START+0)
diff --git a/framework/source/classes/resource.src b/framework/source/classes/resource.src
index 1f4f5df..8411220 100644
--- a/framework/source/classes/resource.src
+++ b/framework/source/classes/resource.src
@@ -190,4 +190,9 @@ String STR_SET_LANGUAGE_FOR_ALL_TEXT
Text [ en-US ] = "Set Language for all Text" ;
};
+String STR_LANGSTATUS_HINT
+{
+ Text [ en-US ] = "Text Language. Right-click to set selection or paragraph language" ;
+};
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uielement/langselectionstatusbarcontroller.cxx b/framework/source/uielement/langselectionstatusbarcontroller.cxx
index f043c1d..004e43c 100644
--- a/framework/source/uielement/langselectionstatusbarcontroller.cxx
+++ b/framework/source/uielement/langselectionstatusbarcontroller.cxx
@@ -146,6 +146,7 @@ throw (css::uno::Exception, css::uno::RuntimeException, std::exception)
if ( m_xStatusbarItem.is() )
{
m_xStatusbarItem->setText( FWK_RESSTR(STR_LANGSTATUS_MULTIPLE_LANGUAGES) );
+ m_xStatusbarItem->setQuickHelpText(FWK_RESSTR(STR_LANGSTATUS_HINT));
}
}
diff --git a/include/svx/dialogs.hrc b/include/svx/dialogs.hrc
index 067298f..495cae8 100644
--- a/include/svx/dialogs.hrc
+++ b/include/svx/dialogs.hrc
@@ -1045,9 +1045,13 @@
#define RID_SVXSTR_RECOVERY_INPROGRESS (RID_SVX_START + 1288)
#define RID_SVXSTR_RECOVERYONLY_FINISH_DESCR (RID_SVX_START + 1289)
#define RID_SVXSTR_RECOVERYONLY_FINISH (RID_SVX_START + 1290)
+#define RID_SVXSTR_ZOOMTOOL_HINT (RID_SVX_START + 1291)
+#define RID_SVXSTR_ZOOM (RID_SVX_START + 1292)
+#define RID_SVXSTR_ZOOM_IN (RID_SVX_START + 1293)
+#define RID_SVXSTR_ZOOM_OUT (RID_SVX_START + 1294)
// !!! IMPORTANT: consider and update RID_SVXSTR_NEXTFREE when introducing new RIDs for Strings !!!
-#define RID_SVXSTR_NEXTFREE (RID_SVX_START + 1291)
+#define RID_SVXSTR_NEXTFREE (RID_SVX_START + 1295)
// if we have _a_lot_ time, we should group the resource ids by type, instead
// of grouping them by semantics. The reason is that resource ids have to be
diff --git a/svx/source/stbctrls/stbctrls.src b/svx/source/stbctrls/stbctrls.src
index a9e98a7..3a997bc 100644
--- a/svx/source/stbctrls/stbctrls.src
+++ b/svx/source/stbctrls/stbctrls.src
@@ -121,6 +121,26 @@ String RID_SVXSTR_FIT_SLIDE
Text [ en-US ] = "Fit slide to current window.";
};
+String RID_SVXSTR_ZOOMTOOL_HINT
+{
+ Text [ en-US ] = "Zoom level. Click for dialog box and right-click for zoom list";
+};
+
+String RID_SVXSTR_ZOOM
+{
+ Text [ en-US ] = "Adjust zoom level";
+};
+
+String RID_SVXSTR_ZOOM_IN
+{
+ Text [ en-US ] = "Zoom in";
+};
+
+String RID_SVXSTR_ZOOM_OUT
+{
+ Text [ en-US ] = "Zoom out";
+};
+
// PopupMenu -------------------------------------------------------------
Menu RID_SVXMNU_ZOOM
{
diff --git a/svx/source/stbctrls/zoomctrl.cxx b/svx/source/stbctrls/zoomctrl.cxx
index 01a6924..63210fe 100644
--- a/svx/source/stbctrls/zoomctrl.cxx
+++ b/svx/source/stbctrls/zoomctrl.cxx
@@ -103,6 +103,7 @@ SvxZoomStatusBarControl::SvxZoomStatusBarControl( sal_uInt16 _nSlotId,
nZoom( 100 ),
nValueSet( SVX_ZOOM_ENABLE_ALL )
{
+ GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(RID_SVXSTR_ZOOMTOOL_HINT));
}
void SvxZoomStatusBarControl::StateChanged( sal_uInt16, SfxItemState eState,
diff --git a/svx/source/stbctrls/zoomsliderctrl.cxx b/svx/source/stbctrls/zoomsliderctrl.cxx
index 6f5b400..8ea241b 100644
--- a/svx/source/stbctrls/zoomsliderctrl.cxx
+++ b/svx/source/stbctrls/zoomsliderctrl.cxx
@@ -351,14 +351,13 @@ bool SvxZoomSliderControl::MouseMove( const MouseEvent & rEvt )
return true;
const short nButtons = rEvt.GetButtons();
+ const Rectangle aControlRect = getControlRect();
+ const Point aPoint = rEvt.GetPosPixel();
+ const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
// check mouse move with button pressed
if ( 1 == nButtons )
{
- const Rectangle aControlRect = getControlRect();
- const Point aPoint = rEvt.GetPosPixel();
- const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
-
if ( nXDiff >= nSliderXOffset && nXDiff <= aControlRect.GetWidth() - nSliderXOffset )
{
mpImpl->mnCurrentZoom = Offset2Zoom( nXDiff );
@@ -367,6 +366,23 @@ bool SvxZoomSliderControl::MouseMove( const MouseEvent & rEvt )
}
}
+ // Tooltips
+
+ long nIncDecWidth = mpImpl->maIncreaseButton.GetSizePixel().Width();
+
+ const long nButtonLeftOffset = (nSliderXOffset - nIncDecWidth)/2;
+ const long nButtonRightOffset = (nSliderXOffset + nIncDecWidth)/2;
+
+ // click to - button
+ if ( nXDiff >= nButtonLeftOffset && nXDiff <= nButtonRightOffset )
+ GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(RID_SVXSTR_ZOOM_OUT));
+ // click to + button
+ else if ( nXDiff >= aControlRect.GetWidth() - nSliderXOffset + nButtonLeftOffset &&
+ nXDiff <= aControlRect.GetWidth() - nSliderXOffset + nButtonRightOffset )
+ GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(RID_SVXSTR_ZOOM_IN));
+ else
+ GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(RID_SVXSTR_ZOOM));
+
return true;
}
diff --git a/sw/AllLangResTarget_sw.mk b/sw/AllLangResTarget_sw.mk
index c4c7780..c95c16a 100644
--- a/sw/AllLangResTarget_sw.mk
+++ b/sw/AllLangResTarget_sw.mk
@@ -80,6 +80,7 @@ $(eval $(call gb_SrsTarget_add_files,sw/res,\
sw/source/uibase/utlui/attrdesc.src \
sw/source/uibase/utlui/navipi.src \
sw/source/uibase/utlui/initui.src \
+ sw/source/uibase/utlui/statusbar.src \
sw/source/uibase/wrtsh/wrtsh.src \
sw/source/uibase/utlui/unotools.src \
sw/source/uibase/dbui/mailmergechildwindow.src \
diff --git a/sw/inc/rcid.hrc b/sw/inc/rcid.hrc
index 4e8428a..0af4762 100644
--- a/sw/inc/rcid.hrc
+++ b/sw/inc/rcid.hrc
@@ -40,7 +40,6 @@
#define RC_FRMDLG (RC_BASE + 1000)
#define RC_FLDDLG (RC_BASE + 1100)
#define RC_UTLUI (RC_BASE + 1250)
-#define RC_ATTR (RC_BASE + 1350)
#define RC_TABLE (RC_BASE + 1450)
#define RC_CONFIG (RC_BASE + 1550)
#define RC_MISC (RC_BASE + 1650)
@@ -71,6 +70,7 @@
#define RC_PAGEFRM (RC_BASE + 4250)
#define RC_IDXTXT (RC_BASE + 4350)
#define RC_SIDEBAR (RC_BASE + 4450)
+#define RC_ATTR (RC_BASE + 4550)
/*--------------------------------------------------------------------
Description: areas unharness
@@ -149,11 +149,7 @@
// Utilities UI
#define RC_UTLUI_BEGIN RC_UTLUI
-#define RC_UTLUI_END (RC_UTLUI + 99)
-
-// Utilities UI-Attributes
-#define RC_ATTR_BEGIN RC_ATTR
-#define RC_ATTR_END (RC_ATTR + 99)
+#define RC_UTLUI_END (RC_UTLUI + 199)
// Tables
#define RC_TABLE_BEGIN RC_TABLE
@@ -258,6 +254,11 @@
// sidebar (mostly the Page one)
#define RC_SIDEBAR_BEGIN RC_SIDEBAR
+#define RC_SIDEBAR_END (RC_SIDEBAR + 99)
+
+// Utilities UI-Attributes
+#define RC_ATTR_BEGIN RC_ATTR
+#define RC_ATTR_END (RC_ATTR + 99)
#endif
diff --git a/sw/source/uibase/inc/utlui.hrc b/sw/source/uibase/inc/utlui.hrc
index 9007b88..4caa3b3 100644
--- a/sw/source/uibase/inc/utlui.hrc
+++ b/sw/source/uibase/inc/utlui.hrc
@@ -45,7 +45,15 @@
#define STR_CONTENT_TYPE_INDEX (RC_UTLUI_BEGIN + 17)
#define STR_CONTENT_TYPE_POSTIT (RC_UTLUI_BEGIN + 18)
#define STR_CONTENT_TYPE_DRAWOBJECT (RC_UTLUI_BEGIN + 19)
-#define STR_CONTENT_END (RC_UTLUI_BEGIN + 19)
+// Statusbar: Word count/Viewlayout/Page count
+#define STR_WORDCOUNT_HINT (RC_UTLUI_BEGIN + 20)
+#define STR_VIEWLAYOUT_ONE (RC_UTLUI_BEGIN + 21)
+#define STR_VIEWLAYOUT_TWO (RC_UTLUI_BEGIN + 22)
+#define STR_VIEWLAYOUT_BOOK (RC_UTLUI_BEGIN + 23)
+#define STR_BOOKCTRL_HINT (RC_UTLUI_BEGIN + 24)
+#define STR_BOOKCTRL_HINT_EXTENDED (RC_UTLUI_BEGIN + 25)
+#define STR_TMPLCTRL_HINT (RC_UTLUI_BEGIN + 26)
+#define STR_CONTENT_END (RC_UTLUI_BEGIN + 26)
#define STR_CONTENT_TYPE_SINGLE_FIRST (STR_CONTENT_END + 1)
#define STR_CONTENT_TYPE_SINGLE_OUTLINE (STR_CONTENT_TYPE_SINGLE_FIRST + 0)
@@ -142,13 +150,13 @@
#define IMG_NAVI_ENTRYBMP (RC_UTLUI_BEGIN + 4)
#define ILIST_DB_DLG (RC_UTLUI_BEGIN + 6)
-#define IMG_VIEWLAYOUT_AUTOMATIC (RC_UTLUI_BEGIN + 12)
-#define IMG_VIEWLAYOUT_AUTOMATIC_ACTIVE (RC_UTLUI_BEGIN + 13)
-#define IMG_VIEWLAYOUT_BOOKMODE (RC_UTLUI_BEGIN + 14)
-#define IMG_VIEWLAYOUT_BOOKMODE_ACTIVE (RC_UTLUI_BEGIN + 15)
-#define IMG_VIEWLAYOUT_SINGLECOLUMN (RC_UTLUI_BEGIN + 16)
-#define IMG_VIEWLAYOUT_SINGLECOLUMN_ACTIVE (RC_UTLUI_BEGIN + 17)
-#define IMG_PAGE_BREAK (RC_UTLUI_BEGIN + 18)
+#define IMG_VIEWLAYOUT_AUTOMATIC (RC_UTLUI_BEGIN + 12)
+#define IMG_VIEWLAYOUT_AUTOMATIC_ACTIVE (RC_UTLUI_BEGIN + 13)
+#define IMG_VIEWLAYOUT_BOOKMODE (RC_UTLUI_BEGIN + 14)
+#define IMG_VIEWLAYOUT_BOOKMODE_ACTIVE (RC_UTLUI_BEGIN + 15)
+#define IMG_VIEWLAYOUT_SINGLECOLUMN (RC_UTLUI_BEGIN + 16)
+#define IMG_VIEWLAYOUT_SINGLECOLUMN_ACTIVE (RC_UTLUI_BEGIN + 17)
+#define IMG_PAGE_BREAK (RC_UTLUI_BEGIN + 18)
//local ids of the Database ImageLists
#define IMG_COLLAPSE 18002 /*RID_SVXIMG_COLLAPSEDNODE*/
diff --git a/sw/source/uibase/inc/viewlayoutctrl.hxx b/sw/source/uibase/inc/viewlayoutctrl.hxx
index 0816b001..fb47e04 100644
--- a/sw/source/uibase/inc/viewlayoutctrl.hxx
+++ b/sw/source/uibase/inc/viewlayoutctrl.hxx
@@ -38,6 +38,7 @@ public:
virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) SAL_OVERRIDE;
virtual void Paint( const UserDrawEvent& rEvt ) SAL_OVERRIDE;
virtual bool MouseButtonDown( const MouseEvent & ) SAL_OVERRIDE;
+ virtual bool MouseMove( const MouseEvent & ) SAL_OVERRIDE;
};
#endif
diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx
index 159941f..1625a88 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -1278,9 +1278,16 @@ void SwView::UpdatePageNums(sal_uInt16 nPhyNum, sal_uInt16 nVirtNum, const OUStr
{
OUString sTemp(GetPageStr( nPhyNum, nVirtNum, rPgStr ));
const SfxStringItem aTmp( FN_STAT_PAGE, sTemp );
+ // Used to distinguish which tooltip to show
+ const SfxBoolItem bExtendedTooltip( FN_STAT_PAGE,
+ !rPgStr.isEmpty() && OUString::number(nPhyNum) != rPgStr
+ && nPhyNum != nVirtNum );
+
SfxBindings &rBnd = GetViewFrame()->GetBindings();
rBnd.SetState( aTmp );
rBnd.Update( FN_STAT_PAGE );
+ rBnd.SetState( bExtendedTooltip );
+ rBnd.Update( FN_STAT_PAGE );
}
void SwView::UpdateDocStats()
diff --git a/sw/source/uibase/utlui/bookctrl.cxx b/sw/source/uibase/utlui/bookctrl.cxx
index e4e5c90..70a913f 100644
--- a/sw/source/uibase/utlui/bookctrl.cxx
+++ b/sw/source/uibase/utlui/bookctrl.cxx
@@ -18,6 +18,8 @@
*/
#include "hintids.hxx"
+#include <swtypes.hxx>
+#include <utlui.hrc>
#include <svl/intitem.hxx>
#include <svl/stritem.hxx>
@@ -79,6 +81,14 @@ void SwBookmarkControl::StateChanged(
sPageNumber = ((SfxStringItem*)pState)->GetValue();
GetStatusBar().SetItemText( GetId(), sPageNumber );
}
+ else if ( pState->ISA( SfxBoolItem ) )
+ {
+ if (((SfxBoolItem*)pState)->GetValue()) // Indicates whether to show extended tooltip
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_BOOKCTRL_HINT_EXTENDED));
+ else
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_BOOKCTRL_HINT));
+ }
+
}
void SwBookmarkControl::Paint( const UserDrawEvent& )
diff --git a/sw/source/uibase/utlui/statusbar.src b/sw/source/uibase/utlui/statusbar.src
new file mode 100644
index 0000000..dcb5bba
--- /dev/null
+++ b/sw/source/uibase/utlui/statusbar.src
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <utlui.hrc>
+
+String STR_WORDCOUNT_HINT
+{
+ Text [ en-US ] = "Word and character count. Click for more extensive stats";
+};
+String STR_VIEWLAYOUT_ONE
+{
+ Text [ en-US ] = "Single page view";
+};
+
+String STR_VIEWLAYOUT_TWO
+{
+ Text [ en-US ] = "Two page view";
+};
+
+String STR_VIEWLAYOUT_BOOK
+{
+ Text [ en-US ] = "Book view";
+};
+String STR_BOOKCTRL_HINT
+{
+ Text [ en-US ] = "Page number/Total pages. Click to show Navigator";
+};
+String STR_BOOKCTRL_HINT_EXTENDED
+{
+ Text [ en-US ] = "Document page number/Total pages (Print page number). Click to show Navigator";
+};
+String STR_TMPLCTRL_HINT
+{
+ Text [ en-US ] = "Page Style. Right-click to change style and click to modify style";
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/utlui/tmplctrl.cxx b/sw/source/uibase/utlui/tmplctrl.cxx
index a22c112..1046b05 100644
--- a/sw/source/uibase/utlui/tmplctrl.cxx
+++ b/sw/source/uibase/utlui/tmplctrl.cxx
@@ -23,6 +23,9 @@
#include <sfx2/dispatch.hxx>
#include <vcl/status.hxx>
+#include <swtypes.hxx>
+#include <utlui.hrc>
+
#include "wrtsh.hxx"
#include "view.hxx"
#include "swmodule.hxx"
@@ -56,13 +59,12 @@ void SwTemplatePopup_Impl::Select()
nCurId = GetCurItemId();
}
-// class SvxZoomStatusBarControl
-
SwTemplateControl::SwTemplateControl( sal_uInt16 _nSlotId,
sal_uInt16 _nId,
StatusBar& rStb ) :
SfxStatusBarControl( _nSlotId, _nId, rStb )
{
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_TMPLCTRL_HINT));
}
SwTemplateControl::~SwTemplateControl()
diff --git a/sw/source/uibase/utlui/viewlayoutctrl.cxx b/sw/source/uibase/utlui/viewlayoutctrl.cxx
index bc58ff8..b3204ee 100644
--- a/sw/source/uibase/utlui/viewlayoutctrl.cxx
+++ b/sw/source/uibase/utlui/viewlayoutctrl.cxx
@@ -191,4 +191,32 @@ bool SwViewLayoutControl::MouseButtonDown( const MouseEvent & rEvt )
return true;
}
+bool SwViewLayoutControl::MouseMove( const MouseEvent & rEvt )
+{
+ const Rectangle aRect = getControlRect();
+ const Point aPoint = rEvt.GetPosPixel();
+ const long nXDiff = aPoint.X() - aRect.Left();
+
+ const long nImageWidthSingle = mpImpl->maImageSingleColumn.GetSizePixel().Width();
+ const long nImageWidthAuto = mpImpl->maImageAutomatic.GetSizePixel().Width();
+ const long nImageWidthBook = mpImpl->maImageBookMode.GetSizePixel().Width();
+ const long nImageWidthSum = nImageWidthSingle + nImageWidthAuto + nImageWidthBook;
+
+ const long nXOffset = (aRect.GetWidth() - nImageWidthSum)/2;
+
+ if ( nXDiff < nXOffset + nImageWidthSingle )
+ {
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_VIEWLAYOUT_ONE));
+ }
+ else if ( nXDiff < nXOffset + nImageWidthSingle + nImageWidthAuto )
+ {
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_VIEWLAYOUT_TWO));
+ }
+ else
+ {
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_VIEWLAYOUT_BOOK));
+ }
+ return true;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/utlui/wordcountctrl.cxx b/sw/source/uibase/utlui/wordcountctrl.cxx
index 3d3ac34..58fe4b4 100644
--- a/sw/source/uibase/utlui/wordcountctrl.cxx
+++ b/sw/source/uibase/utlui/wordcountctrl.cxx
@@ -7,6 +7,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+#include <swtypes.hxx>
+#include <utlui.hrc>
#include "wordcountctrl.hxx"
#include <svl/stritem.hxx>
@@ -29,6 +31,8 @@ void SwWordCountStatusBarControl::StateChanged(
{
if (eState == SfxItemState::DEFAULT) // Can access pState
GetStatusBar().SetItemText( GetId(), ((SfxStringItem*)pState)->GetValue() );
+
+ GetStatusBar().SetQuickHelpText(GetId(), SW_RESSTR(STR_WORDCOUNT_HINT));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 93b34d091756de6fc3e5424aa45e00397146cc51
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Nov 11 21:33:53 2014 +0100
vcl: Use the fast path for rendering.
There was a discrepancy between the comment and the code; and I believe the
comment was right, and the code wrong - so adapted the code accordingly.
[I guess we will want to kill this condition for good when rendering via
OpenGL at some stage; the assert() will tell us ;-)]
Change-Id: I651261373068e975004c898b2a930c602c158b64
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx
index 4955b4b..9a2e56d 100644
--- a/vcl/source/outdev/bitmap.cxx
+++ b/vcl/source/outdev/bitmap.cxx
@@ -527,7 +527,7 @@ void OutputDevice::DrawDeviceBitmap( const Point& rDestPt, const Size& rDestSize
// only paint direct when no scaling and no MapMode, else the
// more expensive conversions may be done for short-time Bitmap/BitmapEx
// used for buffering only
- if(!IsMapMode() && aPosAry.mnSrcWidth == aPosAry.mnDestWidth && aPosAry.mnSrcHeight == aPosAry.mnDestHeight)
+ if (IsMapMode() || aPosAry.mnSrcWidth != aPosAry.mnDestWidth || aPosAry.mnSrcHeight != aPosAry.mnDestHeight)
{
bTryDirectPaint = false;
}
@@ -661,18 +661,16 @@ void OutputDevice::DrawDeviceAlphaBitmap( const Bitmap& rBmp, const AlphaMask& r
// separate alpha VDev
bool bTryDirectPaint(!mpAlphaVDev && !pDisableNative && !bHMirr && !bVMirr);
-#ifdef WNT
- if(bTryDirectPaint)
+ if (bTryDirectPaint)
{
// only paint direct when no scaling and no MapMode, else the
// more expensive conversions may be done for short-time Bitmap/BitmapEx
// used for buffering only
- if(!IsMapMode() && rSrcSizePixel.Width() == aOutSz.Width() && rSrcSizePixel.Height() == aOutSz.Height())
+ if (IsMapMode() || rSrcSizePixel.Width() != aOutSz.Width() || rSrcSizePixel.Height() != aOutSz.Height())
{
bTryDirectPaint = false;
}
}
-#endif
if(bTryDirectPaint)
{
commit d87b163f8dc787d3bbb17d4a0008ef60c61fe6b0
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Nov 11 21:25:07 2014 +0100
windows opengl: Make sure we don't reach the slow parts of the code.
Change-Id: I2a4d1bd294d1d88651c8556091f5453ef0aa5293
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx
index 20e6367..4955b4b 100644
--- a/vcl/source/outdev/bitmap.cxx
+++ b/vcl/source/outdev/bitmap.cxx
@@ -20,6 +20,7 @@
#include <vcl/bitmap.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/bmpacc.hxx>
+#include <vcl/opengl/OpenGLHelper.hxx>
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
#include <vcl/image.hxx>
@@ -32,7 +33,6 @@
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <boost/scoped_array.hpp>
-
void OutputDevice::DrawBitmap( const Point& rDestPt, const Bitmap& rBitmap )
{
const Size aSizePix( rBitmap.GetSizePixel() );
@@ -656,7 +656,6 @@ void OutputDevice::DrawDeviceAlphaBitmap( const Bitmap& rBmp, const AlphaMask& r
if( !aDstRect.Intersection( Rectangle( aOutPt, aOutSz ) ).IsEmpty() )
{
- bool bNativeAlpha = false;
static const char* pDisableNative = getenv( "SAL_DISABLE_NATIVE_ALPHA");
// #i83087# Naturally, system alpha blending cannot work with
// separate alpha VDev
@@ -686,14 +685,18 @@ void OutputDevice::DrawDeviceAlphaBitmap( const Bitmap& rBmp, const AlphaMask& r
};
SalBitmap* pSalSrcBmp = rBmp.ImplGetImpBitmap()->ImplGetSalBitmap();
SalBitmap* pSalAlphaBmp = rAlpha.ImplGetImpBitmap()->ImplGetSalBitmap();
- bNativeAlpha = mpGraphics->DrawAlphaBitmap( aTR, *pSalSrcBmp, *pSalAlphaBmp, this );
+
+ if (mpGraphics->DrawAlphaBitmap( aTR, *pSalSrcBmp, *pSalAlphaBmp, this ))
+ return;
}
+ // we need to make sure OpenGL never reaches this slow code path
+ assert(!OpenGLHelper::isVCLOpenGLEnabled());
+
VirtualDevice* pOldVDev = mpAlphaVDev;
Rectangle aBmpRect( Point(), rBmp.GetSizePixel() );
- if( !bNativeAlpha
- && !aBmpRect.Intersection( Rectangle( rSrcPtPixel, rSrcSizePixel ) ).IsEmpty() )
+ if (!aBmpRect.Intersection(Rectangle(rSrcPtPixel, rSrcSizePixel)).IsEmpty())
{
// The scaling in this code path produces really ugly results - it
// does the most trivial scaling with no smoothing.
commit d9fbaf248ea907428c3a5d0422d0c9a9ce50b907
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Nov 11 21:19:02 2014 +0100
windows opengl: Instantiate OpenGLSalBitmap even on Windows.
Change-Id: I2229141cc12ad7bc9fccfd6e2c7fec44ac4f6284
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 8a2f89b..2cf9806 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -865,6 +865,9 @@ void OpenGLSalGraphicsImpl::copyBits( const SalTwoRect& rPosAry, SalGraphics* /*
void OpenGLSalGraphicsImpl::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap )
{
+ // check that carefully only in the debug mode
+ assert(dynamic_cast<const OpenGLSalBitmap*>(&rSalBitmap));
+
const OpenGLSalBitmap& rBitmap = static_cast<const OpenGLSalBitmap&>(rSalBitmap);
GLuint nTexture = rBitmap.GetTexture( maContext );
const Size aSize = rSalBitmap.GetSize();
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index 5a93aaa..e4f9205 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -34,6 +34,7 @@ static bool isValidBitCount( sal_uInt16 nBitCount )
OpenGLSalBitmap::OpenGLSalBitmap()
: mpContext(NULL)
+, mpTexture(NULL)
, mbDirtyTexture(true)
, mnBits(0)
, mnBytesPerRow(0)
@@ -57,7 +58,7 @@ bool OpenGLSalBitmap::Create( OpenGLContext& rContext, OpenGLTextureSharedPtr pT
static const BitmapPalette aEmptyPalette;
Destroy();
- SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create from FBO" );
+ SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create from FBO: [" << nX << ", " << nY << "] " << nWidth << "x" << nHeight );
mpContext = &rContext;
mnWidth = nWidth;
@@ -83,7 +84,7 @@ bool OpenGLSalBitmap::Create( OpenGLContext& rContext, OpenGLTextureSharedPtr pT
bool OpenGLSalBitmap::Create( const Size& rSize, sal_uInt16 nBits, const BitmapPalette& rBitmapPalette )
{
Destroy();
- SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create with size" );
+ SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create with size: " << rSize );
if( !isValidBitCount( nBits ) )
return false;
@@ -106,9 +107,12 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, SalGraphics* pGraphics )
bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount )
{
+ // check that carefully only in the debug mode
+ assert(dynamic_cast<const OpenGLSalBitmap*>(&rSalBmp));
+
const OpenGLSalBitmap& rSourceBitmap = static_cast<const OpenGLSalBitmap&>(rSalBmp);
- SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create from BMP " << rSourceBitmap.mnHeight );
+ SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create from BMP: " << rSourceBitmap.mnWidth << "x" << rSourceBitmap.mnHeight );
if( isValidBitCount( nNewBitCount ) )
{
@@ -328,6 +332,7 @@ Size OpenGLSalBitmap::GetSize() const
GLuint OpenGLSalBitmap::CreateTexture()
{
+ SAL_INFO( "vcl.opengl", "::CreateTexture" );
GLenum nFormat = GL_RGBA;
GLenum nType = GL_UNSIGNED_BYTE;
sal_uInt8* pData( NULL );
diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx
index b1d33e4..a601ff5 100644
--- a/vcl/win/source/app/salinst.cxx
+++ b/vcl/win/source/app/salinst.cxx
@@ -26,9 +26,11 @@
#include <tools/solarmutex.hxx>
-#include <vcl/timer.hxx>
#include <vcl/apptypes.hxx>
+#include <vcl/opengl/OpenGLHelper.hxx>
+#include <vcl/timer.hxx>
+#include <opengl/salbmp.hxx>
#include <win/wincomp.hxx>
#include <win/salids.hrc>
#include <win/saldata.hxx>
@@ -1007,7 +1009,10 @@ SalTimer* WinSalInstance::CreateSalTimer()
SalBitmap* WinSalInstance::CreateSalBitmap()
{
- return new WinSalBitmap();
+ if (OpenGLHelper::isVCLOpenGLEnabled())
+ return new OpenGLSalBitmap();
+ else
+ return new WinSalBitmap();
}
class WinImeStatus : public SalI18NImeStatus
commit a237e0838196774cceeffe984d614198dbabd21e
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Tue Nov 11 19:37:53 2014 +0100
Copy the original prop/prop unit
...instead of scaling the translated nNewHeight once more by the original prop
Change-Id: Iadb53361a79f0b37b3c7c50066e4cfb7d24ed5e8
diff --git a/editeng/source/editeng/eertfpar.cxx b/editeng/source/editeng/eertfpar.cxx
index 641b5b9..4eb6a03 100644
--- a/editeng/source/editeng/eertfpar.cxx
+++ b/editeng/source/editeng/eertfpar.cxx
@@ -315,7 +315,10 @@ void EditRTFParser::SetAttrInDoc( SvxRTFItemStackType &rSet )
long nNewHeight;
nNewHeight = OutputDevice::LogicToLogic( (long)nHeight, eSrcUnit, eDestUnit );
- SvxFontHeightItem aFntHeightItem( nNewHeight, static_cast<const SvxFontHeightItem*>(pItem)->GetProp(), aFntHeightIems[i] );
+ SvxFontHeightItem aFntHeightItem( nNewHeight, 100, aFntHeightIems[i] );
+ aFntHeightItem.SetProp(
+ static_cast<const SvxFontHeightItem*>(pItem)->GetProp(),
+ static_cast<const SvxFontHeightItem*>(pItem)->GetPropUnit());
rSet.GetAttrSet().Put( aFntHeightItem );
}
}
commit 63c48a7e0e3debec16dfc7cd04e7eca4c6fbe0ea
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Tue Nov 11 19:36:27 2014 +0100
Fix SvxFontHeightItem::operator=
...and remove thus unused SetHeightValue
Change-Id: I9c8c18614233df6086ff23533e7e7129848f42ef
diff --git a/include/editeng/fhgtitem.hxx b/include/editeng/fhgtitem.hxx
index 3ff3e64..2ea466f 100644
--- a/include/editeng/fhgtitem.hxx
+++ b/include/editeng/fhgtitem.hxx
@@ -66,8 +66,10 @@ public:
inline SvxFontHeightItem& operator=(const SvxFontHeightItem& rSize)
{
- SetHeightValue( rSize.GetHeight() );
- SetProp( rSize.GetProp(), ePropUnit );
+ DBG_ASSERT( GetRefCount() == 0, "SetValue() with pooled item" );
+ nHeight = rSize.nHeight;
+ nProp = rSize.nProp;
+ ePropUnit = rSize.ePropUnit;
return *this;
}
@@ -79,12 +81,6 @@ public:
sal_uInt32 GetHeight() const { return nHeight; }
- void SetHeightValue( sal_uInt32 nNewHeight )
- {
- DBG_ASSERT( GetRefCount() == 0, "SetValue() with pooled item" );
- nHeight = nNewHeight;
- }
-
void SetProp( const sal_uInt16 nNewProp,
SfxMapUnit eUnit = SFX_MAPUNIT_RELATIVE )
{
commit 2a68ed19e8f35909e5dba691f9552099eae3162f
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Tue Nov 11 19:18:12 2014 +0100
Revert "Some SvxFontHeightItem clean-up"
This reverts commit d5f93eb47ec4c27e93ad908b0199790c702491a0,
SvxFontHeightItem::SetProp was used to override "dummy" 100% nProp/ePropUnit
values that did not match the computed nHeight value with nProp/ePropUnit values
that are supposed to match the computed nHeight value. Yuck.
Change-Id: Ic12e824054b3c5da7aca766b9b3eb076d1837d9a
diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx
index 56be239..4a2bbd8 100644
--- a/editeng/source/items/textitem.cxx
+++ b/editeng/source/items/textitem.cxx
@@ -723,12 +723,7 @@ SvxFontHeightItem::SvxFontHeightItem( const sal_uLong nSz,
SetHeight( nSz,nPrp ); // calculate in percentage
}
-SvxFontHeightItem::SvxFontHeightItem(
- sal_uInt16 wid, sal_uInt32 height, sal_uInt16 prop, SfxMapUnit propUnit):
- SfxPoolItem(wid)
-{
- SetHeight(height, prop, propUnit);
-}
+
SfxPoolItem* SvxFontHeightItem::Clone( SfxItemPool * ) const
{
@@ -776,8 +771,8 @@ SfxPoolItem* SvxFontHeightItem::Create( SvStream& rStrm,
if( FONTHEIGHT_UNIT_VERSION <= nVersion )
rStrm.ReadUInt16( nPropUnit );
- SvxFontHeightItem* pItem = new SvxFontHeightItem(
- Which(), nsize, nprop, (SfxMapUnit)nPropUnit );
+ SvxFontHeightItem* pItem = new SvxFontHeightItem( nsize, 100, Which() );
+ pItem->SetProp( nprop, (SfxMapUnit)nPropUnit );
return pItem;
}
diff --git a/forms/source/richtext/rtattributehandler.cxx b/forms/source/richtext/rtattributehandler.cxx
index 688068c..c9b90c0 100644
--- a/forms/source/richtext/rtattributehandler.cxx
+++ b/forms/source/richtext/rtattributehandler.cxx
@@ -336,9 +336,8 @@ namespace frm
).Height();
}
- SvxFontHeightItem* pNewItem = new SvxFontHeightItem(
- getWhich(), nHeight, pFontHeightItem->GetProp(),
- pFontHeightItem->GetPropUnit() );
+ SvxFontHeightItem* pNewItem = new SvxFontHeightItem( nHeight, 100, getWhich() );
+ pNewItem->SetProp( pFontHeightItem->GetProp(), pFontHeightItem->GetPropUnit() );
aState.setItem( pNewItem );
}
@@ -365,9 +364,8 @@ namespace frm
).Height();
}
- SvxFontHeightItem aNewItem(
- getWhich(), nHeight, pFontHeightItem->GetProp(),
- pFontHeightItem->GetPropUnit() );
+ SvxFontHeightItem aNewItem( nHeight, 100, getWhich() );
+ aNewItem.SetProp( pFontHeightItem->GetProp(), pFontHeightItem->GetPropUnit() );
if ( ( getAttributeId() == SID_ATTR_CHAR_FONTHEIGHT ) && _nForScriptType )
putItemForScript( _rNewAttribs, aNewItem, _nForScriptType );
diff --git a/include/editeng/fhgtitem.hxx b/include/editeng/fhgtitem.hxx
index a52da18..3ff3e64 100644
--- a/include/editeng/fhgtitem.hxx
+++ b/include/editeng/fhgtitem.hxx
@@ -47,10 +47,6 @@ public:
SvxFontHeightItem( const sal_uLong nSz /*= 240*/, const sal_uInt16 nPropHeight /*= 100*/,
const sal_uInt16 nId );
- SvxFontHeightItem(
- sal_uInt16 wid, sal_uInt32 height, sal_uInt16 prop,
- SfxMapUnit propUnit);
-
// "pure virtual Methods" from SfxPoolItem
virtual bool operator==( const SfxPoolItem& ) const SAL_OVERRIDE;
virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const SAL_OVERRIDE;
@@ -70,10 +66,8 @@ public:
inline SvxFontHeightItem& operator=(const SvxFontHeightItem& rSize)
{
- DBG_ASSERT( GetRefCount() == 0, "SetValue() with pooled item" );
- nHeight = rSize.nHeight;
- nProp = rSize.nProp;
- ePropUnit = rSize.ePropUnit;
+ SetHeightValue( rSize.GetHeight() );
+ SetProp( rSize.GetProp(), ePropUnit );
return *this;
}
@@ -85,6 +79,20 @@ public:
sal_uInt32 GetHeight() const { return nHeight; }
+ void SetHeightValue( sal_uInt32 nNewHeight )
+ {
+ DBG_ASSERT( GetRefCount() == 0, "SetValue() with pooled item" );
+ nHeight = nNewHeight;
+ }
+
+ void SetProp( const sal_uInt16 nNewProp,
+ SfxMapUnit eUnit = SFX_MAPUNIT_RELATIVE )
+ {
+ DBG_ASSERT( GetRefCount() == 0, "SetValue() with pooled item" );
+ nProp = nNewProp;
+ ePropUnit = eUnit;
+ }
+
sal_uInt16 GetProp() const { return nProp; }
SfxMapUnit GetPropUnit() const { return ePropUnit; } // Percent, Twip, ...
commit 88a40e70fe921680ed303b8ab69ca866ae67078e
Author: Richard PALO <richard at NetBSD.org>
Date: Sun Nov 9 18:15:45 2014 +0100
O_RDWR and O_CREAT are defined in fcntl.h
Change-Id: I568ee2c3f103777720f6c39340a5915b10aeebb4
Signed-off-by: Michael Stahl <mstahl at redhat.com>
diff --git a/shell/source/unix/sysshell/recently_used_file.cxx b/shell/source/unix/sysshell/recently_used_file.cxx
index 2189d0b..08f96a3 100644
--- a/shell/source/unix/sysshell/recently_used_file.cxx
+++ b/shell/source/unix/sysshell/recently_used_file.cxx
@@ -27,7 +27,7 @@
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
-
+#include <fcntl.h>
#include <unistd.h>
const OUString RECENTLY_USED_FILE_NAME(".recently-used");
commit 457105c7d9ede7a4d73d69d1c87306e88d57c0ac
Author: Richard PALO <richard at NetBSD.org>
Date: Mon Nov 10 17:45:39 2014 +0100
update solaris directories being referenced
also borrowed from Gabriele Bulfon <gabriele.bulfon at sonicle.com>
Change-Id: I17787fbbf12f1bc8b3e78b8dd2e8b33679bab5b1
Signed-off-by: Michael Stahl <mstahl at redhat.com>
diff --git a/sysui/CustomTarget_solaris.mk b/sysui/CustomTarget_solaris.mk
index 9f671a8..ed264fe 100644
--- a/sysui/CustomTarget_solaris.mk
+++ b/sysui/CustomTarget_solaris.mk
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list