Kaydet (Commit) 3e2dba1a authored tarafından Thorsten Behrens's avatar Thorsten Behrens

Add 7-segment display polygon generator to basegfx.

Basegfx gets a basegfx::tools::number2PolyPolygon method that
converts a number 0-9 into a 7-segment digit display polygon.

Change-Id: I4d3326c9fe9e42d07a6248781127f19ac27d8b72
üst 60ff4fa9
...@@ -69,6 +69,7 @@ $(eval $(call gb_Library_add_exception_objects,basegfx,\ ...@@ -69,6 +69,7 @@ $(eval $(call gb_Library_add_exception_objects,basegfx,\
basegfx/source/tools/canvastools \ basegfx/source/tools/canvastools \
basegfx/source/tools/gradienttools \ basegfx/source/tools/gradienttools \
basegfx/source/tools/keystoplerp \ basegfx/source/tools/keystoplerp \
basegfx/source/tools/numbertools \
basegfx/source/tools/tools \ basegfx/source/tools/tools \
basegfx/source/tools/unopolypolygon \ basegfx/source/tools/unopolypolygon \
basegfx/source/tools/unotools \ basegfx/source/tools/unotools \
......
...@@ -515,6 +515,139 @@ namespace basegfx ...@@ -515,6 +515,139 @@ namespace basegfx
return true; return true;
} }
B2DPolyPolygon createSevenSegmentPolyPolygon(sal_Char nNumber, bool bLitSegments)
{
// config here
// {
const double fTotalSize=1.0;
const double fPosMiddleSegment=0.6;
const double fSegmentEndChopHoriz=0.08;
const double fSegmentEndChopVert =0.04;
// }
// config here
const double fLeft=0.0;
const double fRight=fTotalSize;
const double fTop=0.0;
const double fMiddle=fPosMiddleSegment;
const double fBottom=fTotalSize;
// from 0 to 5: pair of segment corner coordinates
//
// segment corner indices are these:
//
// 0 - 1
// | |
// 2 - 3
// | |
// 4 - 5
//
static const double corners[] =
{
fLeft, fTop,
fRight, fTop,
fLeft, fMiddle,
fRight, fMiddle,
fLeft, fBottom,
fRight, fBottom
};
// from 0 to 9: which segments are 'lit' for this number?
//
// array denotes graph edges to traverse, with -1 means
// stop (the vertices are the corner indices from above):
// 0
// -
// 1 | | 2
// - 3
// 4 | | 5
// -
// 6
//
static const int numbers[] =
{
1, 1, 1, 0, 1, 1, 1, // 0
0, 0, 1, 0, 0, 1, 0, // 1
1, 0, 1, 1, 1, 0, 1, // 2
1, 0, 1, 1, 0, 1, 1, // 3
0, 1, 1, 1, 0, 1, 0, // 4
1, 1, 0, 1, 0, 1, 1, // 5
1, 1, 0, 1, 1, 1, 1, // 6
1, 0, 1, 0, 0, 1, 0, // 1
1, 1, 1, 1, 1, 1, 1, // 8
1, 1, 1, 1, 0, 1, 1, // 9
0, 0, 0, 1, 0, 0, 0, // '-'
1, 1, 0, 1, 1, 0, 1, // 'E'
};
// maps segment index to two corner ids:
static const int index2corner[] =
{
0, 2, // 0
0, 4, // 1
2, 6, // 2
4, 6, // 3
4, 8, // 4
6, 10, // 5
8, 10, // 6
};
B2DPolyPolygon aRes;
if( nNumber == '-' )
{
nNumber = 10;
}
else if( nNumber == 'E' )
{
nNumber = 11;
}
else if( nNumber == '.' )
{
if( bLitSegments )
aRes.append(createPolygonFromCircle(B2DPoint(fTotalSize/2, fTotalSize),
fSegmentEndChopHoriz));
return aRes;
}
else
{
nNumber=clamp<sal_uInt32>(nNumber,'0','9') - '0';
}
B2DPolygon aCurrSegment;
const size_t sliceSize=sizeof(numbers)/sizeof(*numbers)/12;
const int* pCurrSegment=numbers + nNumber*sliceSize;
for( size_t i=0; i<sliceSize; i++, pCurrSegment++)
{
if( !(*pCurrSegment ^ bLitSegments) )
{
const size_t j=2*i;
aCurrSegment.clear();
B2DPoint start(corners[index2corner[j]],
corners[index2corner[j]+1] );
B2DPoint end (corners[index2corner[j+1]],
corners[index2corner[j+1]+1]);
if( start.getX() == end.getX() )
{
start.setY(start.getY()+fSegmentEndChopVert);
end.setY(end.getY()-fSegmentEndChopVert);
}
else
{
start.setX(start.getX()+fSegmentEndChopHoriz);
end.setX(end.getX()-fSegmentEndChopHoriz);
}
aCurrSegment.append(start);
aCurrSegment.append(end);
}
aRes.append(aCurrSegment);
}
return aRes;
}
} // end of namespace tools } // end of namespace tools
} // end of namespace basegfx } // end of namespace basegfx
......
/* -*- 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 <basegfx/tools/tools.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/math.hxx>
#include <utility>
namespace basegfx { namespace tools
{
B2DPolyPolygon number2PolyPolygon(double fValue, sal_Int32 nTotalDigits, sal_Int32 nDecPlaces, bool bLitSegments)
{
// config here
// {
const double fSpace=0.2;
// }
// config here
rtl::OUStringBuffer aNum;
rtl::math::doubleToUStringBuffer(aNum,
fValue,
rtl_math_StringFormat_F,
nDecPlaces, '.',
0, ',');
B2DPolyPolygon aRes;
B2DHomMatrix aMat;
double fCurrX=std::max(nTotalDigits-aNum.getLength(),
sal_Int32(0)) * (1.0+fSpace);
for( sal_Int32 i=0; i<aNum.getLength(); ++i )
{
B2DPolyPolygon aCurr;
aCurr=createSevenSegmentPolyPolygon(aNum[i],
bLitSegments);
aMat.identity();
aMat.translate(fCurrX,0.0);
aCurr.transform(aMat);
fCurrX += 1.0+fSpace;
aRes.append(aCurr);
}
return aRes;
}
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -220,6 +220,26 @@ namespace basegfx ...@@ -220,6 +220,26 @@ namespace basegfx
// #i76891# Try to remove existing curve segments if they are simply edges // #i76891# Try to remove existing curve segments if they are simply edges
BASEGFX_DLLPUBLIC B2DPolyPolygon simplifyCurveSegments(const B2DPolyPolygon& rCandidate); BASEGFX_DLLPUBLIC B2DPolyPolygon simplifyCurveSegments(const B2DPolyPolygon& rCandidate);
/** Creates polypolygon for seven-segment display number
This function takes an integer number between 0 and 9 and
convert it into the well-known seven-segment display
number (like most digital clocks show their numbers). The
digit will exactly fit the unit rectangle. The polypolygon
will be a line polygon, i.e. if you need the segment parts
to have width, use createAreaGeometry() on the result.
@param cNumber
Number from '0' to '9' as ASCII char, or '-', 'E' and '.'
to convert to 7 segment code
@param bLitSegments
When true, return a polygon containing the segments that
are 'lit' for the given number. Return un-lit segments
otherwise.
*/
B2DPolyPolygon createSevenSegmentPolyPolygon(sal_Char cNumber, bool bLitSegments=true);
/** snap some polygon coordinates to discrete coordinates /** snap some polygon coordinates to discrete coordinates
This method allows to snap some polygon points to discrete (integer) values This method allows to snap some polygon points to discrete (integer) values
......
...@@ -27,6 +27,7 @@ namespace basegfx ...@@ -27,6 +27,7 @@ namespace basegfx
{ {
class B2DPoint; class B2DPoint;
class B2DRange; class B2DRange;
class B2DPolyPolygon;
namespace tools namespace tools
{ {
...@@ -94,6 +95,30 @@ namespace basegfx ...@@ -94,6 +95,30 @@ namespace basegfx
::basegfx::B2DPoint& io_rRightBottom, ::basegfx::B2DPoint& io_rRightBottom,
const ::basegfx::B2DRange& rFitTarget ); const ::basegfx::B2DRange& rFitTarget );
/** Creates polypolygon with the given number as seven-segment
digits
@param fVal
Value to convert
@param nTotalDigits
Total number of digits to display. If less is needed for
given number, fill space with blanks.
@param nDecPlaces
Decimal places to show. When 0, display as integer. When
negative, fill given number of before-the-decimal point
with zero.
@param bLitSegments
When true, return a polygon containing the segments that
are 'lit' for the given number. Return un-lit segments
otherwise.
*/
BASEGFX_DLLPUBLIC B2DPolyPolygon number2PolyPolygon(double fVal,
sal_Int32 nTotalDigits,
sal_Int32 nDecPlaces,
bool bLitSegments=true);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment