diff options
author | Thorsten Behrens <tbehrens@suse.com> | 2012-01-31 00:52:50 +0100 |
---|---|---|
committer | Thorsten Behrens <tbehrens@suse.com> | 2013-10-07 17:33:45 +0200 |
commit | 3e2dba1accbd018f7dac362a2636bed135f1b5bb (patch) | |
tree | f9999b443935eb2f11f8655713f0a47af569cfc1 | |
parent | 60ff4fa99654e9c2ad9a9b023dae0ccda75d7d95 (diff) |
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
-rw-r--r-- | basegfx/Library_basegfx.mk | 1 | ||||
-rw-r--r-- | basegfx/source/polygon/b2dpolypolygontools.cxx | 133 | ||||
-rw-r--r-- | basegfx/source/tools/numbertools.cxx | 61 | ||||
-rw-r--r-- | include/basegfx/polygon/b2dpolypolygontools.hxx | 20 | ||||
-rw-r--r-- | include/basegfx/tools/tools.hxx | 25 |
5 files changed, 240 insertions, 0 deletions
diff --git a/basegfx/Library_basegfx.mk b/basegfx/Library_basegfx.mk index 892d0a920318..5956d6ee18e2 100644 --- a/basegfx/Library_basegfx.mk +++ b/basegfx/Library_basegfx.mk @@ -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 \ diff --git a/basegfx/source/polygon/b2dpolypolygontools.cxx b/basegfx/source/polygon/b2dpolypolygontools.cxx index b7db01c29e28..902b39a72548 100644 --- a/basegfx/source/polygon/b2dpolypolygontools.cxx +++ b/basegfx/source/polygon/b2dpolypolygontools.cxx @@ -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 diff --git a/basegfx/source/tools/numbertools.cxx b/basegfx/source/tools/numbertools.cxx new file mode 100644 index 000000000000..6b8543a8eff0 --- /dev/null +++ b/basegfx/source/tools/numbertools.cxx @@ -0,0 +1,61 @@ +/* -*- 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: */ diff --git a/include/basegfx/polygon/b2dpolypolygontools.hxx b/include/basegfx/polygon/b2dpolypolygontools.hxx index 1d138a03b5b7..59f03ff3a63d 100644 --- a/include/basegfx/polygon/b2dpolypolygontools.hxx +++ b/include/basegfx/polygon/b2dpolypolygontools.hxx @@ -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 diff --git a/include/basegfx/tools/tools.hxx b/include/basegfx/tools/tools.hxx index c1fa0940ae35..c9af12b73fcd 100644 --- a/include/basegfx/tools/tools.hxx +++ b/include/basegfx/tools/tools.hxx @@ -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); } } |