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 /basegfx | |
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
Diffstat (limited to 'basegfx')
-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 |
3 files changed, 195 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: */ |