[Libreoffice-commits] core.git: include/svtools svtools/source svx/source
dbeurle
dbeurle at student.unimelb.edu.au
Wed Jan 14 04:50:19 PST 2015
include/svtools/ruler.hxx | 24 +++++
svtools/source/control/ruler.cxx | 168 ++++++++++++++++++++++++---------------
svx/source/dialog/svxruler.cxx | 27 ++++++
3 files changed, 152 insertions(+), 67 deletions(-)
New commits:
commit 8748ae646bd5347ce9b964efbb941a873a7b5e0d
Author: dbeurle <dbeurle at student.unimelb.edu.au>
Date: Mon Jan 12 17:36:02 2015 +1100
HiDPI changes to ruler to respect screen DPI
Change-Id: I4cbb303b395ad60d4935bff55fbaea08f13334a0
Reviewed-on: https://gerrit.libreoffice.org/13867
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
Tested-by: Tomaž Vajngerl <quikee at gmail.com>
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/include/svtools/ruler.hxx b/include/svtools/ruler.hxx
index 06463cf..8667f69 100644
--- a/include/svtools/ruler.hxx
+++ b/include/svtools/ruler.hxx
@@ -555,8 +555,7 @@ struct RulerTab
sal_uInt16 nStyle;
};
-#define RULER_TAB_WIDTH 7
-#define RULER_TAB_HEIGHT 6
+
// - RulerLine -
@@ -600,6 +599,27 @@ struct RulerUnitData
sal_Char aUnitStr[8]; // Unit string
};
+// Data for drawing ruler tabstops
+struct RulerTabData
+{
+ sal_uInt16 DPIScaleFactor;
+ sal_uInt16 width;
+ sal_uInt16 height;
+ sal_uInt16 height2;
+ sal_uInt16 width2;
+ sal_uInt16 cwidth;
+ sal_uInt16 cwidth2;
+ sal_uInt16 cwidth3;
+ sal_uInt16 cwidth4;
+ sal_uInt16 dheight;
+ sal_uInt16 dheight2;
+ sal_uInt16 dwidth;
+ sal_uInt16 dwidth2;
+ sal_uInt16 dwidth3;
+ sal_uInt16 dwidth4;
+ sal_uInt16 textoff;
+};
+
// - Ruler -
class ImplRulerData;
diff --git a/svtools/source/control/ruler.cxx b/svtools/source/control/ruler.cxx
index fa16f47..96b6aa0 100644
--- a/svtools/source/control/ruler.cxx
+++ b/svtools/source/control/ruler.cxx
@@ -39,25 +39,11 @@ using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::accessibility;
#define RULER_OFF 3
-#define RULER_TEXTOFF 5
#define RULER_RESIZE_OFF 4
#define RULER_MIN_SIZE 3
#define RULER_VAR_SIZE 8
-#define RULER_TAB_HEIGHT2 2
-#define RULER_TAB_WIDTH2 2
-#define RULER_TAB_CWIDTH 8
-#define RULER_TAB_CWIDTH2 4
-#define RULER_TAB_CWIDTH3 4
-#define RULER_TAB_CWIDTH4 2
-#define RULER_TAB_DHEIGHT 4
-#define RULER_TAB_DHEIGHT2 1
-#define RULER_TAB_DWIDTH 5
-#define RULER_TAB_DWIDTH2 3
-#define RULER_TAB_DWIDTH3 3
-#define RULER_TAB_DWIDTH4 1
-
#define RULER_UPDATE_LINES 0x01
#define RULER_UPDATE_DRAW 0x02
@@ -207,6 +193,26 @@ static const RulerUnitData aImplRulerUnitTab[RULER_UNIT_COUNT] =
{ MAP_100TH_MM, 551, 551.0, 551.0, 551.0, 1102.0, 551, 3, " li" } // LINE
};
+static RulerTabData ruler_tab =
+{
+ 0, // DPIScaleFactor to be set
+ 7, // ruler_tab_width
+ 6, // ruler_tab_height
+ 2, // ruler_tab_height2
+ 2, // ruler_tab_width2
+ 8, // ruler_tab_cwidth
+ 4, // ruler_tab_cwidth2
+ 4, // ruler_tab_cwidth3
+ 2, // ruler_tab_cwidth4
+ 4, // ruler_tab_dheight
+ 1, // ruler_tab_dheight2
+ 5, // ruler_tab_dwidth
+ 3, // ruler_tab_dwidth2
+ 3, // ruler_tab_dwidth3
+ 1, // ruler_tab_dwidth4
+ 5 // ruler_tab_textoff
+};
+
void Ruler::ImplInit( WinBits nWinBits )
{
// Default WinBits setzen
@@ -219,7 +225,7 @@ void Ruler::ImplInit( WinBits nWinBits )
EnableRTL( false );
}
- // Variablen initialisieren
+ // Initialize variables
mnWinStyle = nWinBits; // Window-Style
mnBorderOff = 0; // Border-Offset
mnWinOff = 0; // EditWinOffset
@@ -270,7 +276,7 @@ void Ruler::ImplInit( WinBits nWinBits )
// Setup the default size
Rectangle aRect;
GetTextBoundRect( aRect, OUString( "0123456789" ) );
- long nDefHeight = aRect.GetHeight() + RULER_OFF * 2 + RULER_TEXTOFF * 2 + mnBorderWidth;
+ long nDefHeight = aRect.GetHeight() + RULER_OFF * 2 + ruler_tab.textoff * 2 + mnBorderWidth;
Size aDefSize;
if ( nWinBits & WB_HORZ )
@@ -290,7 +296,32 @@ Ruler::Ruler( vcl::Window* pParent, WinBits nWinStyle ) :
mpData(NULL),
mpDragData(new ImplRulerData)
{
+
+ // Check to see if the ruler constructor has
+ // already been called before otherwise
+ // we end up with over-scaled elements
+ if( ruler_tab.DPIScaleFactor == 0 )
+ {
+ ruler_tab.DPIScaleFactor = pParent->GetDPIScaleFactor();
+ ruler_tab.width *= ruler_tab.DPIScaleFactor;
+ ruler_tab.height *= ruler_tab.DPIScaleFactor;
+ ruler_tab.height2 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.width2 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.cwidth *= ruler_tab.DPIScaleFactor;
+ ruler_tab.cwidth2 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.cwidth3 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.cwidth4 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dheight *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dheight2 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dwidth *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dwidth2 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dwidth3 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.dwidth4 *= ruler_tab.DPIScaleFactor;
+ ruler_tab.textoff *= ruler_tab.DPIScaleFactor;
+ }
+
ImplInit( nWinStyle );
+
}
Ruler::~Ruler()
@@ -432,7 +463,7 @@ void Ruler::ImplDrawTicks( long nMin, long nMax, long nStart, long nTop, long nB
{
double nCenter = nTop + ((nBottom - nTop) / 2);
- long nTickLength3 = (nBottom - nTop) * 0.5;
+ long nTickLength3 = (nBottom - nTop) * 0.5 * ruler_tab.DPIScaleFactor;
long nTickLength2 = nTickLength3 * 0.66;
long nTickLength1 = nTickLength2 * 0.66;
@@ -495,7 +526,7 @@ void Ruler::ImplDrawTicks( long nMin, long nMax, long nStart, long nTop, long nB
const long nTextOff = 4;
// Determine the number divider for ruler drawn numbers - means which numbers
- // should be shown on the ruler and which should be skipped because the ruller
+ // should be shown on the ruler and which should be skipped because the ruler
// is not big enough to draw them
if ( nTickWidth < nTxtWidth + nTextOff )
{
@@ -599,8 +630,10 @@ void Ruler::ImplDrawTicks( long nMin, long nMax, long nStart, long nTop, long nB
if(nMin < nHorizontalLocation && nHorizontalLocation < nMax)
{
- ImplVDrawLine(nHorizontalLocation, nBottom, nHorizontalLocation, nBottom - 1);
- ImplVDrawLine(nHorizontalLocation, nTop, nHorizontalLocation, nTop + 1);
+ ImplVDrawLine(nHorizontalLocation, nBottom, nHorizontalLocation,
+ nBottom - 1 * ruler_tab.DPIScaleFactor);
+ ImplVDrawLine(nHorizontalLocation, nTop, nHorizontalLocation,
+ nTop + 1 * ruler_tab.DPIScaleFactor);
}
nHorizontalLocation = nStart - n;
@@ -608,8 +641,10 @@ void Ruler::ImplDrawTicks( long nMin, long nMax, long nStart, long nTop, long nB
if(nMin < nHorizontalLocation && nHorizontalLocation < nMax)
{
- ImplVDrawLine( nHorizontalLocation, nBottom, nHorizontalLocation, nBottom - 1 );
- ImplVDrawLine( nHorizontalLocation, nTop, nHorizontalLocation, nTop + 1 );
+ ImplVDrawLine( nHorizontalLocation, nBottom, nHorizontalLocation,
+ nBottom - 1 * ruler_tab.DPIScaleFactor );
+ ImplVDrawLine( nHorizontalLocation, nTop, nHorizontalLocation,
+ nTop + 1 * ruler_tab.DPIScaleFactor );
}
}
// Tick/Tick2 - Output (Strokes)
@@ -837,17 +872,17 @@ static void ImplCenterTabPos( Point& rPos, sal_uInt16 nTabStyle )
{
bool bRTL = 0 != (nTabStyle & RULER_TAB_RTL);
nTabStyle &= RULER_TAB_STYLE;
- rPos.Y() += RULER_TAB_HEIGHT/2;
+ rPos.Y() += ruler_tab.height/2;
if ( (!bRTL && nTabStyle == RULER_TAB_LEFT) ||
( bRTL && nTabStyle == RULER_TAB_RIGHT) )
{
- rPos.X() -= RULER_TAB_WIDTH / 2;
+ rPos.X() -= ruler_tab.width / 2;
}
else if ( (!bRTL && nTabStyle == RULER_TAB_RIGHT) ||
( bRTL && nTabStyle == RULER_TAB_LEFT) )
{
- rPos.X() += RULER_TAB_WIDTH / 2;
+ rPos.X() += ruler_tab.width / 2;
}
}
@@ -879,6 +914,11 @@ static void ImplDrawRulerTab( OutputDevice* pDevice, const Point& rPos,
sal_uInt16 nTabStyle = nStyle & RULER_TAB_STYLE;
bool bRTL = 0 != (nStyle & RULER_TAB_RTL);
+ // Scale by the screen DPI scaling factor
+ // However when doing this some of the rectangles
+ // drawn become asymmetric due to the +1 offsets
+ sal_uInt16 DPIOffset = pDevice->GetDPIScaleFactor() - 1;
+
Rectangle aRect1;
Rectangle aRect2;
Rectangle aRect3;
@@ -887,59 +927,59 @@ static void ImplDrawRulerTab( OutputDevice* pDevice, const Point& rPos,
if ( nTabStyle == RULER_TAB_DEFAULT )
{
- aRect1.Left() = rPos.X() - RULER_TAB_DWIDTH2 + 1;
- aRect1.Top() = rPos.Y() - RULER_TAB_DHEIGHT2 + 1;
- aRect1.Right() = rPos.X() - RULER_TAB_DWIDTH2 + RULER_TAB_DWIDTH;
+ aRect1.Left() = rPos.X() - ruler_tab.dwidth2 + 1;
+ aRect1.Top() = rPos.Y() - ruler_tab.dheight2 + 1;
+ aRect1.Right() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth + DPIOffset;
aRect1.Bottom() = rPos.Y();
- aRect2.Left() = rPos.X() - RULER_TAB_DWIDTH2 + RULER_TAB_DWIDTH3;
- aRect2.Top() = rPos.Y() - RULER_TAB_DHEIGHT + 1;
- aRect2.Right() = rPos.X() - RULER_TAB_DWIDTH2 + RULER_TAB_DWIDTH3 + RULER_TAB_DWIDTH4 - 1;
+ aRect2.Left() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth3;
+ aRect2.Top() = rPos.Y() - ruler_tab.dheight + 1;
+ aRect2.Right() = rPos.X() - ruler_tab.dwidth2 + ruler_tab.dwidth3 + ruler_tab.dwidth4 - 1;
aRect2.Bottom() = rPos.Y();
}
else if ( (!bRTL && nTabStyle == RULER_TAB_LEFT) || ( bRTL && nTabStyle == RULER_TAB_RIGHT))
{
aRect1.Left() = rPos.X();
- aRect1.Top() = rPos.Y() - RULER_TAB_HEIGHT2 + 1;
- aRect1.Right() = rPos.X() + RULER_TAB_WIDTH - 1;
+ aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
+ aRect1.Right() = rPos.X() + ruler_tab.width - 1;
aRect1.Bottom() = rPos.Y();
aRect2.Left() = rPos.X();
- aRect2.Top() = rPos.Y() - RULER_TAB_HEIGHT + 1;
- aRect2.Right() = rPos.X() + RULER_TAB_WIDTH2 - 1;
+ aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
+ aRect2.Right() = rPos.X() + ruler_tab.width2 - 1;
aRect2.Bottom() = rPos.Y();
}
else if ( (!bRTL && nTabStyle == RULER_TAB_RIGHT) ||( bRTL && nTabStyle == RULER_TAB_LEFT))
{
- aRect1.Left() = rPos.X() - RULER_TAB_WIDTH + 1;
- aRect1.Top() = rPos.Y() - RULER_TAB_HEIGHT2 + 1;
+ aRect1.Left() = rPos.X() - ruler_tab.width + 1;
+ aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
aRect1.Right() = rPos.X();
aRect1.Bottom() = rPos.Y();
- aRect2.Left() = rPos.X() - RULER_TAB_WIDTH2 + 1;
- aRect2.Top() = rPos.Y() - RULER_TAB_HEIGHT + 1;
+ aRect2.Left() = rPos.X() - ruler_tab.width2 + 1;
+ aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
aRect2.Right() = rPos.X();
aRect2.Bottom() = rPos.Y();
}
else
{
- aRect1.Left() = rPos.X() - RULER_TAB_CWIDTH2 + 1;
- aRect1.Top() = rPos.Y() - RULER_TAB_HEIGHT2 + 1;
- aRect1.Right() = rPos.X() - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH;
+ aRect1.Left() = rPos.X() - ruler_tab.cwidth2 + 1;
+ aRect1.Top() = rPos.Y() - ruler_tab.height2 + 1;
+ aRect1.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth + DPIOffset;
aRect1.Bottom() = rPos.Y();
- aRect2.Left() = rPos.X() - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH3;
- aRect2.Top() = rPos.Y() - RULER_TAB_HEIGHT + 1;
- aRect2.Right() = rPos.X() - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH3 + RULER_TAB_CWIDTH4 - 1;
+ aRect2.Left() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth3;
+ aRect2.Top() = rPos.Y() - ruler_tab.height + 1;
+ aRect2.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth3 + ruler_tab.cwidth4 - 1;
aRect2.Bottom() = rPos.Y();
if ( nTabStyle == RULER_TAB_DECIMAL )
{
- aRect3.Left() = rPos.X() - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH - 1;
- aRect3.Top() = rPos.Y() - RULER_TAB_HEIGHT + 1 + 1;
- aRect3.Right() = rPos.X() - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH;
- aRect3.Bottom() = rPos.Y() - RULER_TAB_HEIGHT + 1 + 2 ;
+ aRect3.Left() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth - 1;
+ aRect3.Top() = rPos.Y() - ruler_tab.height + 1 + 1 - DPIOffset;
+ aRect3.Right() = rPos.X() - ruler_tab.cwidth2 + ruler_tab.cwidth + DPIOffset;
+ aRect3.Bottom() = rPos.Y() - ruler_tab.height + 1 + 2;
}
}
if( 0 == (nWinBits & WB_HORZ) )
@@ -1468,7 +1508,7 @@ bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
// so that leftover tabs and indents are taken into account
long nXExtraOff;
if ( !mpData->pTabs.empty() || !mpData->pIndents.empty() )
- nXExtraOff = (mnVirHeight/2) - 4;
+ nXExtraOff = (mnVirHeight / 2) - 4;
else
nXExtraOff = 0;
@@ -1494,7 +1534,7 @@ bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
if ( !mpData->pTabs.empty() )
{
aRect.Bottom() = nHitBottom;
- aRect.Top() = aRect.Bottom() - RULER_TAB_HEIGHT-RULER_OFF;
+ aRect.Top() = aRect.Bottom() - ruler_tab.height - RULER_OFF;
for ( i = mpData->pTabs.size() - 1; i >= 0; i-- )
{
@@ -1511,17 +1551,17 @@ bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
if ( nStyle == RULER_TAB_LEFT )
{
aRect.Left() = n1;
- aRect.Right() = n1 + RULER_TAB_WIDTH - 1;
+ aRect.Right() = n1 + ruler_tab.width - 1;
}
else if ( nStyle == RULER_TAB_RIGHT )
{
aRect.Right() = n1;
- aRect.Left() = n1 - RULER_TAB_WIDTH - 1;
+ aRect.Left() = n1 - ruler_tab.width - 1;
}
else
{
- aRect.Left() = n1 - RULER_TAB_CWIDTH2 + 1;
- aRect.Right() = n1 - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH;
+ aRect.Left() = n1 - ruler_tab.cwidth2 + 1;
+ aRect.Right() = n1 - ruler_tab.cwidth2 + ruler_tab.cwidth;
}
if ( aRect.IsInside( Point( nX, nY ) ) )
@@ -1538,8 +1578,8 @@ bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
// Indents
if ( !mpData->pIndents.empty() )
{
- long nIndentHeight = (mnVirHeight/2) - 1;
- long nIndentWidth2 = nIndentHeight-3;
+ long nIndentHeight = (mnVirHeight / 2) - 1;
+ long nIndentWidth2 = nIndentHeight - 3;
for ( i = mpData->pIndents.size(); i; i-- )
{
@@ -1703,17 +1743,17 @@ bool Ruler::ImplHitTest( const Point& rPos, RulerSelection* pHitTest,
if ( nStyle == RULER_TAB_LEFT )
{
aRect.Left() = n1;
- aRect.Right() = n1 + RULER_TAB_WIDTH - 1;
+ aRect.Right() = n1 + ruler_tab.width - 1;
}
else if ( nStyle == RULER_TAB_RIGHT )
{
aRect.Right() = n1;
- aRect.Left() = n1 - RULER_TAB_WIDTH - 1;
+ aRect.Left() = n1 - ruler_tab.width - 1;
}
else
{
- aRect.Left() = n1 - RULER_TAB_CWIDTH2 + 1;
- aRect.Right() = n1 - RULER_TAB_CWIDTH2 + RULER_TAB_CWIDTH;
+ aRect.Left() = n1 - ruler_tab.cwidth2 + 1;
+ aRect.Right() = n1 - ruler_tab.cwidth2 + ruler_tab.cwidth;
}
aRect.Left()--;
@@ -2156,7 +2196,7 @@ void Ruler::Resize()
if ( nNewHeight )
{
mbCalc = true;
- mnVirHeight = nNewHeight - mnBorderWidth - (RULER_OFF*2);
+ mnVirHeight = nNewHeight - mnBorderWidth - ( RULER_OFF * 2 );
}
else
{
@@ -2192,9 +2232,9 @@ void Ruler::Resize()
aRect.Top() = mnHeight-RULER_RESIZE_OFF;
else
aRect.Top() = aWinSize.Height()-RULER_RESIZE_OFF;
- aRect.Bottom() = aRect.Top()+RULER_RESIZE_OFF;
+ aRect.Bottom() = aRect.Top() + RULER_RESIZE_OFF;
aRect.Left() = RULER_OFF;
- aRect.Right() = RULER_OFF+mnVirHeight;
+ aRect.Right() = RULER_OFF + mnVirHeight;
}
Invalidate( aRect );
diff --git a/svx/source/dialog/svxruler.cxx b/svx/source/dialog/svxruler.cxx
index b869689..39ae343 100644
--- a/svx/source/dialog/svxruler.cxx
+++ b/svx/source/dialog/svxruler.cxx
@@ -157,6 +157,26 @@ struct SvxRuler_Impl {
};
+static RulerTabData ruler_tab_svx =
+{
+ 0, // DPIScaleFactor to be set
+ 7, // ruler_tab_width
+ 6, // ruler_tab_height
+ 0, // ruler_tab_height2
+ 0, // ruler_tab_width2
+ 0, // ruler_tab_cwidth
+ 0, // ruler_tab_cwidth2
+ 0, // ruler_tab_cwidth3
+ 0, // ruler_tab_cwidth4
+ 0, // ruler_tab_dheight
+ 0, // ruler_tab_dheight2
+ 0, // ruler_tab_dwidth
+ 0, // ruler_tab_dwidth2
+ 0, // ruler_tab_dwidth3
+ 0, // ruler_tab_dwidth4
+ 0 // ruler_tab_textoff
+};
+
void SvxRuler_Impl::SetPercSize(sal_uInt16 nSize)
{
if(nSize > nPercSize)
@@ -312,6 +332,11 @@ SvxRuler::SvxRuler(
SetExtraType(RULER_EXTRA_NULLOFFSET, 0);
rBindings.LeaveRegistrations();
+
+ ruler_tab_svx.DPIScaleFactor = pParent->GetDPIScaleFactor();
+ ruler_tab_svx.height *= ruler_tab_svx.DPIScaleFactor;
+ ruler_tab_svx.width *= ruler_tab_svx.DPIScaleFactor;
+
}
SvxRuler::~SvxRuler()
@@ -3421,7 +3446,7 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent )
PopupMenu aMenu;
aMenu.SetSelectHdl(LINK(this, SvxRuler, TabMenuSelect));
VirtualDevice aDev;
- const Size aSz(RULER_TAB_WIDTH + 2, RULER_TAB_HEIGHT + 2);
+ const Size aSz(ruler_tab_svx.width + 2, ruler_tab_svx.height + 2);
aDev.SetOutputSize(aSz);
aDev.SetBackground(Wallpaper(Color(COL_WHITE)));
Color aFillColor(aDev.GetSettings().GetStyleSettings().GetShadowColor());
More information about the Libreoffice-commits
mailing list