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,\
basegfx/source/tools/canvastools \
basegfx/source/tools/gradienttools \
basegfx/source/tools/keystoplerp \
basegfx/source/tools/numbertools \
basegfx/source/tools/tools \
basegfx/source/tools/unopolypolygon \
basegfx/source/tools/unotools \
......
......@@ -515,6 +515,139 @@ namespace basegfx
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 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
// #i76891# Try to remove existing curve segments if they are simply edges
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
This method allows to snap some polygon points to discrete (integer) values
......
......@@ -27,6 +27,7 @@ namespace basegfx
{
class B2DPoint;
class B2DRange;
class B2DPolyPolygon;
namespace tools
{
......@@ -94,6 +95,30 @@ namespace basegfx
::basegfx::B2DPoint& io_rRightBottom,
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